export const identity = (x: T): T => x; export const defined = (x: T | undefined | null): x is T => x !== undefined && x !== null; export const instanciate = (C: new (arg: A) => T): (arg: A) => T => { return (arg: A): T => new C(arg); }; export const get = , K extends PropertyKey>( key: K, ): (obj: T) => T[K] => (obj: T): T[K] => obj[key]; export const getCall = < T extends Record unknown>, K extends PropertyKey, >( key: K, ...args: Parameters ): (obj: T) => ReturnType => (obj: T): ReturnType => obj[key](...args) as ReturnType; export const pass = (fn: (x: T) => void): (x: T) => T => (x: T): T => { fn(x); return x; }; export const equal = (x: T): (y: T) => boolean => (y: T): boolean => x === y; export const extremeBy = (arr: number[], mode: "max" | "min"): number => Math[mode](...arr);