@monstermann/fn
Version:
A utility library for TypeScript.
45 lines (43 loc) • 1.01 kB
JavaScript
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 };