import { _apply, _Type } from './apply'; import { Type } from './Type'; import { Next } from './utils'; export { Flow }; type Flow<$Ts extends Composable, Composable extends (_Type & { contra: any; })[] = $Ts extends [_Type] ? [_Type] : Check<$Ts>> = Composition<{ type: Fallback<$Ts>; constraints: $Ts[0]['constraints']; names: $Ts[0]['names']; }, $Ts>; type Descriptor = { type: any; constraints: any; names: any; }; interface Composition extends Type { type: unknown[] extends this['arguments'] ? D['type'] : Pipe<[_apply<$Ts[0], this['arguments']>], $Ts>; names: D['names']; constraints: D['constraints']; contra: $Ts[0]['contra']; namedConstraints: $Ts[0]['namedConstraints']; } type Fallback<$Ts> = $Ts extends [...any, infer $T extends { type: unknown; }] ? $T['type'] : never; export type Check = T extends [infer A extends _Type, infer B extends _Type, ...infer Rest] ? Check2 extends infer C extends [_Type, _Type] ? Check : never : T extends [infer A extends _Type, infer B extends _Type] ? [...R, ...Last, ...Check2] : T extends [infer A extends _Type] ? Last extends [] ? [...R, A] : [...R, ...Check2] : [...R, ...Last]; type Check2 = A['type'] extends B['constraints'][0] ? [A, B] : [Type, B]; type Pipe, N extends number = Next> = N extends $Ts['length'] ? R : R extends $Ts[N]['constraints'][0] ? Pipe<[R], $Ts, N> : never;