UNPKG

iteragain

Version:

Javascript Iterable/Iterator/Generator-function utilities.

49 lines 3.98 kB
export type IteratorOrIterable<T> = Iterator<T> | Iterable<T>; export type FlattenDeep<A> = A extends IteratorOrIterable<infer B> ? B extends IteratorOrIterable<infer C> ? C extends IteratorOrIterable<infer D> ? D extends IteratorOrIterable<infer E> ? E extends IteratorOrIterable<infer F> ? F extends IteratorOrIterable<infer G> ? G extends IteratorOrIterable<infer H> ? H extends IteratorOrIterable<infer I> ? I extends IteratorOrIterable<infer J> ? J : I : H : G : F : E : D : C : B : A; export type FlattenDepth1<T> = T extends IteratorOrIterable<infer V> ? V : T; export type FlattenDepth2<T> = T extends IteratorOrIterable<infer V> ? FlattenDepth1<V> : T; export type FlattenDepth3<T> = T extends IteratorOrIterable<infer V> ? FlattenDepth2<V> : T; export type FlattenDepth4<T> = T extends IteratorOrIterable<infer V> ? FlattenDepth3<V> : T; export type FlattenDepth5<T> = T extends IteratorOrIterable<infer V> ? FlattenDepth4<V> : T; type TupleOf<T, N extends number, R extends unknown[]> = R['length'] extends N ? R : TupleOf<T, N, [T, ...R]>; type Enumerate<N extends number, Acc extends number[] = []> = Acc['length'] extends N ? Acc[number] : Enumerate<N, [...Acc, Acc['length']]>; /** Creates a union of all integers between `StartInclusive` and `EndExclusive`. */ export type IntRange<StartInclusive extends number, EndExclusive extends number> = Exclude<Enumerate<EndExclusive>, Enumerate<StartInclusive>>; /** * Creates a tuple of `T` and size `N` which is unconstrained by size of `N`. So for large tuples the * "Type instantiation is excessively deep and possibly infinite" TS error will occur. */ export type UnconstrainedTuple<T, N extends number> = N extends N ? number extends N ? T[] : TupleOf<T, N, []> : never; export type Tuple<T, N extends number, Range extends number = IntRange<0, 11>> = N extends Range ? UnconstrainedTuple<T, N> : T[]; /** A function that returns a truthy or falsey value given an input value of type `T`. */ export type Predicate<T> = (value: T) => unknown; /** A function that returns a truthy or falsey value that determines if `T` is `S`. */ export type StrictPredicate<T, S extends T> = (value: T) => value is S; /** A function designated as a callback which doesn't necessarily return anything. */ export type Callback<T, R = unknown> = (value: T) => R; /** A function that does something with value of type `T` and transforms it into type `R`. */ export type Iteratee<T, R> = (value: T) => R; /** Any generic function. */ export interface Fn<Args extends any[] = any[], Result = any> { (...args: Args): Result; } /** Returns the source of the generic Iterable, Iterator, IterableIterator or their async counterparts. */ export type IterSource<T> = T extends Iterable<infer U> ? U : T extends Iterator<infer U> ? U : T extends IterableIterator<infer U> ? U : T extends AsyncIterable<infer U> ? U : T extends AsyncIterator<infer U> ? U : T extends AsyncIterableIterator<infer U> ? U : T; export type MapToSource<T extends IteratorOrIterable<any>[]> = { [K in keyof T]: IterSource<T[K]>; }; /** A tuple representing the key, value and parent object (in that order) of an entry/key-value pair in an object. */ export type ObjectEntry<T = any> = [string, T, any]; /** Recursively unwraps `T` until it's not a Promise, (Polyfill) */ export type Awaited<T> = T extends PromiseLike<infer U> ? Awaited<U> : T; export type KeyIdentifier<T> = keyof T | Iteratee<T, any>; export type KeyIdentifiersValue<T, K extends KeyIdentifier<T>> = K extends keyof T ? T[K] : K extends Iteratee<T, any> ? ReturnType<K> : never; /** The params used for `unique` method/function. */ export type UniqueParams<T> = { iteratee?: Iteratee<T, any>; justSeen?: boolean; } | Iteratee<T, any>; export type ShiftArr<T extends unknown[]> = T extends [unknown, ...infer P] ? P : never; export type ItOrCurriedIt<T> = IterableIterator<T> | ((arg: IteratorOrIterable<T>) => IterableIterator<T>); export {}; //# sourceMappingURL=types.d.ts.map