export const now = () => Math.round(Date.now() / 1000) export const nth = (i: number) => (xs: T[]) => xs[i] export const first = (xs: T[]) => xs[0] export const last = (xs: T[]) => xs[xs.length - 1] export const identity = (x: T) => x export const between = (low: number, high: number, n: number) => n > low && n < high export const flatten = (xs: T[]) => xs.flatMap(identity) export const uniq = (xs: T[]) => Array.from(new Set(xs)) export const shuffle = (xs: T[]): T[] => xs.sort(() => Math.random() > 0.5 ? 1 : -1) export const isIterable = (x: any) => Symbol.iterator in Object(x) export const toIterable = (x: any) => isIterable(x) ? x : [x] export const stripProtocol = (url: string) => url.replace(/.*:\/\//, "") // https://github.com/microsoft/TypeScript/issues/4628#issuecomment-1147905253 export type OmitStatics = T extends {new(...args: infer A): infer R} ? {new(...args: A): R}&Omit : Omit; // https://github.com/microsoft/TypeScript/issues/4628#issuecomment-1147905253 export type OmitAllStatics = T extends {new(...args: infer A): infer R, prototype: infer P} ? {new(...args: A): R, prototype: P} : never;