/**
* Forked from ts-toolbelt
* https://github.com/millsp/ts-toolbelt/blob/9c27a61b39eae7f2794c349973e78023894885c3/sources/Any/Compute.ts#L1
*/
/**
* @hidden
*/
export type ComputeRaw = A extends Function ? A : { [K in keyof A]: A[K] } & unknown
/**
* @hidden
*/
type ComputeFlat = A extends BuiltIn
? A
: A extends Array
? A extends Array>
? Array<{ [K in keyof A[number]]: A[number][K] } & unknown>
: A
: A extends ReadonlyArray
? A extends ReadonlyArray>
? ReadonlyArray<{ [K in keyof A[number]]: A[number][K] } & unknown>
: A
: { [K in keyof A]: A[K] } & unknown
/**
* @hidden
*/
type ComputeDeep = A extends BuiltIn
? A
: If<
Has,
A,
A extends Array
? A extends Array>
? Array<{ [K in keyof A[number]]: ComputeDeep } & unknown>
: A
: A extends ReadonlyArray
? A extends ReadonlyArray>
? ReadonlyArray<{ [K in keyof A[number]]: ComputeDeep } & unknown>
: A
: { [K in keyof A]: ComputeDeep } & unknown
>
/**
* Force TS to load a type that has not been computed (to resolve composed
* types that TS haven't fully resolved, for display purposes mostly).
* @param A to compute
* @returns `A`
* @example
*/
export type Compute = {
flat: ComputeFlat
deep: ComputeDeep
}[depth]
type Depth = 'flat' | 'deep'
export type Boolean = 0 | 1
type Key = string | number | symbol
/**
* Check whether `U` contains `U1`
* @param U to be inspected
* @param U1 to check within
* @returns [[Boolean]]
* @example
*/
type Has = [U1] extends [U] ? 1 : 0
type BuiltIn = Function | Error | Date | { readonly [Symbol.toStringTag]: string } | RegExp | Generator
export type If = {
0: Else
1: Then
}[B]