UNPKG

proxy-lens

Version:

A type safe functional lens implemented via proxy

43 lines (42 loc) 2.26 kB
export declare type Getter<A, B> = (a: A) => B; export declare type Setter<A, B> = (b: B, a: A) => A; export declare type BaseLens<A, B> = { get(target?: A): B; set(value: B, target?: A): A; let(value: B): ProxyLens<A, A>; peg(get: Getter<A, B> | ProxyLens<A, B>): ProxyLens<A, A>; mod(get: Getter<B, B> | ProxyLens<B, B>): ProxyLens<A, A>; iso<C>(get: Getter<B, C> | ProxyLens<B, C>, set: Setter<B, C>): ProxyLens<A, C>; }; declare type ExtractRecord<T> = Extract<T, { [key: string]: unknown; }>; declare type BaseProxyLens<A, B> = BaseLens<A, B> & (ExtractRecord<B> extends { [key: string]: unknown; } ? { [K in keyof ExtractRecord<B>]-?: ProxyLens<A, ExtractRecord<B>[K]>; } : unknown); declare type ArrayItem<T> = T extends ReadonlyArray<infer R> ? R : never; declare type ArrayFrom<T> = ReadonlyArray<ArrayItem<T>>; declare type ExtractArray<T> = Extract<T, ReadonlyArray<unknown>>; export declare type ArrayLens<A, B extends ArrayFrom<B>> = { del(index: number): ProxyLens<A, A>; put(index: number, value: ArrayItem<B> | B): ProxyLens<A, A>; map(get_: Getter<ArrayItem<B>, ArrayItem<B>> | ProxyLens<ArrayItem<B>, ArrayItem<B>>): ProxyLens<A, A>; tap(get_?: Getter<ArrayItem<B>, boolean> | ProxyLens<ArrayItem<B>, boolean>): ProxyTraversal<A, B>; }; declare type ArrayProxyLens<A, B extends ArrayFrom<B>> = ArrayLens<A, B> & { [I in keyof Omit<B, Exclude<keyof B, number>>]: ProxyLens<A, B[I]>; }; export declare type ProxyLens<A, B> = BaseProxyLens<A, B> & (ExtractArray<B> extends never ? unknown : ArrayProxyLens<A, ExtractArray<ArrayFrom<B>>>); declare type BaseProxyTraversal<A, B> = BaseLens<A, B> & (ExtractRecord<B> extends { [key: string]: unknown; } ? { [K in keyof ExtractRecord<B>]-?: ProxyLens<A, ReadonlyArray<ExtractRecord<B>[K]>>; } : unknown); declare type ArrayProxyTraversal<A, B extends ArrayFrom<B>> = ArrayLens<A, B> & { [I in keyof Omit<B, Exclude<keyof B, number>>]: ProxyLens<A, ReadonlyArray<B[I]>>; }; export declare type ProxyTraversal<A, B> = BaseProxyTraversal<A, ArrayItem<B>> & (ExtractArray<B> extends never ? unknown : ArrayProxyTraversal<A, ExtractArray<ArrayFrom<ArrayItem<B>>>>); export declare function lens<A>(root?: A): ProxyLens<A, A>; export {};