@thi.ng/transducers
Version:
Collection of ~170 lightweight, composable transducers, reducers, generators, iterators for functional data transformations
68 lines • 2.23 kB
TypeScript
import type { TransformSpec } from "./api.js";
/**
* Higher-order deep object transformer used by {@link mapDeep}. Accepts a
* nested `spec` array reflecting same key structure as the object to be mapped,
* but with functions or sub-specs as their values. Returns a new function,
* which when called, recursively applies nested transformers in post-order
* traversal (child transformers are run first) and returns the result of the
* root transformer.
*
* @remarks
* The transform specs are given as arrays in this format:
*
* ```ts
* [tx-function, { key1: [tx-function, {...}], key2: tx-fn }]
* ```
*
* If a key in the spec has no further sub maps, its transform function can be
* given directly without having to wrap it into the usual array structure.
*
* @example
* ```ts tangle:../export/deep-transform.ts
* import { deepTransform, type TransformSpec } from "@thi.ng/transducers";
*
* // source object to be transformed
* const src = {
* meta: {
* author: { name: "Alice", email: "a@b.com" },
* date: 1041510896000
* },
* type: "post",
* title: "Hello world",
* body: "Ratione necessitatibus doloremque itaque."
* };
*
* // deep transformation spec
* const spec: TransformSpec = [
* // root transform (called last)
* ({ type, meta, title, body }) => ["div", { class: type }, title, meta, body],
* // object of transform sub-specs
* {
* meta: [
* ({ author, date }) => ["div.meta", author, `(${date})`],
* {
* author: ({email, name}) => ["a", {href: `mailto:${email}`}, name],
* date: (d) => new Date(d).toLocaleString()
* }
* ],
* title: (title) => ["h1", title]
* }
* ];
*
* // build transformer & apply to src
* console.log(
* deepTransform(spec)(src)
* );
* // [ "div",
* // { class: "post" },
* // [ "h1", "Hello world" ],
* // [ "div.meta",
* // [ "a", { href: "mailto:a@.b.com" }, "Alice" ],
* // "(1/2/2003, 12:34:56 PM)" ],
* // "Ratione necessitatibus doloremque itaque." ]
* ```
*
* @param spec - transformation spec
*/
export declare const deepTransform: (spec: TransformSpec) => ((x: any) => any);
//# sourceMappingURL=deep-transform.d.ts.map