@fpjs/overture
Version:
A Javascript prelude
38 lines (37 loc) • 1.85 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.view = exports.setAll = exports.set = exports.over = exports.identity = exports.Tuple = exports.Record = exports.Indexed = void 0;
var _base = require("@fpjs/overture/base");
var _functor = require("@fpjs/overture/algebras/functor");
var _identity = require("@fpjs/overture/data/identity");
var _const = require("@fpjs/overture/data/const");
const view = l => s => (0, _const.getConst)(l(_const.Const)(s));
exports.view = view;
const set = l => b => s => (0, _identity.runIdentity)(l(() => (0, _identity.Identity)(b))(s));
exports.set = set;
const over = l => f => s => (0, _identity.runIdentity)(l(x => (0, _identity.Identity)(f(x)))(s));
exports.over = over;
const setAll = (...pairs) => pairs.reduce((acc, [l, b]) => (0, _base.compose)(set(l)(b))(acc), _base.id);
exports.setAll = setAll;
const identity = f => x => f(x);
exports.identity = identity;
const Tuple = exports.Tuple = {
_1: f => ([a, ...rest]) => (0, _functor.map)(a_ => [a_, ...rest])(f(a)),
_2: f => ([a, b, ...rest]) => (0, _functor.map)(b_ => [a, b_, ...rest])(f(b)),
_3: f => ([a, b, c, ...rest]) => (0, _functor.map)(c_ => [a, b, c_, ...rest])(f(c)),
_4: f => ([a, b, c, d, ...rest]) => (0, _functor.map)(d_ => [a, b, c, d_, ...rest])(f(d)),
_5: f => ([a, b, c, d, e, ...rest]) => (0, _functor.map)(e_ => [a, b, c, d, e_, ...rest])(f(e))
};
const makeLensFor = fieldName => f => s => (0, _functor.map)(x => ({
...s,
[fieldName]: x
}))(f(s[fieldName]));
const RecordFields = l => new Proxy(l, {
get: (target, prop) => RecordFields((0, _base.compose)(target)(makeLensFor(prop)))
});
const Record = exports.Record = RecordFields(identity);
const Indexed = exports.Indexed = {
ix: n => f => xs => (0, _functor.map)(y => [...xs.slice(0, n), y, ...xs.slice(n + 1)])(f(xs[n]))
};