Currying add(1)(2)(3)
type TypeFunAdd = (...arg: number[]) => TypeFunAdd;
function add(...arg: number[]) {
const f: TypeFunAdd = add.bind(null, ...arg);
f.toString = () => arg.reduce((sum, i) => sum + i, 0).toString();
return f;
}
add(1)(2)(3); // 6
type TypeFunAdd = (...arg: number[]) => TypeFunAdd;
function add(...arg: number[]) {
const f: TypeFunAdd = add.bind(null, ...arg);
f.toString = () => arg.reduce((sum, i) => sum + i, 0).toString();
return f;
}
add(1)(2)(3); // 6
Math.sqrt() implemented using Newton’s method
function mySqrt(x: number) {
const precision = 0.1;
let ans = x / 2,
last;
do {
last = ans;
ans = (ans + x / ans) / 2;
} while (Math.abs(ans - last) > precision);
return ans >> 0;
}
function mySqrt(x: number) {
const precision = 0.1;
let ans = x / 2,
last;
do {
last = ans;
ans = (ans + x / ans) / 2;
} while (Math.abs(ans - last) > precision);
return ans >> 0;
}
Typescript: Range<0, 100>
type Max<
N,
A extends number[] = [0],
B extends number[] = [],
> = B["length"] extends N ? B[number] : Max<N, [...A, 0], [...B, A["length"]]>;
type Min<N, A extends number[] = []> = A["length"] extends N
? A[number]
: Min<N, [...A, A["length"]]>;
type Range<min, max> = Exclude<Max<max>, Min<min>>;
type t100_200 = Range<0, 100>;
type Max<
N,
A extends number[] = [0],
B extends number[] = [],
> = B["length"] extends N ? B[number] : Max<N, [...A, 0], [...B, A["length"]]>;
type Min<N, A extends number[] = []> = A["length"] extends N
? A[number]
: Min<N, [...A, A["length"]]>;
type Range<min, max> = Exclude<Max<max>, Min<min>>;
type t100_200 = Range<0, 100>;