/** @module helper-types.ts */ export declare enum adtn { ap = "babakness/ap", map = "babakness/map", chain = "babakness/chain", flatMap = "babakness/flatMap" } declare global { interface ArrayConstructor { _URI: 'Array'; } interface Array { [adtn.ap]: (a: any) => U[]; of: T[]; } } export declare type EntryKeyValue = A extends [infer KEY, infer VALUE] ? [KEY, VALUE] : undefined; export declare type EntryKey = A extends [infer KEY, infer VALUE] ? KEY : undefined; export declare type EntryValue = A extends [infer KEY, infer VALUE] ? VALUE : undefined; export declare type Flat = number | string | symbol; export declare type Pairs = Array<[A, B]>; export interface Obj { [k: string]: T; } export declare type Predicate = (x: A) => boolean; export declare type Predicate2 = (x: A, y: B) => boolean; export declare type Complement = Exclude extends never ? boolean : Exclude; export declare type FlattenArray = T extends any[][] ? T[number] : T; export declare type Omit = T extends any ? Pick> : never; export declare type Optional = T extends any ? Omit & { [P in K]?: T[K]; } : never; export declare type ValueAt = G[I]; export declare type ValueOf = T[Exclude]; export declare type KeyOf = Exclude; export declare type KeyTypes = string | number | symbol; export declare type Unpacked = T extends Array ? U : T extends (...args: any[]) => infer U ? U : T extends Promise ? U : T; export declare type Function1 = (a: A) => B; export declare type Function2 = (a: A, b: B) => C; export declare type Function3 = (a: A, b: B, c: C) => D; export declare type Function4 = (a: A, b: B, c: C, d: D) => E; export declare type Function5 = (a: A, b: B, c: C, d: D, e: E) => F; export declare type Function6 = (a: A, b: B, c: C, d: D, e: E, f: F) => G; export declare type Function7 = (a: A, b: B, c: C, d: D, e: E, f: F, g: G) => H; export declare type Function8 = (a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H) => I; export declare type Function9 = (a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, i: I) => J; export declare type FunctionV = (...a: A[]) => B; export declare type Function_21 = (a: A, b: B) => (c: C) => D; export declare type Function_211 = (a: A, b: B) => (c: C) => (d: D) => E; export declare type Function_22 = (a: A, b: B) => (c: C, d: D) => E; export declare type Function_31 = (a: A, b: B, c: C) => (d: D) => E; export declare type Function_2111 = (a: A, b: B) => (c: C) => (d: D) => (e: E) => F; export declare type Function_311 = (a: A, b: B, c: C) => (d: D) => (e: E) => F; export declare type Function_41 = (a: A, b: B, c: C, d: D) => (e: E) => F; export declare type Function_51 = (a: A, b: B, c: C, d: D, e: E) => (f: F) => G; export declare type Function_61 = (a: A, b: B, c: C, d: D, e: E, f: F) => (g: G) => H; export declare type Curried1 = (a: A) => B; export declare type Curried2 = (a: A) => (b: B) => C; export declare type Curried3 = (a: A) => (b: B) => (c: C) => D; export declare type Curried4 = (a: A) => (b: B) => (c: C) => (d: D) => E; export declare type Curried5 = (a: A) => (b: B) => (c: C) => (d: D) => (e: E) => F; export declare type Curried6 = (a: A) => (b: B) => (c: C) => (d: D) => (e: E) => (f: F) => G; export declare type Curried7 = (a: A) => (b: B) => (c: C) => (d: D) => (e: E) => (f: F) => (g: G) => H; export declare type Curried8 = (a: A) => (b: B) => (c: C) => (d: D) => (e: E) => (f: F) => (g: G) => (h: H) => I; export declare type Curried9 = (a: A) => (b: B) => (c: C) => (d: D) => (e: E) => (f: F) => (g: G) => (h: H) => (i: I) => J; export interface Functor { map(fn: Function1): Functor; } export interface Apply extends Functor { ap(fn: Apply<(a: A) => B>): Apply; } export interface ArrayApply extends Functor { [adtn.ap](fn: Apply<(a: A) => B>): ArrayApply; } export interface Applicative { of(val: A): Apply; } export interface Applicative { of(val: A): Apply; } export interface ArrayApplicative { _URI: F; of(val: A): ArrayApply; } export interface Filterable { filter(fn: Predicate): Filterable; } export interface HKT0 { readonly _URI: F; } export interface Pushable { readonly concat: (item: A) => Pushable; } export interface Concattable { readonly concat: (item: A) => Concattable; } export interface Curried { (b: B, a: A): Z; (b: B): (a: A) => Z; } export declare type FunctionPropertyNames = { [K in keyof T]: T[K] extends AnyFunction ? K : never; }[keyof T]; export declare type FunctionProperties = Pick>; export declare type ObjectPropertyNamesByType = { [K in keyof O]: O[K] extends T ? K : never; }[keyof O]; export declare type ObjectPropertiesByType = Pick>; export declare type ToTuple = T extends any[] ? T : any[]; declare type AnyArray = any[]; export declare type Prepend = ((_: Addend, ..._1: Tuple) => any) extends ((..._: infer Result) => any) ? Result : never; export declare type Last = { 'empty': Default; 'single': Tuple extends [infer SoleElement] ? SoleElement : never; 'multi': ((..._: Tuple) => any) extends ((_: any, ..._1: infer Next) => any) ? Last : Default; 'infinite': Tuple extends Array ? Element : never; }[Tuple extends [] ? 'empty' : Tuple extends [any] ? 'single' : Tuple extends Array ? Element[] extends Tuple ? 'infinite' : 'multi' : never]; export declare type Reverse = { 'empty': Prefix; 'nonEmpty': ((..._: Tuple) => any) extends ((_: infer First, ..._1: infer Next) => any) ? Reverse> : never; 'infinite': { ERROR: 'xCannot reverse an infinite tuple'; CODENAME: 'InfiniteTuple'; }; }[Tuple extends [any, ...any[]] ? IsFinite : 'empty']; export declare type IsFinite = { empty: Finite; nonEmpty: ((..._: Tuple) => any) extends ((_: infer First, ..._1: infer Rest) => any) ? IsFinite : never; infinite: Infinite; }[Tuple extends [] ? 'empty' : Tuple extends Array ? Element[] extends Tuple ? 'infinite' : 'nonEmpty' : never]; declare type _Concat = { 'emptyLeft': Right; 'singleLeft': Left extends [infer SoleElement] ? Prepend : never; 'multiLeft': ((..._: Reverse) => any) extends ((_: infer LeftLast, ..._1: infer ReversedLeftRest) => any) ? _Concat, Prepend> : never; 'infiniteLeft': { ERROR: 'Left is not finite'; CODENAME: 'InfiniteLeft' & 'Infinite'; }; }[Left extends [] ? 'emptyLeft' : Left extends [any] ? 'singleLeft' : IsFinite]; export declare type Tail = ((...t: Tuple) => void) extends ((h: any, ...rest: infer R) => void) ? R : never; export declare type Init = Reverse>>; export declare type FlattenOnce = DeepFlatten; export declare type Append = Reverse, B>>; export declare type Concat = B extends any[] ? _Concat : Append; export declare type Head = ((..._: A) => any) extends ((_: infer First, ..._1: infer Next) => any) ? First : ValueAt; /** Essentials */ export declare type Primitive = string | number | boolean | undefined | null; /** Dictionaries related */ export declare type Dictionary = { [key in K]: T; }; export declare type DictionaryValues = T extends Dictionary ? U : never; /** Like Partial but recursive */ export declare type DeepPartial = { [P in keyof T]?: T[P] extends Array ? Array> : T[P] extends ReadonlyArray ? ReadonlyArray> : DeepPartial; }; export declare type StrictPartial = { [K in keyof P]: K extends keyof O ? O[K] : never; }; export declare type DeepPartialFlexibleType = { [P in keyof T]?: T[P] extends Array ? Array> : T[P] extends ReadonlyArray ? ReadonlyArray> : DeepPartialFlexibleType; }; /** Like Readonly but recursive */ export declare type DeepReadonly = T extends Primitive ? T : T extends Array ? ReadonlyArray : T extends AnyFunction ? T : DeepReadonlyObject; declare type DeepReadonlyObject = { readonly [P in keyof T]: DeepReadonly; }; /** Easy create opaque types ie. types that are subset of their original types (ex: positive numbers, uppercased string) */ export declare type Opaque = T & { __TYPE__: K; }; export declare type FlattenType = { 'deeper': A extends Array ? U extends any[] ? FlattenType : never : never; 'done': A extends Array ? U : never; }[A extends Array> ? 'deeper' : 'done']; export declare type Identity = (a: A) => A; export declare type WidenType = T extends string ? string : T extends number ? number : T extends boolean ? boolean : T extends symbol ? symbol : T extends Function ? Function : T extends object ? object : T extends undefined ? undefined : T extends null ? null : T; declare type _Deeper = 'deeper' | 'next'; declare type _Pass = 'flattenType' | 'markInfinite' | 'error' | 'pass'; declare type _Advance = 'advance' | 'advanceWide'; export declare type DeepFlatten = { 'advance': ((..._: A) => any) extends ((_: infer First, ..._1: infer Next) => any) ? DeepFlatten : never, Deeper, Advance, Pass> : never; 'advanceWide': ((..._: A) => any) extends ((_: infer First, ..._1: infer Next) => any) ? DeepFlatten> : never, Deeper, Advance, Pass> : never; 'deeper': ((..._: A) => any) extends ((_: infer First, ..._1: infer Next) => any) ? DeepFlatten> : never, Deeper, Advance, Pass> : never; 'pass': ((..._: A) => any) extends ((_: infer First, ..._1: infer Next) => any) ? DeepFlatten : never, Deeper, Advance, Pass> : never; 'flattenType': ((..._: A) => any) extends ((_: infer First, ..._1: infer Next) => any) ? DeepFlatten> : never, Deeper, Advance, Pass> : never; 'markInfinite': ((..._: A) => any) extends ((_: infer First, ..._1: infer Next) => any) ? DeepFlatten : never, Deeper, Advance, Pass> : never; 'error': { ERROR: 'Infinite Item'; TEXT: 'Encountered an infinite item, evaluation haulted'; }; 'done': N; }[A extends [] ? 'done' : ((..._: A) => any) extends ((_: infer First, ..._1: infer Next) => any) ? First extends any[] ? IsFinite extends true ? Deeper : Pass : 'advance' : never]; export declare type BasicTypes = string | number | boolean | symbol | object | undefined | null | void | never; export declare type WidenArray = T extends Array ? U[] : T; /** * Deeply flattens a tuple and widens literals to general types */ export declare type DeepFlattenAndGeneralizeTuple = WidenArray>; export declare type ContainsInfinite = { 'next': ((..._: A) => any) extends ((_: infer First, ..._1: infer Next) => any) ? ContainsInfinite> : never; 'done': false; 'found': true; }[A extends [] ? 'done' : ((..._: A) => any) extends ((_: infer First, ..._1: infer Next) => any) ? IsFinite extends true ? 'next' : 'found' : 'done']; export declare type ContainsType = { 'next': ((..._: A) => any) extends ((_: infer First, ..._1: infer Next) => any) ? ContainsType> : never; 'done': false; 'found': true; }[A extends [] ? 'done' : ((..._: A) => any) extends ((_: infer First, ..._1: infer Next) => any) ? T extends First ? 'found' : 'next' : 'done']; declare type _DeepFlattenNoInfinite = ContainsInfinite extends true ? DeepFlattenAndGeneralizeTuple : T; /** * Deeply flatten a type, keeps literals unless there is an infinite type found */ export declare type DeepFlattenNoInfinite = { 'generalize': _DeepFlattenNoInfinite; }[T extends any[] ? 'generalize' : never]; export declare type Equals = A extends B ? B extends A ? T : F : F; export declare type Contains = { 'next': ((..._: A) => any) extends ((_: infer First, ..._1: infer Next) => any) ? Contains : never; 'found': T; 'done': F; }[A extends [] ? 'done' : ((..._: A) => any) extends ((_: infer First, ..._1: infer Next) => any) ? Equals : never]; export declare type Unique = { 'exclude': ((..._: A) => any) extends ((_: infer First, ..._1: infer Next) => any) ? Unique : never; 'include': ((..._: A) => any) extends ((_: infer First, ..._1: infer Next) => any) ? R extends ([] | [any, ...any[]]) ? Unique, O> : Unique : never; 'never': 'never'; 'simplify': WidenArray; 'done': R; }[A extends [] ? 'done' : ((..._: A) => any) extends ((_: infer First, ..._1: infer Next) => any) ? IsFinite extends true ? Contains : 'simplify' : never]; export declare type AppendUnique = { 'next': Append; 'done': A; }[Contains]; export declare type Indices = Exclude; export declare type Literal] = [(A | B | C), ...Array]> = Narrow; export declare type KeySubset = Exclude> extends never ? true : false; export declare type HashKey = 'uuS*4_G]Sv<4eu-P""1giCjl3K~nLl[m>ePO9m/1ys?7:LH&A)MCr:a8g{X};8b'; export declare type IsAny = HashKey extends O ? any extends O ? T : F : F; export declare type ContainsAny = { 'next': ((..._: A) => any) extends ((_: infer First, ..._1: infer Next) => any) ? ContainsAny> : never; 'found': T; 'done': F; }[A extends [] ? 'done' : ((..._: A) => any) extends ((_: infer First, ..._1: infer Next) => any) ? IsAny : 'done']; export declare type AnyObject = { [K in string]: any; }; export declare type IsArray = A extends Array ? T : F; export declare type Merge = { 'merge': { [I in keyof C]: I extends keyof B ? B[I] : C[I]; }; 'done': { [I in string]: unknown; }; 'array': 'ERROR: this type function is not design to merge arrays'; }[IsArray>>]; export declare type AnyFunction = (...args: any[]) => any; export declare type ExtractFunctionArguments = Fn extends (...args: infer P) => any ? P : never; export declare type ExtractFunctionReturnValue = Fn extends (...args: any[]) => infer P ? P : never; export declare type ItemInsideIterable = { 'iterable': I extends Iterable ? U : never; 'nodelist': I extends NodeListOf ? U : never; }[I extends Iterable ? 'iterable' : I extends NodeListOf ? 'nodelist' : never]; export {};