UNPKG

proxy-lens

Version:

A type safe functional lens implemented via proxy

128 lines 6.13 kB
"use strict"; var __spreadArrays = (this && this.__spreadArrays) || function () { for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; for (var r = Array(s), k = 0, i = 0; i < il; i++) for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) r[k] = a[j]; return r; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.lens = void 0; function baseLens(get, set, root) { return { get: function (target) { return get((target !== null && target !== void 0 ? target : root)); }, set: function (value, target) { return set(value, (target !== null && target !== void 0 ? target : root)); }, let: function (value) { return proxyLens(function (target) { return set(value, target); }, function (value) { return value; }, root); }, peg: function (get_) { return proxyLens(function (target) { return set(get_(set(get(target), target)), target); }, function (value) { return set(get_(set(get(value), value)), value); }, root); }, mod: function (get_) { return proxyLens(function (target) { return set(get_(get(target)), target); }, function (value) { return set(get_(get(value)), value); }, root); }, iso: function (get_, set_) { return proxyLens(function (target) { return get_(get(target)); }, function (value, target) { return set(set_(value, get(target)), target); }, root); }, }; } function arrayLens(get, set, root) { return { del: function (index) { return proxyLens(function (target) { return set((function () { var _a; var copy = ((_a = get(target)) !== null && _a !== void 0 ? _a : []).slice(); copy.splice(index, 1); return copy; })(), target); }, function (value) { return value; }, root); }, put: function (index, value) { return proxyLens(function (target) { return set((function () { var _a; var copy = ((_a = get(target)) !== null && _a !== void 0 ? _a : []).slice(); copy.splice.apply(copy, __spreadArrays([index < 0 ? copy.length + 1 + index : index, 0], (Array.isArray(value) ? value : [value]))); return copy; })(), target); }, function (value) { return value; }, root); }, map: function (get_) { return proxyLens(function (target) { var _a; return set(((_a = get(target)) !== null && _a !== void 0 ? _a : []).map(get_), target); }, function (values) { return set(get(values).map(get_), values); }, root); }, tap: function (get_) { return proxyTraversal(function (target) { var _a; return ((_a = get(target)) !== null && _a !== void 0 ? _a : []).filter(get_ !== null && get_ !== void 0 ? get_ : (function (_) { return true; })); }, function (values, target) { var _a; return set(((_a = get(target)) !== null && _a !== void 0 ? _a : []).reduce(function (_a, item) { var _b; var iterator = _a.iterator, value = _a.result; return ({ iterator: iterator, result: __spreadArrays(value, [ (get_ !== null && get_ !== void 0 ? get_ : (function (_) { return true; }))(item) ? (_b = iterator.next().value) !== null && _b !== void 0 ? _b : item : item, ]), }); }, { iterator: values[Symbol.iterator](), result: [] }).result, target); }, root); }, }; } function getTarget(key) { return (key.toString().match(/^\+?(0|[1-9]\d*)$/) ? [] : {}); } function dispatch(key, get, set, root) { var _a; return ((_a = arrayLens(get, set, root)[key]) !== null && _a !== void 0 ? _a : baseLens(get, set, root)[key]); } function proxyLens(get, set, root) { return new Proxy(get, { apply: function (_, __, args) { return get(root !== null && root !== void 0 ? root : args[0]); }, get: function (_, key) { return dispatch(key, get, set, root) || proxyLens(function (target) { return Object.assign(getTarget(key), get(target))[key]; }, function (value, target) { var _a; return set(Object.assign(getTarget(key), get(target), (_a = {}, _a[key] = value, _a)), target); }, root); }, }); } function proxyTraversal(get, set, root) { return new Proxy(get, { get: function (_, key) { return dispatch(key, get, set, root) || proxyLens(function (target) { return get(target).map(function (item) { return Object.assign(getTarget(key), item)[key]; }); }, function (values, target) { return set(values.reduce(function (_a, value) { var _b; var iterator = _a.iterator, result = _a.result; return ({ iterator: iterator, result: __spreadArrays(result, [ Object.assign(getTarget(key), iterator.next().value, (_b = {}, _b[key] = value, _b)), ]), }); }, { iterator: get(target)[Symbol.iterator](), result: [], }).result, target); }, root); }, }); } function lens(root) { return proxyLens(function (target) { return target; }, function (value) { return value; }, root); } exports.lens = lens; //# sourceMappingURL=index.js.map