UNPKG

effi-find

Version:

Creates a function to choose an Item from a list in O(1)

45 lines (44 loc) 1.47 kB
export type BaseKeyType = string | symbol | number; export type Indexes = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, -1 ]; export type Range<T> = [KeysOfType<T, number>, KeysOfType<T, number>, number]; export type ChooseMapper<T> = keyof T | Range<T>; export type KeysOfType<T, V> = { [K in keyof T]-?: T[K] extends V ? K : never; }[keyof T]; export type ToObjectChainValueOf<T, K extends ChooseMapper<T>> = K extends keyof T ? T[K] : K extends Range<T> ? number : never; export type ItemType<T> = T extends Iterable<infer R> ? R : never; export type ChooserParams<Arr extends Array<ChooseMapper<V>>, V, R = V[], Pos extends number = 0> = { done: []; any: any[]; recur: ToObjectChainValueOf<V, Arr[Pos]> extends BaseKeyType ? [ ToObjectChainValueOf<V, Arr[Pos]>, ...ChooserParams<Arr, V, R, Indexes[Pos]> ] : ToObjectChainValueOf<V, Arr[Pos]> extends Iterable<BaseKeyType> ? [ ItemType<ToObjectChainValueOf<V, Arr[Pos]>>, ...ChooserParams<Arr, V, R, Indexes[Pos]> ] : []; }[Pos extends Arr['length'] ? 'done' : Pos extends -1 ? 'any' : 'recur']; export type Chooser<Arr extends Array<ChooseMapper<V>>, V> = (...args: ChooserParams<Arr, V>) => V[] | undefined; export declare function chooserFactory<T extends object, Keys extends Array<ChooseMapper<T>>>(list: T[], ...keys: Keys): Chooser<Keys, T>;