import type { HKT, HKT2, Apply, Apply2 } from '../hkt.js'; import type { Optic, Class, B, S } from './optic.js'; import { Prop } from './prop.js'; interface ComposeA extends HKT { 0: Apply>>; } interface ComposeT extends HKT2 { 0: Apply2, Apply2>, B>>; } type ClassTable = { Equivalence: { Equivalence: 'Equivalence'; Iso: 'Iso'; Lens: 'Lens'; Prism: 'Prism'; Traversal: 'Traversal'; Getter: 'Getter'; AffineFold: 'AffineFold'; Fold: 'Fold'; Setter: 'Setter'; }; Iso: { Equivalence: 'Iso'; Iso: 'Iso'; Lens: 'Lens'; Prism: 'Prism'; Traversal: 'Traversal'; Getter: 'Getter'; AffineFold: 'AffineFold'; Fold: 'Fold'; Setter: 'Setter'; }; Lens: { Equivalence: 'Lens'; Iso: 'Lens'; Lens: 'Lens'; Prism: 'Prism'; Traversal: 'Traversal'; Getter: 'Getter'; AffineFold: 'AffineFold'; Fold: 'Fold'; Setter: 'Setter'; }; Prism: { Equivalence: 'Prism'; Iso: 'Prism'; Lens: 'Prism'; Prism: 'Prism'; Traversal: 'Traversal'; Getter: 'AffineFold'; AffineFold: 'AffineFold'; Fold: 'Fold'; Setter: 'Setter'; }; Traversal: { Equivalence: 'Traversal'; Iso: 'Traversal'; Lens: 'Traversal'; Prism: 'Traversal'; Traversal: 'Traversal'; Getter: 'Fold'; AffineFold: 'Fold'; Fold: 'Fold'; Setter: 'Setter'; }; Getter: { Equivalence: 'Getter'; Iso: 'Getter'; Lens: 'Getter'; Prism: 'AffineFold'; Traversal: 'Fold'; Getter: 'Getter'; AffineFold: 'AffineFold'; Fold: 'Fold'; Setter: never; }; AffineFold: { Equivalence: 'AffineFold'; Iso: 'AffineFold'; Lens: 'AffineFold'; Prism: 'AffineFold'; Traversal: 'Fold'; Getter: 'AffineFold'; AffineFold: 'AffineFold'; Fold: 'Fold'; Setter: never; }; Fold: { Equivalence: 'Fold'; Iso: 'Fold'; Lens: 'Fold'; Prism: 'Fold'; Traversal: 'Fold'; Getter: 'Fold'; AffineFold: 'Fold'; Fold: 'Fold'; Setter: never; }; Setter: { Equivalence: never; Iso: never; Lens: never; Prism: never; Traversal: never; Getter: never; AffineFold: never; Fold: never; Setter: never; }; }; export type ComposeC = C1 extends keyof ClassTable ? C2 extends keyof ClassTable[C1] ? ClassTable[C1][C2] : never : never; type ToOptic = O extends string ? Prop : O extends Optic ? O : never; type Compose1 = ToOptic extends Optic ? ToOptic extends Optic ? Optic, ComposeA, ComposeT, R> : never : never; export type Compose = T extends [ infer First, infer Second, ...infer Rest ] ? Compose1> : T extends [infer First] ? ToOptic : never; export type ComposeArg = string | Optic; export declare function compose(...args: T): Compose; export {};