effi-find
Version:
Creates a function to choose an Item from a list in O(1)
45 lines (44 loc) • 1.47 kB
TypeScript
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>;