proxy-lens
Version:
A type safe functional lens implemented via proxy
43 lines (42 loc) • 2.26 kB
TypeScript
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 {};