UNPKG

@typed/lenses

Version:

Strongly-typed functional lenses

25 lines 1.35 kB
import { Head, Tail } from '@typed/lambda'; import { Lens, LensInput, LensOutput } from './Lens'; import { PathLens } from './PathLens'; import { PropLens } from './PropLens'; export declare type PipeLenses<A extends Lenses> = A extends ReadonlyArray<PropLens<any>> ? PathLens<GetPropKeys<A>> : GetPipedLenses<LensInput<Head<A>>, LensOutput<Head<A>>, Tail<A>>; export declare function pipe<A extends Lenses>(...lenses: A): PipeLenses<A>; declare type GetPropKeys<A extends Lenses> = { [K in keyof A]: A[K] extends PropLens<infer R> ? R : never; }; declare type Lenses = readonly [Lens<any, any>, Lens<any, any>, ...ReadonlyArray<Lens<any, any>>]; declare type GetPipedLenses<I, O, Lenses extends ReadonlyArray<Lens<any, any>>> = Lens<I, VerifyLensesAreValidAndGetOutput<O, Lenses>>; declare type VerifyLensesAreValidAndGetOutput<O, A extends ReadonlyArray<Lens<any, any>>> = { complete: O extends LensInput<Head<A>> ? LensOutput<Head<A>> : { error: 'Invalid Lens composition'; from: O; to: LensInput<Head<A>>; }; continue: O extends LensInput<Head<A>> ? VerifyLensesAreValidAndGetOutput<LensOutput<Head<A>>, Tail<A>> : { error: 'Invalid Lens composition'; from: O; to: LensInput<Head<A>>; }; }[Tail<A> extends [] ? 'complete' : 'continue']; export {}; //# sourceMappingURL=pipe.d.ts.map