@jsoldi/hkt
Version:
Higher kinded types for typescript and a few utility monads.
42 lines • 1.5 kB
JavaScript
import { functor } from "../classes/functor.js";
import { monoid } from "../classes/monoid.js";
import { traversable } from "../classes/traversable.js";
import { array } from "./array.js";
import { maybe } from "./maybe.js";
/** The object module, providing a set of functions for working with JavaScript objects. */
export const object = (() => {
const rebuild = (fa, f) => {
const result = {};
for (const key in fa) {
const [value, newKey] = f(fa[key], key);
result[newKey] = value;
}
return result;
};
const entries = (fa) => Object.entries(fa);
const keys = (fa) => Object.keys(fa);
const values = (fa) => Object.values(fa);
const map = (fa, f) => rebuild(fa, (a, k) => [f(a, k), k]);
const toReader = (fa) => (key) => key in fa ? maybe.just(fa[key]) : maybe.nothing;
const fromReader = (keys) => (r) => Object.fromEntries(keys.map(k => [k, r(k)]));
return {
...functor({ map }),
...monoid({
empty: () => ({}),
append: (a, b) => ({ ...a, ...b })
}),
...traversable({
traverse: (m) => (f) => (ta) => {
return m.map(array.traverse(m)(([key, a]) => m.map(f(a), b => [key, b]))(Object.entries(ta)), telas => Object.fromEntries(telas));
}
}),
toReader,
fromReader,
map,
entries,
keys,
values,
rebuild,
};
})();
//# sourceMappingURL=object.js.map