@constellar/core
Version:
state manipulation primitives
480 lines (346 loc) • 24.8 kB
TypeScript
declare type AnyMachine<Event extends Typed, State extends Typed, Ctx extends unknown[] = [], DerivedLocal = object, Derived = object> = {
derive?: ((s: Prettify<DerivedLocal & State>) => Derived) | Derived;
init: Init<Sendable<State>, any>;
states: AnyStates<Event, State, Ctx, DerivedLocal, Derived>;
};
declare type AnyStates<Event extends Typed, State extends Typed, Ctx extends unknown[], DerivedLocal, Derived> = {
[StateType in State['type']]: {
always?: (<S extends {
type: StateType;
} & Derived & DerivedLocal & State>(state: S) => Sendable<State> | undefined) | Sendable<State>;
events?: Partial<{
[EventType in Event['type']]: (<E extends {
type: EventType;
} & Event, S extends {
type: StateType;
} & Derived & DerivedLocal & State>(event: E, state: S, ...args: Ctx) => Sendable<State> | undefined | void) | Sendable<State>;
}>;
wildcard?: (<E extends {
type: Event;
} & Event, S extends {
type: StateType;
} & Derived & DerivedLocal & State>(event: E, state: S, ...args: Ctx) => Sendable<State> | undefined | void) | Sendable<State>;
};
} & (DerivedLocal extends {
[K in keyof DerivedLocal]: never;
} ? {
[StateType in State['type']]: object;
} : {
[StateType in State['type']]: {
derive: ((state: Prettify<{
type: StateType;
} & State>) => DerivedLocal) | DerivedLocal;
};
});
export declare function append<T>(x: T, xs: T[]): T[];
export declare function apply<P, Q>(f: (p: P) => Q, p: P): Q;
export declare type AreEqual<T> = (a: T, b: T) => boolean;
declare type ArgOfInit<T> = T extends (p: infer R) => any ? R : void;
export declare function at<X>(index: number): <Mega, FL, CL, SL>(l: IOptic<X[], Mega, FL, CL, SL>) => COptic<X, Mega, FL | undefined, typeof REMOVE, never>;
declare type Com<Part, Whole> = (p: Part, w: Whole) => Whole;
export declare class COptic<Part, Whole, Fail, Command, S> implements IOptic<Part, Whole, Fail, Command, S> {
com: Com<Command, Whole>;
getter?: Getter<Part, Whole, Fail>;
isCommand: (v: unknown) => v is Command;
isFailure: (v: unknown) => v is Fail;
mapper: Mapper<Part, Whole>;
refold: <Acc>(fold: FoldFn<Part, Acc, Ctx>) => FoldFn<Whole, Acc, Ctx>;
setter?: Setter<Part, Whole, S>;
constructor(opts: {
com: Com<Command, Whole>;
getter?: Getter<Part, Whole, Fail>;
isCommand: (v: unknown) => v is Command;
isFailure: (v: unknown) => v is Fail;
mapper: Mapper<Part, Whole>;
refold: <Acc>(fold: FoldFn<Part, Acc, Ctx>) => FoldFn<Whole, Acc, Ctx>;
setter?: Setter<Part, Whole, S>;
});
static eq<Whole>(): COptic<Whole, Whole, never, never, unknown>;
command(token: Command, whole: Whole): Whole;
fold<Acc>(form: FoldForm<Part, Acc, Ctx>, whole: Whole): Acc;
modify(mod: Modify<Part>, whole: Whole): Whole;
put(part: Part, whole: S | Whole): Whole;
update(arg: ((p: Part) => Part) | Command | Part): (whole: Whole) => Whole;
view<A = undefined>(whole: Whole, or?: Init<A, Fail>): (Fail extends never ? never : A) | Part;
}
export declare type Ctx = {
close: () => void;
};
export declare const ctxNull: Ctx;
export declare function curry<P extends unknown[], Q extends unknown[], R>(f: (...args: [...P, ...Q]) => R, ...args: P): (...args2: Q) => R;
export declare function curry1<A, Args extends unknown[], R>(f: (...args: [A, ...Args]) => R): (a: A) => (...args: Args) => R;
export declare function dedupe<Whole>(areEqual?: (a: Whole, b: Whole) => unknown): <Mega, FL, CL, SL>(l: IOptic<Whole, Mega, FL, CL, SL>) => COptic<Whole, Mega, FL, never, never>;
export declare function disabled<Part>(value: ((p: Part) => Part) | Part): <Whole, Fail, Command, S>(o: COptic<Part, Whole, Fail, Command, S>) => COptic<boolean, Whole, never, never, never>;
export declare type EffectsHandlers<Event, SubState> = SubState extends {
effects?: unknown;
} ? {
[Key in keyof Exclude<SubState['effects'], undefined>]: (e: Exclude<Exclude<SubState['effects'], undefined>[Key], undefined>, send: (event: Event) => void) => (() => void) | void;
} : never;
export declare function elems<X>(): <Mega, FL, CL, SL>(l: IOptic<X[], Mega, FL, CL, SL>) => COptic<X, Mega, FL | undefined, never, never>;
declare type ExtractEvent<Transition> = Transition extends (e: infer E, ...args: any[]) => any ? E : void;
declare type ExtractEventObject<Transitions extends Record<string, unknown>> = {
[K in keyof Transitions]: {
type: K;
} & ExtractEvent<Transitions[K]>;
};
declare type ExtractEvents<Transitions extends Record<PropertyKey, unknown>> = UnionValues<ExtractEventObject<Transitions>>;
declare type Final<State extends Typed, States extends Record<string, unknown>> = FinalStates<States> & State;
declare type FinalStates<States extends Record<string, unknown>> = FinalStatesByKey<States>[keyof States & string];
declare type FinalStatesByKey<States extends Record<string, unknown>> = {
[Type in keyof States & string]: IsFinal<Type, States>;
};
export declare function findMany<X, Y extends X>(p: (x: X) => x is Y): <A, F, C, S>(o: IOptic<X[], A, F, C, S>) => COptic<Y[], A, F, never, NON_PRISM>;
export declare function findMany<X>(p: (x: X) => unknown): <A, F, C, S>(o: IOptic<X[], A, F, C, S>) => COptic<X[], A, F, never, NON_PRISM>;
export declare function findOne<X, Y extends X>(p: (x: X) => x is Y): <Mega, F2, C2, S>(o: IOptic<X[], Mega, F2, C2, S>) => COptic<Y, Mega, F2 | undefined, typeof REMOVE, NON_PRISM>;
export declare function findOne<X>(p: (x: X) => unknown): <Mega, F2, C2, S>(o: IOptic<X[], Mega, F2, C2, S>) => COptic<X, Mega, F2 | undefined, typeof REMOVE, NON_PRISM>;
export declare function flow<TArgs, R1, R2, R3, R4, R5, R6, R7>(args: TArgs, f1: (args: TArgs) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7): R7;
export declare function flow<TArgs, R1, R2, R3, R4, R5, R6>(args: TArgs, f1: (args: TArgs) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6): R6;
export declare function flow<TArgs, R1, R2, R3, R4, R5>(args: TArgs, f1: (args: TArgs) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5): R5;
export declare function flow<TArgs, R1, R2, R3, R4>(args: TArgs, f1: (args: TArgs) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4): R4;
export declare function flow<TArgs, R1, R2, R3>(args: TArgs, f1: (args: TArgs) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3): R3;
export declare function flow<TArgs, R1, R2>(args: TArgs, f1: (args: TArgs) => R1, f2: (a: R1) => R2): R2;
export declare function flow<TArgs, R1>(args: TArgs, f1: (args: TArgs) => R1): R1;
export declare type Focus<Part, Whole, Fail, Command, T> = (eq: COptic<Whole, Whole, never, never, void>) => COptic<Part, Whole, Fail, Command, T>;
export declare function focus<Whole>(): <Part, Fail, Command, S>(o: Focus<Part, Whole, Fail, Command, S>) => COptic<Part, Whole, Fail, Command, S>;
export declare type FoldFn<Part, Acc, Ctx> = (p: Part, acc: Acc, ctx: Ctx) => Acc;
export declare interface FoldForm<Part, Acc, C> {
foldFn: FoldFn<Part, Acc, C>;
init: Init<Acc>;
}
export declare function forbidden<Part, Whole>(_part: Part, _whole: Whole): Whole;
export declare const fromArray: <T>(xs: T[]) => UnfoldForm<T, number>;
export declare function fromInit<T>(init: Init<T, void>): T;
export declare function fromSendable<Event extends Typed>(event: Sendable<Event>): Event;
declare type Getter<Part, Whole, Fail> = (w: Whole) => Fail | Part;
export declare function head<X>(): <Mega, FL, CL, SL>(l: IOptic<X[], Mega, FL, CL, SL>) => COptic<X, Mega, FL | undefined, typeof REMOVE, never>;
export declare interface ICtx<Whole, Index> {
close: () => void;
index: Index;
whole: Whole;
}
export declare function id<T>(t: T): T;
export declare interface IMachine<Event, State, RWCtx extends unknown[], Transformed, SubState, Final> {
getFinal: (transformed: Transformed) => Final | undefined;
init: () => State;
reducer: (event: Event, transformed: Transformed, ...args: RWCtx) => State | undefined;
transform: (state: State) => Transformed;
visit: <Acc>(acc: Acc, fold: (subState: SubState, acc: Acc, index: string) => Acc, transformed: Transformed) => Acc;
}
export declare function includes<X>(x: X): <Mega, FL, CL, SL>(l: IOptic<X[], Mega, FL, CL, SL>) => COptic<boolean, Mega, FL, never, never>;
export declare type Init<T, P = void> = ((p: P) => T) | T;
export declare function insert<T>(index: number, x: T, xs: T[]): T[];
export declare function insertValue<X>(element: X, xs: X[]): X[];
export declare interface IOptic<Part, Whole, Fail, Command, S> {
com: Com<Command, Whole>;
getter?: Getter<Part, Whole, Fail>;
isCommand: (v: unknown) => v is Command;
isFailure: (v: unknown) => v is Fail;
mapper: Mapper<Part, Whole>;
refold: <Acc>(fold: FoldFn<Part, Acc, Ctx>) => FoldFn<Whole, Acc, Ctx>;
setter?: Setter<Part, Whole, S>;
}
declare type IOpticArgs<Part, Whole, Fail, Command, S> = IOptional<Part, Whole, Fail, Command, S> | ITraversal<Part, Whole, Fail, Command>;
declare interface IOpticBase<Part, Whole, Fail, Command, S> {
command: Com<Command, Whole>;
getter?: Getter<Part, Whole, Fail>;
isCommand: (v: unknown) => v is Command;
isFailure: (v: unknown) => v is Fail;
mapper?: Mapper<Part, Whole>;
refold?: <Acc>(mod: FoldFn<Part, Acc, Ctx>) => FoldFn<Whole, Acc, Ctx>;
setter?: Setter<Part, Whole, S>;
}
declare interface IOptional<Part, Whole, Fail, Command, S> extends IOpticBase<Part, Whole, Fail, Command, S> {
getter: Getter<Part, Whole, Fail>;
setter: Setter<Part, Whole, S>;
}
export declare function isDisabled<Event, State, Message extends Typed, Transformed, SubState, Final>(machine: IMachine<Event, State, MessageCtx<Message>, Transformed, SubState, Final>, transformed: Transformed, event: Event): boolean;
export declare function isEmpty(obj?: object): boolean;
export declare type IsFinal<Type extends string, States extends Record<Type, unknown>> = States[Type] extends {
always: unknown;
} ? never : States[Type] extends {
wildcard: unknown;
} ? never : States[Type] extends {
events: unknown;
} ? keyof States[Type]['events'] extends never ? {
type: Type;
} : never : {
type: Type;
};
export declare function isFunction<T>(x: T): x is ((...args: any[]) => any) & T;
export declare function isNever(_v: unknown): _v is never;
export declare function iso<Part, Whole>({ getter, mapper, setter, }: {
getter: (whole: Whole) => Part;
mapper?: Mapper<Part, Whole>;
setter: (part: Part) => Whole;
}): <Mega, FL, CL, SL>(l: IOptic<Whole, Mega, FL, CL, SL>) => COptic<Part, Mega, FL, never, void & SL>;
export declare function isUndefined(v: unknown): v is undefined;
declare interface ITraversal<Part, Whole, Fail, Command> extends IOpticBase<Part, Whole, Fail, Command, NON_PRISM> {
mapper: Mapper<Part, Whole>;
refold: <Acc>(foldPart: FoldFn<Part, Acc, Ctx>) => FoldFn<Whole, Acc, Ctx>;
}
export declare function lens<Part, Whole>({ getter, mapper, setter, }: {
getter: (whole: Whole) => Part;
mapper?: Mapper<Part, Whole>;
setter: (part: Part, whole: Whole) => Whole;
}): <Mega, FL, CL, SL>(l: IOptic<Whole, Mega, FL, CL, SL>) => COptic<Part, Mega, FL, never, never>;
export declare function linear(m: number, b?: number): <Mega, FL, CL, SL>(l: IOptic<number, Mega, FL, CL, SL>) => COptic<number, Mega, FL, never, void & SL>;
export declare type Listener<Message extends Typed> = ((message: Message) => void) | {
[K in Message['type']]: (message: {
type: K;
} & Message) => void;
};
export declare class MachineEffects<Event, SubState> {
private effectsHandlers;
private last;
constructor(effectsHandlers: EffectsHandlers<Event, SubState>);
private foldSubState;
flush(indices?: Set<string>): void;
update(visit: (f: (subState: SubState, acc: Set<string>, index: string) => Set<string>, acc: Set<string>) => Set<string>, send: (event: Event) => void): void;
}
declare type Mapper<Part, Whole> = (mod: (p: Part) => Part, w: Whole) => Whole;
export declare type MessageCtx<Message extends Typed> = [
(emit: Sendable<Message>) => void
];
export declare type Modify<Value> = (value: Value) => Value;
export declare function multiStateBaseMachine<Event extends Typed, State extends Typed, DerivedLocal, Derived, Ctx extends unknown[]>(): <Machine extends AnyMachine<Event, State, Ctx, DerivedLocal, Derived>>({ derive, init, states }: Machine) => (initialArg: ArgOfInit<Machine["init"]>) => IMachine<Sendable<Event>, State, Ctx, Derived & DerivedLocal & State, Derived & DerivedLocal & State, Prettify<Final<State, Machine["states"]>>>;
export declare function multiStateMachine<Event extends Typed, State extends Typed, DerivedLocal = object, Derived = object, Message extends Typed = {
type: never;
}>(): <Machine extends AnyMachine<Event, State, MessageCtx<Message>, DerivedLocal, Derived>>({ derive, init, states }: Machine) => (initialArg: ArgOfInit<Machine["init"]>) => IMachine<Sendable<Event>, State, MessageCtx<Message>, Derived & DerivedLocal & State, Derived & DerivedLocal & State, Final<State, Machine["states"]> extends infer T ? { [Key in keyof T]: Final<State, Machine["states"]>[Key]; } : never>;
export declare function nextState<Event, State, Message extends Typed, Transformed, SubState, Final>(machine: IMachine<Event, State, MessageCtx<Message>, Transformed, SubState, Final>, transformed: Transformed, event: Event): Transformed;
export declare type NON_PRISM = never;
export declare const noop: () => void;
export declare function nth<Index extends keyof O & number, O extends unknown[]>(index: Index): <Mega, FL, CL, SL>(l: IOptic<O, Mega, FL, CL, SL>) => COptic<O[Index], Mega, FL, never, never>;
declare class ObjectMachine<Event, State, Message extends Typed, Transformed, SubState, Final> {
private machine;
private effects;
private onFinal?;
private onMessage;
private queue;
final: Final | undefined;
state: Transformed;
constructor(machine: IMachine<Event, State, MessageCtx<Message>, Transformed, SubState, Final>, opts?: {
events?: EffectsHandlers<Event, SubState>;
onFinal?: (final: Final) => void;
onMessage?: Listener<Message>;
});
private onChange;
flush(): void;
isDisabled(event: Event): boolean;
next(event: Event): Transformed;
send(event: Event): void;
visit<Acc>(fold: (subState: SubState, acc: Acc, index: string) => Acc, acc: Acc): Acc;
}
export declare function objectMachine<Event, State, Message extends Typed, Transformed, SubState, Final>(machine: IMachine<Event, State, MessageCtx<Message>, Transformed, SubState, Final>, opts?: {
events?: EffectsHandlers<Event, SubState>;
onFinal?: (final: Final) => void;
onMessage?: Listener<Message>;
}): ObjectMachine<Event, State, Message, Transformed, SubState, Final>;
export declare function opticNonPrism<Part, Whole, Fail, Command>(r: IOpticArgs<Part, Whole, Fail, Command, NON_PRISM>): <Mega, FL, CL, SL>(l: IOptic<Whole, Mega, FL, CL, SL>) => COptic<Part, Mega, Fail | FL, Command, never>;
export declare function opticPrism<Part, Whole, Fail, Command>(r: IOptional<Part, Whole, Fail, Command, PRISM>): <Mega, FL, CL, SL>(l: IOptic<Whole, Mega, FL, CL, SL>) => COptic<Part, Mega, Fail | FL, Command, void & SL>;
export declare function optional<Part, Whole>({ getter, mapper, setter, }: {
getter: Getter<Part, Whole, undefined>;
mapper?: Mapper<Part, Whole>;
setter: Setter<Part, Whole, NON_PRISM>;
}): <Mega, FL, CL, SL>(l: IOptic<Whole, Mega, FL, CL, SL>) => COptic<Part, Mega, FL | undefined, never, never>;
declare type OptionalKeys<T> = {
[K in keyof T]: object extends Pick<T, K> ? K : never;
}[keyof T];
export declare function pipe<TArgs extends any[], R1, R2, R3, R4, R5, R6, R7, TResult>(...funcs: [
f1: (...args: TArgs) => R1,
f2: (a: R1) => R2,
f3: (a: R2) => R3,
f4: (a: R3) => R4,
f5: (a: R4) => R5,
f6: (a: R5) => R6,
f7: (a: R6) => R7,
...func: Array<(a: any) => any>,
fnLast: (a: any) => TResult
]): (...args: TArgs) => TResult;
export declare function pipe<TArgs extends any[], R1, R2, R3, R4, R5, R6, R7>(f1: (...args: TArgs) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6, f7: (a: R6) => R7): (...args: TArgs) => R7;
export declare function pipe<TArgs extends any[], R1, R2, R3, R4, R5, R6>(f1: (...args: TArgs) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5, f6: (a: R5) => R6): (...args: TArgs) => R6;
export declare function pipe<TArgs extends any[], R1, R2, R3, R4, R5>(f1: (...args: TArgs) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4, f5: (a: R4) => R5): (...args: TArgs) => R5;
export declare function pipe<TArgs extends any[], R1, R2, R3, R4>(f1: (...args: TArgs) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3, f4: (a: R3) => R4): (...args: TArgs) => R4;
export declare function pipe<TArgs extends any[], R1, R2, R3>(f1: (...args: TArgs) => R1, f2: (a: R1) => R2, f3: (a: R2) => R3): (...args: TArgs) => R3;
export declare function pipe<TArgs extends any[], R1, R2>(f1: (...args: TArgs) => R1, f2: (a: R1) => R2): (...args: TArgs) => R2;
export declare function pipe<TArgs extends any[], R1>(f1: (...args: TArgs) => R1): (...args: TArgs) => R1;
export declare function pipe2<P, Q, R>(f: (p: P) => Q, g: (q: Q) => R): (p: P) => R;
export declare function prepend<T>(x: T, xs: T[]): T[];
export declare type Prettify<Type> = {
[Key in keyof Type]: Type[Key];
} & {};
export declare type PRISM = void;
export declare function prism<Part, Whole>({ getter, mapper, setter, }: {
getter: Getter<Part, Whole, undefined>;
mapper?: Mapper<Part, Whole>;
setter: Setter<Part, Whole, PRISM>;
}): <Mega, FL, CL, SL>(l: IOptic<Whole, Mega, FL, CL, SL>) => COptic<Part, Mega, FL | undefined, never, void & SL>;
export declare function promiseMachine<Event, State, Transformed, SubState, Final>(machine: IMachine<Event, State, MessageCtx<{
type: never;
}>, Transformed, SubState, Final>, events: EffectsHandlers<Event, SubState>): Promise<Final>;
export declare function prop<Key extends keyof O, O extends object>(key: Key): <A, F1, C, S>(p: IOptic<O, A, F1, C, S>) => COptic<Exclude<O[Key], undefined>, A, F1 | (Key extends OptionalKeys<O> ? undefined : never), Key extends OptionalKeys<O> ? typeof REMOVE : never, NON_PRISM>;
export declare function queue<X>(): <Mega, FL, CL, SL>(l: IOptic<X[], Mega, FL, CL, SL>) => COptic<X, Mega, FL | undefined, typeof REMOVE, never>;
export declare type Reducer<Event, Acc> = (t: Event, acc: Acc) => Acc;
export declare type Refold<Part, Whole, C> = <Acc>(fold: FoldFn<Part, Acc, C>) => FoldFn<Whole, Acc, C>;
export declare function removable<Part, Whole>({ getter, mapper, remover, setter, }: {
getter: Getter<Part, Whole, undefined>;
mapper?: Mapper<Part, Whole>;
remover: Modify<Whole>;
setter: Setter<Part, Whole, never>;
}): <Mega, FL, CL, SL>(l: IOptic<Whole, Mega, FL, CL, SL>) => COptic<Part, Mega, FL | undefined, typeof REMOVE, never>;
export declare const REMOVE: unique symbol;
export declare function remove<T>(index: number, xs: T[]): T[];
export declare function removeValue<X>(element: X, xs: X[]): X[];
export declare function replace<T>(x: T, index: number, xs: T[]): T[];
export declare function reread<Whole>(mod: (a: Whole) => Whole): <Mega, FL, CL, SL>(l: IOptic<Whole, Mega, FL, CL, SL>) => COptic<Whole, Mega, FL, never, void & SL>;
export declare function rewrite<Whole>(setter: (next: Whole, last: Whole) => Whole): <Mega, FL, CL, SL>(l: IOptic<Whole, Mega, FL, CL, SL>) => COptic<Whole, Mega, FL, never, never>;
export declare type Sendable<T extends Typed> = T | (T extends {
type: infer U;
} ? {
type: U;
} extends T ? U : never : T extends void ? void : never);
declare type Setter<Part, Whole, S> = (p: Part, w: S | Whole) => Whole;
export declare function shallowEqual(a: any, b: any): boolean;
export declare function simpleStateBaseMachine<RWCtx extends unknown[]>(): <State, T extends Transitions<State, Transformed, RWCtx>, Transformed = State, InitialArg = void, Final = never>({ events, init, transform, }: {
events: T;
init: Init<State, InitialArg>;
transform?: (s: State) => Transformed;
}, getFinal?: (s: Transformed) => Final | undefined) => (initialArg: InitialArg) => IMachine<Sendable<Prettify<ExtractEvents<T>> & Typed>, State, RWCtx, Transformed, Transformed, Final>;
export declare function simpleStateMachine<Message extends Typed = {
type: never;
}>(): <State, T extends Transitions<State, Transformed, MessageCtx<Message>>, Transformed = State, InitialArg = void, Final = never>({ events, init, transform, }: {
events: T;
init: Init<State, InitialArg>;
transform?: ((s: State) => Transformed) | undefined;
}, getFinal?: ((s: Transformed) => Final | undefined) | undefined) => (initialArg: InitialArg) => IMachine<Sendable<(UnionValues<ExtractEventObject<T>> extends infer T_1 ? { [Key in keyof T_1]: UnionValues<ExtractEventObject<T>>[Key]; } : never) & Typed>, State, MessageCtx<Message>, Transformed, Transformed, Final>;
export declare function stack<X>(): <Mega, FL, CL, SL>(l: IOptic<X[], Mega, FL, CL, SL>) => COptic<X, Mega, FL | undefined, typeof REMOVE, never>;
export declare function strToNum(): <Mega, FL, CL, SL>(l: IOptic<string, Mega, FL, CL, SL>) => COptic<number, Mega, FL | undefined, never, void & SL>;
export declare function tail<X>(): <Mega, FL, CL, SL>(l: IOptic<X[], Mega, FL, CL, SL>) => COptic<X[], Mega, FL | undefined, typeof REMOVE, never>;
export declare function to<Micro, Part>(getter: (v: Part) => Micro): <Mega, FL, CL, SL>(l: IOptic<Part, Mega, FL, CL, SL>) => COptic<Micro, Mega, FL, never, SL>;
export declare function to<Micro, Part>(getter: (v: Part) => Micro | undefined): <Mega, FL, CL, SL>(l: IOptic<Part, Mega, FL, CL, SL>) => COptic<Micro, Mega, FL | undefined, never, SL>;
export declare function toArray<V>(): FoldForm<V, V[], Ctx>;
export declare function toFirst<Part, Fail, Ctx extends {
close: () => void;
}>(fail: Fail): FoldForm<Part, Fail | Part, Ctx>;
export declare function toInit<T, P = void>(init: Init<T, P>): (p: P) => T;
export declare function toListener<Message extends Typed>(listener: Listener<Message>): (message: Sendable<Message>) => void;
declare type Transition<State, Transformed, Ctx extends unknown[]> = ((e: any, s: Transformed, ...args: Ctx) => State | undefined) | State;
declare type Transitions<State, Transformed, Ctx extends unknown[]> = Record<any, Transition<State, Transformed, Ctx>>;
export declare function traversal<Part, Whole, Index>({ coll, form, }: {
coll: Unfolder<Part, Whole, Index>;
form: () => FoldForm<Part, Whole, Ctx>;
}): <Mega, FL, CL, SL>(l: IOptic<Whole, Mega, FL, CL, SL>) => COptic<Part, Mega, FL | undefined, never, never>;
export declare type Typed = {
type: string;
};
export declare type Unfolder<Part, Whole, Index> = (w: Whole) => UnfoldForm<Part, Index>;
export declare type UnfoldForm<Part, Index> = () => {
index: Index;
part: Part;
} | undefined;
declare type UnionValues<T> = T extends Record<string, unknown> ? T[keyof T] : never;
export declare type Updater<Value, Command> = ((value: Value) => Value) | Command | Value;
export declare function valueOr<Part>(value: Init<Part>): <Whole, Fail, Command, S>(o: IOptic<Part, Whole, Fail, Command, S>) => COptic<Part, Whole, never, Command, S>;
export declare function when<Part, Micro extends Part>(p: (v: Part) => v is Micro): <Mega, FL, CL, SL>(l: IOptic<Part, Mega, FL, CL, SL>) => COptic<Micro, Mega, FL | undefined, never, SL & void>;
export declare function when<Part>(p: (v: Part) => unknown): <Mega, FL, CL, SL>(l: IOptic<Part, Mega, FL, CL, SL>) => COptic<Part, Mega, FL | undefined, never, SL & void>;
export declare function withSend<Event extends Typed>(emit: (event: Event) => void): (e: Sendable<Event>) => undefined;
export { }