export class ArgumentError extends Error {} export class InfiniteLoopError extends Error {} export type Omit = Pick>; export type Include = Exclude>; // Taken from https://stackoverflow.com/a/53985533/5490505 // export type TupleUnshift = ((a: A, ...r: ForcedTuple) => void) extends ( // ...a: infer R // ) => any // ? R // : never; // type ForcedTuple = T extends [ // infer A, // infer B, // infer C, // infer D, // infer E, // infer F, // infer G, // infer H, // infer I, // infer J, // infer K, // infer L, // infer M, // infer N, // infer O, // infer P, // infer Q, // infer R, // infer S, // infer T, // infer U, // infer V, // infer W, // infer X, // infer Y, // infer Z // ] // ? [A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z] // : T; export function numberSortComparer(a: number, b: number) { if (a > b) { return 1; } else if (b > a) { return -1; } else { return 0; } } export function freqToGranularity(freq: string) { switch (freq) { case 'YEARLY': return 'year'; case 'MONTHLY': return 'month'; case 'WEEKLY': return 'week'; case 'DAILY': return 'day'; case 'HOURLY': return 'hour'; case 'MINUTELY': return 'minute'; case 'SECONDLY': return 'second'; default: return 'millisecond'; } } export function cloneJSON(json: T): T { return JSON.parse(JSON.stringify(json)); }