@@ -156,6 +156,31 @@ export const mapField: {
|
||||
(a, b) => Object.setPrototypeOf({ ...a, [key]: b }, Object.getPrototypeOf(a)),
|
||||
))
|
||||
|
||||
export declare namespace mapMutableField {
|
||||
type IfEquals<X, Y, A = X, B = never> = (<T>() => T extends X ? 1 : 2) extends (<T>() => T extends Y ? 1 : 2) ? A : B
|
||||
export type WritableKeys<T> = {
|
||||
[K in keyof T]-?: IfEquals<
|
||||
{ [P in K]: T[K] },
|
||||
{ -readonly [P in K]: T[K] },
|
||||
K,
|
||||
never
|
||||
>
|
||||
}[keyof T]
|
||||
}
|
||||
|
||||
export const mapMutableField: {
|
||||
<A extends object, K extends mapMutableField.WritableKeys<A>, ER, EW, RR, RW>(
|
||||
self: Lens<A, ER, EW, RR, RW>,
|
||||
key: K,
|
||||
): Lens<A[K], ER, EW, RR, RW>
|
||||
<A extends object, K extends mapMutableField.WritableKeys<A>, ER, EW, RR, RW>(
|
||||
key: K,
|
||||
): (self: Lens<A, ER, EW, RR, RW>) => Lens<A[K], ER, EW, RR, RW>
|
||||
} = Function.dual(2, <A extends object, K extends mapMutableField.WritableKeys<A>, ER, EW, RR, RW>(
|
||||
self: Lens<A, ER, EW, RR, RW>,
|
||||
key: K,
|
||||
): Lens<A[K], ER, EW, RR, RW> => map(self, a => a[key], (a, b) => { a[key] = b; return a }))
|
||||
|
||||
export const mapArrayAt: {
|
||||
<A extends readonly any[], ER, EW, RR, RW>(
|
||||
self: Lens<A, ER, EW, RR, RW>,
|
||||
@@ -287,3 +312,9 @@ export const updateAndGetEffect: {
|
||||
next => Effect.succeed([next, next] as const),
|
||||
)),
|
||||
)
|
||||
|
||||
|
||||
declare const lens: Lens<{ readonly a: string, b: number }>
|
||||
const t = lens.pipe(
|
||||
mapMutableField("b")
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user