import type { MonadsTransform, Unwrapped, Promised, Wrapped, Monad, } from "./monad.types"; import type { Equal, Last } from "../utils/types"; type γs = γ[]; type λs = λ[]; type γ = A extends any[] ? (..._: A) => Z : never; type λ = (_: Wrapped, Awaited>) => Z; type λ2 = [γ, λ]; type λ3 = [...λ2, λ]; type λ4 = [...λ3, λ]; type λ5 = [...λ4, λ]; // prettier-ignore type λ6 = [...λ5, λ]; // prettier-ignore type λ7 = [...λ6, λ]; // prettier-ignore type λ8 = [...λ7, λ]; type λ_ = [ ...λ8, ...λn ]; type λn = Z extends [ λ, ...infer Rest ] ? Rest extends [any, ...any] ? [λ, ...λn] : [λ] : Z; type Type = "pipe" | "pipeline"; type Awaits = { -readonly [P in keyof T]: Awaited }; type Returns = { -readonly [P in keyof T]: ReturnType }; type Thenable = T | Monad | Promise; type Thenify = T extends [infer Item, ...infer Rest] ? [Thenable, ...Thenify] : T; type Spread = T extends [infer A extends any[], ...infer B] ? [...A, ...B] : T; type Wrappers = MonadsTransform>; type Rewrap = Unwrapped< Wrappers, Wrapped, Awaited> >; type Resolve = MonadsTransform> extends [] ? Last : Rewrap>; type To = Y extends "pipeline" ? ( ..._: Equal, T, T, Thenify> ) => Promised, Resolve> : Resolve; type Either = Equal; // prettier-ignore type Flow = { (): To; (_: γ, B>): To, B]>; (..._: λ2, Either, B, C>): To, B, C]>; (..._: λ3, Either, B, C, D>): To, B, C, D]>; (..._: λ4, Either, B, C, D, E>): To, B, C, D, E]>; (..._: λ5, Either, B, C, D, E, F>): To, B, C, D, E, F]>; (..._: λ6, Either, B, C, D, E, F, G>): To, B, C, D, E, F, G]>; (..._: λ7, Either, B, C, D, E, F, G, H>): To, B, C, D, E, F, G, H]>; (..._: λ8, Either, B, C, D, E, F, G, H, I>): To, B, C, D, E, F, G, H, I]>; ( ..._: λ_, Either, B, C, D, E, F, G, H, I, Z> ): To, B, C, D, E, F, G, H, I, ...Returns]>; }; type Pipeline = Flow<"pipeline">; type Pipe = (...data: T) => Flow<"pipe", T>; export type { Pipeline, Pipe };