proxy-lens
Version:
A type safe functional lens implemented via proxy
128 lines • 6.13 kB
JavaScript
;
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