UNPKG

@ibnlanre/types

Version:

An opinionated collection of typescript types

1,048 lines (955 loc) 151 kB
type Append<Text extends string, Segment extends string> = `${Text}${Segment}`; interface TAppend<Segment extends string | void = void, Text extends string | void = void> extends Fn<{ 0: string; 1: string; }> { slot: [Segment, Text]; data: Append<this[1], this[0]>; } type Contains<Text extends string, Segment extends Serializable> = Text extends `${string}${Segment}${string}` ? 1 : 0; interface TContains<Segment extends Serializable | void = void, Text extends string | void = void> extends Fn<{ 0: Serializable; 1: string; }> { slot: [Segment, Text]; data: Contains<this[1], this[0]>; } type EndsWith<Text extends string, Segment extends Serializable> = Text extends `${string}${Segment}` ? 1 : 0; interface TEndsWith<Segment extends Serializable | void = void, Text extends string | void = void> extends Fn<{ 0: Serializable; 1: string; }> { slot: [Segment, Text]; data: EndsWith<this[1], this[0]>; } type Length<Text extends Serializable> = Split<Stringify<Text>>["length"]; interface TLength<Text extends Serializable | void = void> extends Fn<{ 0: Serializable; }> { slot: [Text]; data: Length<this[0]>; } type OccurrenceHelper<Input extends string, Substring extends string, Count extends Substring[] = []> = Input extends `${string}${Substring}${infer Slice}` ? OccurrenceHelper<Slice, Substring, [...Count, Substring]> : Size<Count>; type Occurrence<Input extends string, Substring extends string> = OccurrenceHelper<Input, Substring>; interface TOccurrence<Substring extends string | void = void, Input extends string | void = void> extends Fn<{ 0: Substring; 1: Input; }> { slot: [Substring, Input]; data: Occurrence<this[1], this[0]>; } type PadEnd$1<Text extends string, Size extends number, Suffix extends string = "0"> = Length<Text> extends Size ? Text : PadEnd$1<Append<Text, Suffix>, Size, Suffix>; interface TPadEnd<Size extends number | void = void, Suffix extends string | void = "0", Text extends string | void = void> extends Fn<{ 0: number; 1: string; 2: string; }> { slot: [Size, Suffix, Text]; data: PadEnd$1<this[2], this[0], this[1]>; } type PadStart$1<Text extends string, Size extends number, Prefix extends string = "0"> = Length<Text> extends Size ? Text : PadStart$1<Prepend<Text, Prefix>, Size, Prefix>; interface TPadStart<Size extends number | void = void, Prefix extends string | void = "0", Text extends string | void = void> extends Fn<{ 0: number; 1: string; 2: string; }> { slot: [Size, Prefix, Text]; data: PadStart$1<this[2], this[0], this[1]>; } type Pattern<Text extends Serializable, StartsWith extends Serializable = "", EndsWith extends Serializable = ""> = `${StartsWith}${Text}${EndsWith}`; interface TPattern<StartsWith extends Serializable | void = "", EndsWith extends Serializable | void = "", Text extends Serializable | void = void> extends Fn<{ 0: Serializable; 1: Serializable; 2: Serializable; }> { slot: [StartsWith, EndsWith, Text]; data: Pattern<this[2], this[0], this[1]>; } type PlaceHelper<Text extends string, Segment extends string, Index extends number> = `${Substring<Text, 0, Index>}${Segment}${Substring<Text, Index, Length<Text>>}`; type Place<Text extends string, Segment extends string, Index extends number> = LastOfUnion<Index> extends infer L ? IsNever<L> extends 1 ? Text : L extends number ? Place<PlaceHelper<Text, Segment, Locate<Length<Text>, L>>, Segment, Exclude<Index, L>> : Text : never; interface TPlace<Segment extends string | void = void, Index extends number | void = void, Text extends string | void = void> extends Fn<{ 0: string; 1: number; 2: string; }> { slot: [Segment, Index, Text]; data: Place<this[2], this[0], this[1]>; } type Prepend<Text extends string, Segment extends string> = `${Segment}${Text}`; interface TPrepend<Segment extends string | void = void, Text extends string | void = void> extends Fn<{ 0: string; 1: string; }> { slot: [Segment, Text]; data: Prepend<this[1], this[0]>; } type ReplaceHelper<Text extends string, Search extends string, Replacement extends string> = Text extends `${infer X}${Search}${infer U}` ? `${X}${Replacement}${ReplaceHelper<U, Search, Replacement>}` : Text; type Replace<Text extends string, Search extends string, Replacement extends string> = LastOfUnion<Search> extends infer L ? IsNever<L> extends 1 ? Text : L extends string ? Replace<ReplaceHelper<Text, L, Replacement>, Exclude<Search, L>, Replacement> : Text : never; interface TReplace<Search extends string | void = void, Replacement extends string | void = void, Text extends string | void = void> extends Fn<{ 0: string; 1: string; 2: string; }> { slot: [Search, Replacement, Text]; data: Replace<this[2], this[0], this[1]>; } type SplitHelper<Text extends string, Delimiter extends string> = Text extends `${infer T}${Delimiter}${infer U}` ? [T, ...SplitHelper<U, Delimiter>] : Text extends Delimiter ? [] : [Text]; type DefaultOptions = { removeEmptyEntries: false; }; type RemoveEmptyEntries<Text extends string[]> = Text extends [ infer Head, ...infer Tail ] ? Tail extends string[] ? Head extends "" ? RemoveEmptyEntries<Tail> : [Head, ...RemoveEmptyEntries<Tail>] : never : Text; type Split<Text extends string, Delimiter extends string = "", Options extends { removeEmptyEntries?: boolean; } = DefaultOptions> = Options["removeEmptyEntries"] extends true ? RemoveEmptyEntries<SplitHelper<Text, Delimiter>> : SplitHelper<Text, Delimiter>; interface TSplit<Delimiter extends string | void = void, Options extends { removeEmptyEntries?: boolean; } | void = DefaultOptions, Text extends string | void = void> extends Fn<{ 0: string; 1: { removeEmptyEntries: boolean; }; 2: string; }> { slot: [Delimiter, Options, Text]; data: Split<this[2], this[0], this[1]>; } type StartsWith<Text extends string, Segment extends Serializable> = Text extends `${Segment}${string}` ? 1 : 0; interface TStartsWith<Segment extends Serializable | void = void, Text extends string | void = void> extends Fn<{ 0: Serializable; 1: string; }> { slot: [Segment, Text]; data: StartsWith<this[1], this[0]>; } type Serializable$1 = string | number | boolean | null; type ArrayToString<Input extends any[]> = `[${Join$1<Input>}]`; type ObjectToString<Input extends Record<string, any>> = Join$1<UnionToTuple<{ [K in keyof Input]: `${Stringify<K>}: ${Stringify<Input[K]>}`; }[keyof Input]>, ", ">; type Stringify<Input> = Input extends string ? Input : Input extends Serializable$1 ? `${Input}` : Input extends any[] ? ArrayToString<Input> : Input extends Record<string, any> ? ObjectToString<Input> : never; interface TStringify<Input extends unknown | void = void> extends Fn<{ 0: unknown; }> { slot: [Input]; data: Stringify<this[0]>; } type Substring<Text extends string, Start extends number, End extends number> = Join$1<Slice<Split<Text>, Start, End>>; interface TSubstring<Start extends number | void = void, End extends number | void = void, Text extends string | void = void> extends Fn<{ 0: number; 1: number; 2: string; }> { slot: [Start, End, Text]; data: Substring<this[2], this[0], this[1]>; } type Template<Stream extends Serializable | Serializable[]> = Stream extends Serializable ? `${Stream}` : Stream extends Serializable[] ? Join$1<Stream> : never; interface TTemplate<Stream extends Serializable> extends Fn<{ 0: Template<Stream>; }> { slot: [Stream]; data: Template<this[0]>; } type Trim<Text extends string, Letter extends string = "0", Count extends number = -1> = TrimStart<TrimEnd<Text, Letter, Count>, Letter, Count>; interface TTrim<Letter extends string | void = "0", Count extends number | void = -1, Text extends string | void = void> extends Fn<{ 0: string; 1: number; 2: string; }> { slot: [Letter, Count, Text]; data: Trim<this[2], this[0], this[1]>; } type TrimEndHelper<Text extends string, Letter extends string, Count extends number> = Text extends `${infer U}${Letter}` ? TrimEnd<U, Letter, Subtract$1<Count, 1>> : Text; type TrimEnd<Text extends string, Letter extends string = "0", Count extends number = -1> = Count extends -1 ? Text extends `${infer U}${Letter}` ? TrimEndHelper<U, Letter, Count> : Text : Count extends 0 ? Text : TrimEndHelper<Text, Letter, Count>; interface TTrimEnd<Letter extends string | void = "0", Count extends number | void = -1, Text extends string | void = void> extends Fn { slot: [Letter, Count, Text]; data: TrimEnd<this[2], this[0], this[1]>; } type TrimStartHelper<Text extends string, Letter extends string, Count extends number> = Text extends `${Letter}${infer U}` ? TrimStart<U, Letter, Subtract$1<Count, 1>> : Text; type TrimStart<Text extends string, Letter extends string = "0", Count extends number = -1> = Count extends -1 ? Text extends `${Letter}${infer U}` ? TrimStartHelper<U, Letter, Count> : Text : Count extends 0 ? Text : TrimStartHelper<Text, Letter, Count>; interface TTrimStart<Letter extends string | void = "0", Count extends number | void = -1, Text extends string | void = void> extends Fn<{ 0: string; 1: number; 2: string; }> { slot: [Letter, Count, Text]; data: TrimStart<this[2], this[0], this[1]>; } type AssignHelper<ObjectType extends Dictionary, PathType extends string, Key extends string, ValueType = never> = PathType extends `${Key}.${infer Rest}` ? ObjectType[Key] extends infer ObjectType ? ObjectType extends Dictionary ? Assign<ObjectType, Rest, ValueType> : Assign<ObjectFromPath<Rest, ValueType>> : never : PathType extends Key ? ValueType : ObjectType[Key] extends Dictionary ? Assign<ObjectType[Key]> : ObjectType[Key]; type Setter<ObjectType extends Dictionary, PathType extends string, ValueType = never> = Intersect<{ [Key in RequiredKeys<ObjectType> as [ValueType] extends [never] ? Exclude<Key, PathType> : Key]: AssignHelper<ObjectType, PathType, Key, ValueType>; } & { [Key in OptionalKeys<ObjectType> as [ValueType] extends [never] ? Exclude<Key, PathType> : Key]?: AssignHelper<ObjectType, PathType, Key, ValueType>; }>; type Assign<ObjectType extends Dictionary, PathType extends Paths<ObjectType> | ArbitraryKey<number> = "", ValueType extends any = never> = PathType extends keyof ObjectType | `${infer Head}.${string}` | "" ? Head extends keyof ObjectType ? Setter<ObjectType, Stringify<PathType>, ValueType> : Intersect<Setter<ObjectType, Stringify<PathType>, ValueType> & ObjectFromPath<Stringify<PathType>, ValueType>> : [ValueType] extends [never] ? Setter<ObjectType, Stringify<PathType>> : ObjectType extends Dictionary ? { [Key in keyof ObjectType | PathType]: Key extends keyof ObjectType ? ObjectType[Key] : ValueType; } : ObjectType; interface TAssign<PathType extends Paths<Exclude<ObjectType, void>> | ArbitraryKey | void = void, ValueType extends unknown = never, ObjectType extends Dictionary | void = void> extends Fn<{ 0: Paths<Exclude<ObjectType, void>> | ArbitraryKey; 1: unknown; 2: Dictionary; }> { slot: [PathType, ValueType, ObjectType]; data: Assign<this[2], this[0], this[1]>; } type ObjectHelper<ObjectType extends Dictionary, PickType extends Dictionary<string, Paths<ObjectType>>> = { [Key in keyof PickType]: Get<ObjectType, PickType[Key]>; }; type ArrayHelper<ObjectType extends Dictionary, PickType extends Paths<ObjectType>[]> = { [Key in PickType[number]]: Get<ObjectType, Key>; }; type StringHelper<ObjectType extends Dictionary, PickType extends string> = { [Key in PickType]: Get<ObjectType, Key>; }; type Collect$1<ObjectType extends Dictionary, PickType extends Dictionary<string, Paths<ObjectType>> | Paths<ObjectType>[] | Paths<ObjectType>> = Unionize<PickType extends Paths<ObjectType>[] ? ArrayHelper<ObjectType, PickType> : PickType extends Dictionary<string, Paths<ObjectType>> ? ObjectHelper<ObjectType, PickType> : PickType extends Paths<ObjectType> ? StringHelper<ObjectType, PickType> : never>; interface TCollect<PickType extends Dictionary<string, Paths<Exclude<ObjectType, void>>> | Paths<Exclude<ObjectType, void>>[] | Paths<Exclude<ObjectType, void>> | void = void, ObjectType extends Dictionary | void = void> extends Fn<{ 0: Dictionary<string, Paths<Exclude<ObjectType, void>>> | Paths<Exclude<ObjectType, void>>[] | Paths<Exclude<ObjectType, void>>; 1: Dictionary; }> { slot: [PickType, ObjectType]; data: Collect$1<this[1], this[0]>; } type CombineHelper<Source extends Dictionary[], Result extends Dictionary = {}> = Source extends [ infer Head extends Dictionary, ...infer Rest extends Dictionary[] ] ? CombineHelper<Rest, Merge<Result, Head>> : Source extends Dictionary ? Merge<Result, Source> : Result; type Combine<Source extends Dictionary[]> = CombineHelper<Source>; interface TCombine<Source extends Dictionary[] | void = void> extends Fn<{ 0: Dictionary[]; }> { slot: [Source]; data: Combine<this[0]>; } type DeepPartialHelper<ObjectType extends Dictionary, PathType extends string, Key extends string> = ObjectType[Key] extends Dictionary ? [PathType] extends [never] ? DeepPartial<ObjectType[Key]> : PathType extends `${Key}.${infer Rest}` ? DeepPartial<ObjectType[Key], Rest> : DeepPartial<ObjectType[Key], ""> : ObjectType[Key]; type DeepPartial<ObjectType extends Dictionary, PathType extends ArbitraryKey | Paths<ObjectType> = never> = [PathType] extends [never] ? { [Key in Keys<ObjectType>]?: DeepPartialHelper<ObjectType, PathType, Key>; } : ObjectType extends Dictionary ? Intersect<{ [Key in Exclude<RequiredKeys<ObjectType>, PathType>]: DeepPartialHelper<ObjectType, PathType, Key>; } & { [Key in Exclude<OptionalKeys<ObjectType>, PathType>]?: DeepPartialHelper<ObjectType, PathType, Key>; } & { [Key in IncludeKeys<ObjectType, PathType>]?: DeepPartialHelper<ObjectType, PathType, Key>; }> : ObjectType; interface TDeepPartial<PathType extends ArbitraryKey | Paths<Exclude<ObjectType, void>> | void = void, ObjectType extends Dictionary | void = void> extends Fn<{ 0: ArbitraryKey | Paths<Exclude<ObjectType, void>>; 1: Dictionary; }> { slot: [PathType, ObjectType]; data: DeepPartial<this[1], this[0]>; } type DeepRequiredHelper<ObjectType extends Dictionary, PathType extends string, Key extends string> = ObjectType[Key] extends Dictionary ? [PathType] extends [never] ? DeepRequired<ObjectType[Key]> : PathType extends `${Key}.${infer Rest}` ? DeepRequired<ObjectType[Key], Rest> : DeepRequired<ObjectType[Key], ""> : ObjectType[Key]; type DeepRequired<ObjectType extends Dictionary, PathType extends ArbitraryKey | Paths<ObjectType> = never> = [PathType] extends [never] ? { [Key in Keys<ObjectType>]: RequireValue<DeepRequiredHelper<ObjectType, PathType, Key>>; } : ObjectType extends Dictionary ? Intersect<{ [Key in Exclude<RequiredKeys<ObjectType>, PathType>]: DeepRequiredHelper<ObjectType, PathType, Key>; } & { [Key in Exclude<OptionalKeys<ObjectType>, PathType>]?: DeepRequiredHelper<ObjectType, PathType, Key>; } & { [Key in IncludeKeys<ObjectType, PathType>]: RequireValue<DeepRequiredHelper<ObjectType, PathType, Key>>; }> : ObjectType; interface TDeepRequired<PathType extends ArbitraryKey | Paths<Exclude<ObjectType, void>> | void = void, ObjectType extends Dictionary | void = void> extends Fn<{ 0: ArbitraryKey | Paths<Exclude<ObjectType, void>>; 1: Dictionary; }> { slot: [PathType, ObjectType]; data: DeepRequired<this[1], this[0]>; } type Diff<Left extends Dictionary, Right extends Dictionary> = Merge<Pick<Left, Exclude<keyof Left, keyof Right>>, Pick<Right, Exclude<keyof Right, keyof Left>>>; interface TDiff<Right extends Dictionary, Left extends Dictionary> extends Fn<{ 0: Dictionary; 1: Dictionary; }> { slot: [Right, Left]; data: Diff<this[1], this[0]>; } type ExcludeKeys<ObjectType extends Dictionary, PathType extends ArbitraryKey | Paths<ObjectType> = never> = Exclude<Keys<ObjectType>, PathType>; interface TExcludeKeys<PathType extends ArbitraryKey | Paths<Exclude<ObjectType, void>> | void = void, ObjectType extends Dictionary | void = void> extends Fn<{ 0: ArbitraryKey | Paths<Exclude<ObjectType, void>>; 1: Dictionary; }> { slot: [PathType, ObjectType]; data: ExcludeKeys<this[1], this[0]>; } type ExtractNestedKeys<Text extends string, Delimiter extends string = "."> = Text extends `${string}${Delimiter}${infer Segment}` ? Segment : Text; interface TExtractNestedKeys<Delimiter extends string | void = ".", Text extends string | void = void> extends Fn<{ 0: string; 1: string; }> { slot: [Delimiter, Text]; data: ExtractNestedKeys<this[1], this[0]>; } type ExtractRootKey<Text extends string, Delimiter extends string = "."> = Text extends `${infer Segment}${Delimiter}${string}` ? Segment : Text; interface TExtractRootKey<Delimiter extends string | void = ".", Text extends string | void = void> extends Fn<{ 0: string; 1: string; }> { slot: [Delimiter, Text]; data: ExtractRootKey<this[1], this[0]>; } type FromEntries<EntryList extends any[][]> = { [Key in EntryList[number][0]]: Extract<EntryList[number], [Key, any]>[1]; }; interface TFromEntries<EntryList extends unknown[][] | void = void> extends Fn<{ 0: unknown[][]; }> { slot: [EntryList]; data: FromEntries<this[0]>; } /** * Represents the value at a path in an object. * * @template ObjectType The type of the object. * @template Path The type of the path. * @template Delimiter The type of the delimiter. */ type Get<ObjectType extends Dictionary, Path extends Paths<ObjectType, Delimiter> | ArbitraryKey<number>, Fallback extends unknown = never, Delimiter extends string = "."> = Stringify<Path> extends Keys<ObjectType> ? ObjectType[Stringify<Path>] : Path extends `${infer Key}${Delimiter}${infer Rest}` ? ObjectType[Key] extends Dictionary ? Get<ObjectType[Key], Rest, Fallback> : Fallback : Fallback; interface TGet<Path extends Paths<Exclude<ObjectType, void>, Exclude<Delimiter, void>> | ArbitraryKey<number> | void = void, Fallback extends unknown = never, Delimiter extends string | void = ".", ObjectType extends Dictionary | void = void> extends Fn<{ 0: Paths<Exclude<ObjectType, void>, Exclude<Delimiter, void>> | ArbitraryKey<number>; 1: unknown; 2: string; 3: Dictionary; }> { slot: [Path, Fallback, Delimiter, ObjectType]; data: Get<this[3], this[0], this[1], this[2]>; } type Has<ObjectType extends Dictionary, Key extends string | number | symbol, Delimiter extends string = "."> = Key extends Paths<ObjectType, Delimiter> ? 1 : 0; interface THas<Key extends string | number | symbol | void = void, Delimiter extends string | void = ".", ObjectType extends Dictionary | void = void> extends Fn<{ 0: string | number | symbol; 1: string; 2: Dictionary; }> { slot: [Key, Delimiter, ObjectType]; data: Has<this[2], this[0], this[1]>; } type ImmutableShallow<T> = { readonly [K in keyof T & {}]: T[K]; }; type ImmutableObject<T> = { readonly [K in keyof T]: Immutable<T[K]>; }; type ImmutableArray<T> = ImmutableShallow<ReadonlyArray<Immutable<T>>>; type ImmutableMap<K, V> = Readonly<ReadonlyMap<Immutable<K>, Immutable<V>>>; type ImmutableSet<T> = Readonly<ReadonlySet<Immutable<T>>>; type Immutable<T> = T extends Array<infer U> ? ImmutableArray<U> : T extends Map<infer K, infer V> ? ImmutableMap<K, V> : T extends Set<infer M> ? ImmutableSet<M> : T extends Dictionary ? ImmutableObject<T> : Readonly<T>; interface TImmutable<T extends unknown | void = void> extends Fn<{ 0: unknown; }> { slot: [T]; data: Immutable<this[0]>; } type IncludeKeys<ObjectType extends Dictionary, PathType extends ArbitraryKey | Paths<ObjectType> = never> = Extract<Keys<ObjectType>, PathType>; interface TIncludeKeys<PathType extends ArbitraryKey | Paths<Exclude<ObjectType, void>> | void = void, ObjectType extends Dictionary | void = void> extends Fn<{ 0: ArbitraryKey | Paths<Exclude<ObjectType, void>>; 1: Dictionary; }> { slot: [PathType, ObjectType]; data: IncludeKeys<this[1], this[0]>; } type JoinKeys<RootKey extends string, Key extends string, Delimiter extends string = "."> = RootKey extends "" ? Key : `${RootKey}${Delimiter}${Key}`; interface TJoinKeys<Key extends string | void = void, Delimiter extends string | void = ".", RootKey extends string | void = void> extends Fn<{ 0: string; 1: string; 2: string; }> { slot: [Key, Delimiter, RootKey]; data: JoinKeys<this[2], this[0], this[1]>; } type Keys<ObjectType extends Dictionary> = keyof ObjectType extends undefined ? never : keyof ObjectType extends infer Keys extends string | number ? `${Keys}` : never; interface TKeys<ObjectType extends Dictionary | void = void> extends Fn { slot: [ObjectType]; data: Keys<this[0]>; } type KeysAsTupleHelper<ObjectType extends Dictionary, Keys extends any[] = []> = LastOfUnion<keyof ObjectType> extends infer Key ? [Key] extends [never] ? Keys : Key extends keyof ObjectType ? KeysAsTupleHelper<Omit<ObjectType, Key>, [Key, ...Keys]> : never : Keys; type KeysAsTuple<ObjectType extends Dictionary> = KeysAsTupleHelper<ObjectType>; interface TKeysAsTuple<ObjectType extends Dictionary | void = void> extends Fn<{ 0: Dictionary; }> { slot: [ObjectType]; data: KeysAsTuple<this[0]>; } type Merge<Source extends Dictionary, Target extends Dictionary> = Intersect<{ [Key in keyof Source as Key extends keyof Target ? never : Key]: Source[Key]; } & { [Key in keyof Target as Key extends keyof Source ? never : Key]: Target[Key]; } & { [Key in keyof Source & keyof Target]: Source[Key] extends Dictionary ? Target[Key] extends Dictionary ? Merge<Source[Key], Target[Key]> : Target[Key] : Target[Key]; }>; interface TMerge<Target extends Dictionary | void = void, Source extends Dictionary | void = void> extends Fn<{ 0: Dictionary; 1: Dictionary; }> { slot: [Target, Source]; data: Merge<this[1], this[0]>; } type Mutable<ObjectType extends Dictionary> = ObjectType extends Primitives | Indexable | Structures | Derivatives ? ObjectType : Intersect<{ -readonly [K in keyof ObjectType]: ObjectType[K] extends Record<string, any> ? Mutable<ObjectType[K]> : ObjectType[K]; }>; interface TMutable<ObjectType extends Dictionary | void = void> extends Fn<{ 0: Dictionary; }> { slot: [ObjectType]; data: Mutable<this[0]>; } type ObjectFromPath<Path extends string, Value extends any, Delimiter extends string = "."> = Path extends `${infer Head}${Delimiter}${infer Rest}` ? { [K in Head]: ObjectFromPath<Rest, Value>; } : { [K in Path]: Value; }; interface TObjectFromPath<Value extends unknown = void, Delimiter extends string | void = ".", Path extends string | void = void> extends Fn<{ 0: string; 1: unknown; 2: string; }> { slot: [Value, Delimiter, Path]; data: ObjectFromPath<this[2], this[0], this[1]>; } type OmitOptionalValues<ObjectType extends Dictionary> = ObjectType extends Dictionary ? Intersect<{ [K in RequiredKeys<ObjectType>]: ObjectType[K] extends infer T ? T extends Dictionary ? OmitOptionalValues<T> : T : never; }> : ObjectType; interface TOmitOptionalValues<ObjectType extends Dictionary | void = void> extends Fn<{ 0: Dictionary; }> { slot: [ObjectType]; data: OmitOptionalValues<this[0]>; } type OmitPathHelper<ObjectType extends Dictionary, PathType extends string, Key extends string> = ObjectType[Key] extends Dictionary ? PathType extends `${Key}.${infer Rest}` ? OmitPath<ObjectType[Key], Rest> : OmitPath<ObjectType[Key]> : ObjectType[Key]; type OmitPath<ObjectType extends Dictionary, PathType extends Paths<ObjectType> | ArbitraryKey = ""> = ObjectType extends Dictionary ? Intersect<{ [Key in Exclude<RequiredKeys<ObjectType>, PathType>]: OmitPathHelper<ObjectType, PathType, Key>; } & { [Key in Exclude<OptionalKeys<ObjectType>, PathType>]?: OmitPathHelper<ObjectType, PathType, Key>; }> : ObjectType; interface TOmitPath<PathType extends Paths<Exclude<ObjectType, void>> | void = void, ObjectType extends Dictionary | void = void> extends Fn<{ 0: Paths<Exclude<ObjectType, void>>; 1: Dictionary; }> { slot: [PathType, ObjectType]; data: OmitPath<this[1], this[0]>; } type OmitRequiredValues<ObjectType extends Dictionary> = ObjectType extends Dictionary ? Intersect<{ [K in OptionalKeys<ObjectType>]: ObjectType[K] extends infer T ? T extends Dictionary ? OmitRequiredValues<T> : T : never; }> : ObjectType; interface TOmitRequiredValues<ObjectType extends Dictionary | void = void> extends Fn<{ 0: Dictionary; }> { slot: [ObjectType]; data: OmitRequiredValues<this[0]>; } /** * Used in filtering out the optional keys in a dictionary. * * @params ObjectType The type of the store. * @params Key The type of the key. * * @return The keys that are optional in the dictionary. * * @example * { [Key in keyof ObjectType as OptionalKeyMap<ObjectType, Key>]: ObjectType[Key] } */ type OptionalKeyMap<ObjectType extends Dictionary, Key extends keyof ObjectType> = ObjectType[Key] extends Required<ObjectType>[Key] ? never : Key; type OptionalKeys<ObjectType extends Dictionary> = { [Key in Keys<ObjectType>]: IsPartial<ObjectType[Key]> extends 1 ? Key : never; }[Keys<ObjectType>]; interface TOptionalKeys<ObjectType extends Dictionary | void = void> extends Fn<{ 0: Dictionary; }> { slot: [ObjectType]; data: OptionalKeys<this[0]>; } type OptionalKeysDeepHelper<ObjectType extends Dictionary, Root extends string = ""> = Elements<UnionToTuple<{ [Key in Keys<ObjectType>]: IsPartial<ObjectType[Key]> extends 1 ? ObjectType[Key] extends Dictionary ? Key | OptionalKeysDeepHelper<ObjectType[Key], Key> : JoinKeys<Root, Key> : never; }[Keys<ObjectType>]>>; type OptionalKeysDeep<ObjectType extends Dictionary> = OptionalKeysDeepHelper<ObjectType>; interface TOptionalKeysDeep<ObjectType extends Dictionary | void = void> extends Fn<{ 0: Dictionary; }> { slot: [ObjectType]; data: OptionalKeysDeep<this[0]>; } type PathsHelper<ObjectType extends Dictionary, Key extends string | number, Delimiter extends string, Level extends number> = Level extends 0 ? `${Key}` : Level extends -1 ? `${Key}` | `${Key}${Delimiter}${Paths<ObjectType, Delimiter>}` : `${Key}` | `${Key}${Delimiter}${Paths<ObjectType, Delimiter, Subtract$1<Level, 1>>}`; /** * Get all the possible paths of an object * * @param ObjectType - The object to get the paths from * @param [Delimiter = "."] - The delimiter to use to separate the keys * @param [Level = -1] - The level to stop the recursion */ type Paths<ObjectType extends Dictionary, Delimiter extends string = ".", Level extends number = -1> = ObjectType extends Dictionary ? { [Key in Keys<ObjectType>]: Key extends string | number ? ObjectType[Key] extends infer ObjectType ? ObjectType extends Dictionary ? PathsHelper<ObjectType, Key, Delimiter, Level> : `${Key}` : never : never; }[Keys<ObjectType>] : never; interface TPaths<Delimiter extends string | void = ".", Level extends number | void = -1, ObjectType extends Dictionary | void = void> extends Fn<{ 0: string; 1: number; 2: Dictionary; }> { slot: [Delimiter, Level, ObjectType]; data: Paths<this[2], this[0], this[1]>; } type RequireValue<Value> = Exclude<Value, undefined> extends infer Required ? IsNever<Required> extends 1 ? undefined : Required : never; interface TRequireValue<Value extends unknown | void = void> extends Fn<{ 0: unknown; }> { slot: [Value]; data: RequireValue<this[0]>; } /** * Used in filtering out the required keys in a dictionary. * * @params ObjectType The type of the store. * @params Key The type of the key. * * @return The keys that are required in the dictionary. * * @example * { [Key in keyof ObjectType as RequiredKeyMap<ObjectType, Key>]: ObjectType[Key] } */ type RequiredKeyMap<ObjectType extends Dictionary, Key extends keyof ObjectType> = ObjectType[Key] extends Required<ObjectType>[Key] ? Key : never; type RequiredKeys<ObjectType extends Dictionary> = { [Key in Keys<ObjectType>]: IsPartial<ObjectType[Key]> extends 1 ? never : Key; }[Keys<ObjectType>]; interface TRequiredKeys<ObjectType extends Dictionary | void = void> extends Fn<{ 0: Dictionary; }> { slot: [ObjectType]; data: RequiredKeys<this[0]>; } type RequiredKeysDeepHelper<ObjectType extends Dictionary, Root extends string = ""> = Elements<UnionToTuple<{ [Key in Keys<ObjectType>]: IsPartial<ObjectType[Key]> extends 0 ? ObjectType[Key] extends Dictionary ? Key | RequiredKeysDeepHelper<ObjectType[Key], Key> : JoinKeys<Root, Key> : never; }[Keys<ObjectType>]>>; type RequiredKeysDeep<ObjectType extends Dictionary> = RequiredKeysDeepHelper<ObjectType>; interface TRequiredKeysDeep<ObjectType extends Dictionary | void = void> extends Fn<{ 0: Dictionary; }> { slot: [ObjectType]; data: RequiredKeysDeep<this[0]>; } type ToEntries<ObjectType extends Dictionary> = UnionToTuple<{ [Key in keyof ObjectType]: [Key, ObjectType[Key]]; }[keyof ObjectType]>; interface TToEntries<ObjectType extends Dictionary | void = void> extends Fn<{ 0: Dictionary; }> { slot: [ObjectType]; data: ToEntries<this[0]>; } type ValuesHelper<ObjectType extends Dictionary, Values extends any[] = []> = LastOfUnion<keyof ObjectType> extends infer Key ? [Key] extends [never] ? Values : Key extends keyof ObjectType ? ValuesHelper<Omit<ObjectType, Key>, [ObjectType[Key], ...Values]> : never : Values; type Values<ObjectType extends Dictionary> = ValuesHelper<ObjectType>; interface TValues<ObjectType extends Dictionary | void = void> extends Fn<{ 0: Dictionary; }> { slot: [ObjectType]; data: Values<this[0]>; } type AnchorStructure<List extends unknown[], Rest extends unknown[][]> = [first: List, ...rest: Rest]; type AnchorHelper<List extends unknown[][], Shank extends unknown, Result extends unknown[] = []> = List extends AnchorStructure<infer First, infer Rest> ? AnchorHelper<Rest, Shank, [...Result, Insert<First, 0, Shank>]> : Result; type Anchor<List extends unknown[]> = List extends [ infer Shank extends unknown, ...infer Rest extends unknown[] ] ? AnchorHelper<Shuffle<Rest>, Shank> : List; interface TAnchor<List extends unknown[] | void = void> extends Fn<{ 0: unknown[]; }> { slot: [List]; data: Anchor<this[0]>; } type ArrayOfHelper<Length extends number, Element extends unknown, Result extends unknown[] = []> = Result["length"] extends Length ? Result : ArrayOfHelper<Length, Element, [Element, ...Result]>; type ArrayOf<Length extends number, Element extends unknown = any> = ArrayOfHelper<Length, Element>; interface TArrayOf<Length extends number | void = void, Element extends unknown | void = void> extends Fn<{ 0: number; 1: unknown; }> { slot: [Length, Element]; data: ArrayOf<this[0], this[1]>; } type CircleStructure<List extends unknown[][]> = [...circle: List]; type Circle<List extends unknown[], Result extends unknown[][] = []> = Size<Result> extends Size<List> ? Result : Circle<RotateLeft<List>, [...Result, List]>; interface TCircle<List extends unknown[] | void = void> extends Fn<{ 0: unknown; }> { slot: [List]; data: Circle<this[0]>; } type Concat<Left extends unknown[], Right extends unknown[]> = [ ...Left, ...Right ]; interface TConcat<Right extends unknown[] | void = void, Left extends unknown[] | void = void> extends Fn<{ 0: unknown[]; 1: unknown[]; }> { slot: [Right, Left]; data: Concat<this[1], this[0]>; } type Count<List extends unknown[], Value extends unknown> = List extends [] ? 0 : List extends [infer Head, ...infer Rest] ? IsExact<Head, Value> extends 1 ? Add$1<1, Count<Rest, Value>> : Count<Rest, Value> : 0; interface TCount<Value extends unknown | void = void, List extends unknown[] | void = void> extends Fn<{ 0: unknown; 1: unknown[]; }> { slot: [Value, List]; data: Count<this[1], this[0]>; } type Drop<List extends unknown[], Index extends number> = [ ...SliceTo<List, Index>, ...SliceFrom<List, Add$1<Index, 1>> ]; interface TDrop<Index extends number | void = void, List extends unknown[] | void = void> extends Fn<{ 0: unknown; 1: unknown[]; }> { slot: [Index, List]; data: Drop<this[1], this[0]>; } type Elements<List extends any[]> = List[number]; interface TElements<List extends unknown[]> extends Fn<{ 0: unknown[]; }> { slot: [List]; data: Elements<this[0]>; } type Entries<List extends unknown[]> = UnionToTuple<{ [Key in Exclude<keyof List, keyof any[]>]: [ParseInt<Key>, List[Key]]; }[Exclude<keyof List, keyof any[]>]> extends infer Result extends unknown[][] ? Result : never; interface TEntries<List extends unknown[]> extends Fn<{ 0: unknown[]; }> { slot: [List]; data: Entries<this[0]>; } type Every<Callback extends Fn, List extends Fn.Arguments<Callback>[]> = List extends [] ? 1 : List extends [ infer Element extends Fn.Arguments<Callback>, ...infer Rest extends Fn.Arguments<Callback>[] ] ? Apply<Callback, [Element]> extends 1 ? Every<Callback, Rest> : 0 : 0; interface TEvery<Callback extends Fn, List extends Fn.Arguments<Callback>[] | void = void> extends Fn<{ 0: Fn; 1: Fn.Arguments<Callback>[]; }> { slot: [Callback, List]; data: Every<this[0], this[1]>; } type Expand<List extends unknown[]> = List extends [ infer Head, ...infer Tail ] ? Head extends unknown[] ? [Expand<Head>, ...Expand<Tail>] : [Head, ...Expand<Tail>] : []; interface TExpand<List extends unknown[] | void = void> extends Fn<{ 0: unknown[]; }> { slot: [List]; data: Expand<this[0]>; } type Filter<Callback extends Fn, List extends Fn.Arguments<Callback>[]> = List extends [ infer Element extends Fn.Arguments<Callback>, ...infer Rest extends Fn.Arguments<Callback>[] ] ? Apply<Callback, [Element]> extends 1 ? [Element, ...Filter<Callback, Rest>] : Filter<Callback, Rest> : []; interface TFilter<Callback extends Fn, List extends Fn.Arguments<Callback> | void = void> extends Fn<{ 0: Fn; 1: Fn.Arguments<Callback>; }> { slot: [Callback, List]; data: Filter<this[0], this[1]>; } type InfiniteFlat<List extends unknown[], Result extends unknown[] = []> = List extends [infer Head extends unknown[], ...infer Rest] ? InfiniteFlat<Rest, Concat<Result, Head>> : List extends [infer Head, ...infer Rest] ? InfiniteFlat<Rest, Push<Result, Head>> : Result; type FiniteFlat<List extends unknown[], Depth extends number = 0> = Depth extends 0 ? List : List extends [infer Head, ...infer Rest] ? Head extends unknown[] ? Concat<FiniteFlat<Head, Decrement<Depth>>, FiniteFlat<Rest, Depth>> : Unshift<FiniteFlat<Rest, Depth>, Head> : List; type Flat<List extends unknown[], Depth extends number = -1> = Depth extends -1 ? InfiniteFlat<List> : FiniteFlat<List, Depth>; interface TFlat<Depth extends number | void = -1, List extends unknown[] | void = void> extends Fn<{ 0: number; 1: unknown[]; }> { slot: [Depth, List]; data: Flat<this[1], this[0]>; } type Flip<Pair extends [unknown, unknown]> = [Pair[1], Pair[0]]; interface TFlip<Pair extends [unknown, unknown] | void = void> extends Fn<{ 0: unknown; 1: unknown; }> { slot: [Pair]; data: Flip<this[0]>; } type Head$1<List extends unknown[]> = List extends [ ...infer Head extends List[number][], unknown ] ? Head : never; interface THead<List extends unknown[] | void = void> extends Fn<{ 0: unknown[]; }> { slot: [List]; data: Head$1<this[0]>; } type Includes<List extends any[], Element> = List extends [] ? 0 : List extends [infer Head, ...infer Rest] ? IsExact<Head, Element> extends 1 ? 1 : Includes<Rest, Element> : 0; interface TIncludes<Element extends unknown | void = void, List extends unknown[] | void = void> extends Fn<{ 0: unknown; 1: unknown[]; }> { slot: [Element, List]; data: Includes<this[1], this[0]>; } type Indices<List extends unknown[], Result extends "Tuple" | "Union" = "Union"> = Exclude<keyof List, keyof unknown[]> extends `${infer Index extends number}` ? Result extends "Tuple" ? UnionToTuple<Index> : Index : never; interface TIndices<Result extends "Tuple" | "Union" | void = "Union", List extends unknown[] | void = void> extends Fn<{ 0: "Tuple" | "Union"; 1: unknown[]; }> { slot: [Result, List]; data: Indices<this[1], this[0]>; } type Insert<List extends unknown[], Index extends number, Value extends unknown> = [...SliceTo<List, Index>, Value, ...SliceFrom<List, Index>]; interface TInsert<Index extends number | void = 0, Value extends unknown | void = void, List extends unknown[] | void = void> extends Fn<{ 0: number; 1: unknown; 2: unknown[]; }> { slot: [Index, Value, List]; data: Insert<this[2], this[0], this[1]>; } type Join$1<List extends any[], Separator extends string = ""> = List extends [infer Head, ...infer Rest] ? Rest extends [] ? Head : `${Stringify<Head>}${Separator}${Join$1<Rest, Separator>}` : ""; interface TJoin<Separator extends string | void = void, List extends unknown[] | void = void> extends Fn<{ 0: string; 1: unknown[]; }> { slot: [Separator, List]; data: Join$1<this[1], this[0]>; } type LocateHelper<List extends unknown[], Index extends number> = `${Index}` extends `-${infer Index extends number}` ? Subtract$1<Size<List>, Index> extends infer Index ? Index extends number ? GreaterThanOrEqual<Index, 0> extends 1 ? Index : never : never : never : Indices<List> extends infer Keys ? Index extends Keys ? Index : never : never; type Locate<List extends unknown, Index extends number> = List extends unknown[] ? LocateHelper<List, Index> : List extends number ? LocateHelper<ArrayOf<List>, Index> : never; interface TLocate<Index extends number | void = void, List extends unknown[] | number | void = void> extends Fn<{ 0: number; 1: unknown[] | number; }> { slot: [Index, List]; data: Locate<this[1], this[0]>; } type Map$1<Callback extends Fn, List extends Fn.Arguments<Callback>[]> = List extends [ infer Element extends Fn.Arguments<Callback>, ...infer Rest extends Fn.Arguments<Callback>[] ] ? [Apply<Callback, [Element]>, ...Map$1<Callback, Rest>] : []; interface TMap<Callback extends Fn, List extends Fn.Arguments<Callback>[] | void = void> extends Fn<{ 0: Fn; 1: Fn.Arguments<Callback>[]; }> { slot: [Callback, List]; data: Map$1<this[0], this[1]>; } type PermutationHelper<List extends unknown[], Result extends unknown[][] = []> = Size<Result> extends Size<List> ? Reduce<Result> : PermutationHelper<RotateLeft<List>, [...Result, Anchor<List>]>; type Permutation<List extends unknown[]> = Size<List> extends 1 ? Reduce<[[List]]> : PermutationHelper<List>; interface TPermutation<List extends unknown[] | void = void> extends Fn<{ 0: unknown[]; }> { slot: [List]; data: Permutation<this[0]>; } type PivotHelper<List extends unknown[], Value extends unknown, Result extends unknown[][] = []> = Size<Result> extends Size<List> ? [...Result, Insert<List, Size<Result>, Value>] : PivotHelper<List, Value, [...Result, Insert<List, Size<Result>, Value>]>; type Pivot<List extends unknown[], Axis extends number = 0> = Locate<List, Axis> extends infer Index ? Index extends number ? PivotHelper<Drop<List, Index>, Retrieve<List, Index>> : never : never; interface TPivot<Head extends unknown | void = void, List extends unknown[] | void = void> extends Fn<{ 0: unknown; 1: unknown[]; }> { slot: [Head, List]; data: Pivot<this[1], this[0]>; } type Pop<List extends unknown[]> = List extends [ ...unknown[], infer Element extends List[number] ] ? Element : never; interface TPop<List extends unknown[] | void = void> extends Fn<{ 0: unknown[]; }> { slot: [List]; data: Pop<this[0]>; } type Push<List extends any[], Element> = [...List, Element]; interface TPush<Element extends unknown | void = void, List extends unknown[] | void = void> extends Fn<{ 0: unknown; 1: unknown[]; }> { slot: [Element, List]; data: Push<this[1], this[0]>; } type ChunkComponent<Start extends number, End extends number, Increment extends number, ChunkSize extends number, Head extends number = Min<Add$1<Start, Increment>, End>, Tail extends number = Min<Add$1<Head, ChunkSize>, End>> = [head: Head, tail: Tail]; type InferChunkParts<Head extends number, Tail extends number> = [ head: Head, tail: Tail ]; type TailNumberArray<Head extends number[], Rest extends unknown[]> = [ Head, ...Rest ]; type EnumerateHelper<Start extends number, End extends number, Result extends number[] = [], Next extends number = Add$1<Start, 1>> = Start extends End ? Result : EnumerateHelper<Next, End, Push<Result, Start>>; type Enumerate<Start extends number, End extends number, Result extends number[] = [], Limit extends number = Subtract$1<End, Start>, Increment extends number = Min<Limit, 9>, Next extends number = Add$1<Start, Increment>, LastRow extends number[] = EnumerateHelper<Start, Next>> = Start extends End ? Result : Enumerate<Next, End, Concat<Result, LastRow>>; type GenerateChunks<Start extends number, End extends number, Difference extends number = Subtract$1<End, Start>, Width extends number = Length<Difference>, ChunkSize extends number = Ceil<Divide$1<Difference, Width>>, List extends unknown[] = EnumerateHelper<0, Width>> = { [Index in keyof List]: List[Index] extends number ? Multiply$1<ChunkSize, List[Index]> extends InferNumber<infer Increment> ? ChunkComponent<Start, End, Increment, ChunkSize> extends InferChunkParts<infer Head, infer Tail> ? Enumerate<Head, Tail> : never : never : never; }; type FlatChunk<List extends unknown[], Result extends number[] = []> = List extends TailNumberArray<infer Head, infer Rest> ? FlatChunk<Rest, Concat<Result, Head>> : Result; type Range<From extends number, To extends number> = GenerateChunks<From, To> extends InferArray<infer Chunk, number[]> ? FlatChunk<Chunk> : never; interface TRange<From extends number | void = void, To extends number | void = void> extends Fn<{ 0: number; 1: number; }> { slot: [From, To]; data: Range<this[0], this[1]>; } type Reduce<List extends unknown[]> = { [K in Indices<List>]: List[K]; }; interface TReduce<List extends unknown[] | void = void> extends Fn<{ 0: unknown[]; }> { slot: [List]; data: Reduce<this[0]>; } type Reject<List extends unknown[], Element> = List extends [ infer Head, ...infer Rest ] ? [Head] extends [Element] ? Reject<Rest, Element> : [Head, ...Reject<Rest, Element>] : []; interface TReject<Element extends unknown | void = void, List extends unknown[] | void = void> extends Fn<{ 0: unknown; 1: unknown[]; }> { slot: [Element, List]; data: Reject<this[1], this[0]>; } type RetrieveHelper<List extends unknown, Index extends number> = List extends { [K in Index]: infer Head; } ? Head : never; type Retrieve<List extends unknown, Index extends number = 0> = Locate<List, Index> extends infer Position ? Position extends number ? RetrieveHelper<List, Position> : never : never; interface TRetrieve<Index extends number | void = 0, List extends unknown | void = void> extends Fn<{ 0: number; 1: unknown; }> { slot: [Index, List]; data: Retrieve<this[1], this[0]>; } type Reverse<List extends any[]> = List extends [ infer Head, ...infer Rest ] ? [...Reverse<Rest>, Head] : []; interface TReverse<List extends unknown[] | void = void> extends Fn<{ 0: unknown[]; }> { slot: [List]; data: Reverse<this[0]>; } type RotateLeftHelper<List extends unknown[], Pivot extends number = 0> = IsNever<Pivot> extends 0 ? Retrieve<List, Pivot> extends infer Element ? IsNever<Element> extends 1 ? List : Push<Concat<SliceTo<List, Pivot>, SliceFrom<List, Add$1<Pivot, 1>>>, Retrieve<List, Pivot>> : never : List; type RotateLeft<List extends unknown[], Pivot extends number = 0> = RotateLeftHelper<List, Locate<List, Pivot>>; interface TRotateLeft<Pivot extends number | void = 0, List extends unknown[] | void = void> extends Fn<{ 0: unknown; 1: unknown[]; }> { slot: [Pivot, List]; data: RotateLeft<this[1], this[0]>; } type RotateRight<List extends unknown[], Addendum extends unknown = never> = List extends [...infer Rest extends unknown[], infer Tail extends unknown] ? [[Addendum] extends [never] ? Tail : Addendum, ...Rest] : never; interface TRotateRight<Addendum extends unknown | void = never, List extends unknown[] | void = void> extends Fn<{ 0: unknown; 1: unknown[]; }> { slot: [Addendum, List]; data: RotateRight<this[1], this[0]>; } type Shift<List extends unknown[]> = List extends [ infer Element extends List[number], ...unknown[] ] ? Element : never; interface TShift<List extends unknown[] | void = void> extends Fn<{ 0: unknown[]; }> { slot: [List]; data: Shift<this[0]>; } type ShuffleStructure<Head extends unknown, Rest extends unknown[]> = [ head: Head, ...rest: Rest ]; type ShuffleHelper<List extends unknown[][], Head extends unknown, Result extends unknown[] = []> = Size<List> extends Size<Result> ? Result : List extends AnchorStructure<infer First, infer Rest> ? ShuffleHelper<Rest, Head, [...Result, ...Pivot<Unshift<First, Head>>]> : Result; type Shuffle<List extends unknown[]> = List extends ShuffleStructure<infer Head, infer Rest> ? Circle<Rest> extends CircleStructure<infer Revolution> ? Size<Revolution> extends 0 ? [List] : ShuffleHelper<Revolution, Head> : never : []; interface TShuffle<List extends unknown[] | void = void> extends Fn<{ 0: unknown[]; }> { slot: [List]; data: Shuffle<this[0]>; } type Size<List extends any[]> = List["length"]; interface TSize<List extends unknown[] | void = void> extends Fn<{ 0: unknown[]; }> { slot: [List]; data: Size<this[0]>; } type Slice<List extends unknown[], Start extends number = 0, End extends number = Size<List>> = List extends [infer First, ...infer Rest] ? Start extends 0 ? End extends 0 ? [] : [First, ...Slice<Rest, 0, Subtract$1<End, 1>>] : Slice<Rest, Subtract$1<Start, 1>, Subtract$1<End, 1>> : []; interface TSlice<Start extends number | void = void, End extends number | void = void, List extends unknown[] | void = void> extends Fn<{ 0: number; 1: number; 2: unknown[]; }> { slot: [Start, End, List]; data: Slice<this[2], this[0], this[1]>; } type SliceFromHelper<List extends unknown[], Start extends number> = List extends [...ArrayOf<Start>, ...infer Rest] ? Rest : never; type SliceFrom<List extends unknown[], Start extends number> = GreaterThan<Start, Size<List>> extends 1 ? SliceFromHelper<List, Size<List>> : LessThan<Start, 0> extends 1 ? SliceFromHelper<List, 0> : SliceFromHelper<List, Start>; interface TSliceFrom<Start extends number | void = void, List extends unknown[] | void = void> extends Fn<{ 0: number; 1: unknown[]; }> { slot: [Start, List]; data: SliceFrom<this[1], this[0]>; } type SliceToHelper<List extends unknown[], End extends number> = List extends [ ...infer Rest, ...ArrayOf<Subtract$1<Size<List>, End>> ] ? Rest : never; type SliceTo<List extends unknown[], End extends number = Size<List>> = GreaterThan<End, Size<List>> extends 1 ? SliceToHelper<List, Size<List>> : LessThan<End, 0> extends 1 ? [] : SliceToHelper<List, End>; interface TSliceTo<To extends number | void = void, List extends unknown[] | void = void> extends Fn<{ 0: number; 1: unknown[]; }> { slot: [To, List]; data: SliceTo<this[1], this[0]>; } type Some<Callback extends Fn, List extends Fn.Arguments<Callback>[]> = List extends [] ? 0 : List extends [ infer Element extends Fn.Arguments<Callback>, ...infer Rest extends Fn.Arguments<Callback>[] ] ? Apply<Callback, [Element]> extends 1 ? 1 : Some<Callback, Rest> : 0; interface TSome<Callback extends Fn, List extends Fn.Arguments<Callback> | void = void> extends Fn<{ 0: Fn; 1: Fn.Arguments<Callback>; }> { slot: [Callback, List]; data: Some<this[0], this[1]>; } type SortOperation<Callback extends Fn, Head extends Fn.Signature<Callback>, Rest extends Fn.Signature<Callback>[]> = [first: Head, ...rest: Rest]; type SortHelper<Callback extends Fn, Check extends Fn.Signature<Callback>, List extends Fn.Signature<Callback>[]> = List extends SortOperation<Callback, infer Head, infer Tail> ? Apply<Callback, [Head, Check]> extends 1 ? Unshift<SortHelper<Callback, Check, Tail>, Head> : Unshift<List, Check> : [Check]; type Sort<Callback extends Fn, List extends Fn.Signature<Callback>[]> = List extends SortOperation<Callback, infer First, infer Rest> ? SortHelper<Callback, First, Sort<Callback, Rest>> : List; interface TSort<Callback extends Fn, List extends Fn.Signature<Callback>[] | void = void> extends Fn<{ 0: Fn; 1: Fn.Signature<Callback>[]; }> { slot: [Callback, List]; data: Sort<this[0], this[1]>; } type Tail<List extends unknown[]> = List extends [ unknown, ...infer Tail extends List[number][] ] ? Tail : never; interface TTail<List extends unknown[] | void = void> extends Fn<{ 0: unknown[]; }> { slot: [List]; data: Tail<this[0]>; } type TrimHead<List extends unknown[], Element> = List extends [ infer Head, ...infer Rest ] ? [Head] extends [Element] ? TrimHead<Rest, Element> : List : List; interface TTrimHead<Element extends unknown | void = void, List extends unknown[] | void = void> extends Fn<{ 0: unknown; 1: unknown[]; }> { slot: [Element, List]; data: TrimHead<this[1], this[0]>; } type TrimTail<List extends unknown[], Element> = List extends [ ...infer Rest, infer Tail ] ? [Tail] extends [Element] ? TrimTail<Rest, Element> : List : List; interface TTrimTail<Element extends unknown | void = void, List extends unknown[] | void = void> extends Fn<{ 0: unknown; 1