UNPKG

@monstermann/fn

Version:

A utility library for TypeScript.

45 lines (43 loc) 1.01 kB
import { is } from "../function/is.js"; import { dfdlT } from "@monstermann/dfdl"; import { cloneObject } from "@monstermann/remmi"; //#region src/object/evolve.ts /** * `evolve(target, props)` * * Creates a new object with multiple properties transformed by their corresponding functions in the `props` object. * * ```ts * evolve( * { a: 1, b: 2, c: 3 }, * { * a: (x) => x * 2, * c: (x) => x + 1, * }, * ); // { a: 2, b: 2, c: 4 } * ``` * * ```ts * pipe( * { a: 1, b: 2, c: 3 }, * evolve({ * a: (x) => x * 2, * c: (x) => x + 1, * }), * ); // { a: 2, b: 2, c: 4 } * ``` */ const evolve = dfdlT((target, evolver) => { let result; for (const key in evolver) { const value = evolver[key]; const prev = target[key]; const next = typeof value === "function" ? value(prev) : evolve(prev, value); if (is(prev, next)) continue; result ??= cloneObject(target); result[key] = next; } return result ?? target; }, 2); //#endregion export { evolve };