partial.lenses
Advanced tools
Comparing version 2.2.1 to 3.0.0
# Changelog | ||
## 3.0.0 | ||
Dropped *implicit* Ramda compatibility. To interop with Ramda, one must now | ||
explicitly convert lenses using `L.toRamda` and `L.fromRamda`. In particular, | ||
`L.compose` no longer necessarily returns a Ramda compatible lens and, in the | ||
future, the implementation may be changed more drastically. This change was | ||
made, because now a lens returned by `L.compose` can take less memory and it | ||
will also be possible to further optimize the implementation in the future. | ||
Removed deprecated functions `L.view`, `L.over` and `L.firstOf`. | ||
## 2.2.0 | ||
@@ -4,0 +15,0 @@ |
@@ -6,13 +6,11 @@ "use strict"; | ||
}); | ||
exports.props = exports.identity = exports.pick = exports.augment = exports.filter = exports.append = exports.index = exports.findWith = exports.find = exports.prop = exports.normalize = exports.define = exports.required = exports.defaults = exports.replace = exports.firstOf = exports.choice = exports.orElse = exports.nothing = exports.choose = exports.view = exports.get = exports.set = exports.over = exports.modify = exports.lens = exports.removeAll = exports.remove = exports.compose = exports.lift = undefined; | ||
exports.props = exports.identity = exports.pick = exports.augment = exports.filter = exports.append = exports.index = exports.findWith = exports.find = exports.prop = exports.normalize = exports.define = exports.required = exports.defaults = exports.replace = exports.choice = exports.orElse = exports.nothing = exports.choose = exports.get = exports.set = exports.modify = exports.lens = exports.removeAll = exports.remove = exports.compose = exports.toRamda = exports.fromRamda = undefined; | ||
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; | ||
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; }; | ||
var _ramda = require("ramda"); | ||
var _ramda2 = _interopRequireDefault(_ramda); | ||
var R = _interopRequireWildcard(_ramda); | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } | ||
@@ -25,11 +23,21 @@ function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } | ||
var warned = {}; | ||
var id = function id(x) { | ||
return x; | ||
}; | ||
var snd = function snd(_, c) { | ||
return c; | ||
}; | ||
var deprecated = function deprecated(message) { | ||
if (!(message in warned)) { | ||
warned[message] = message; | ||
console.warn("partial.lenses:", message); | ||
} | ||
// | ||
var check = function check(expected, predicate) { | ||
return function (x) { | ||
if (predicate(x)) return x;else throw new Error("Expected " + expected + ", but got " + x + "."); | ||
}; | ||
}; | ||
var assert = process.env.NODE_ENV === "production" ? function () { | ||
return id; | ||
} : check; | ||
// | ||
@@ -53,3 +61,3 @@ | ||
if (o === undefined) return _defineProperty({}, k, v); | ||
if (k in o && _ramda2.default.equals(v, o[k])) return o; | ||
if (k in o && R.equals(v, o[k])) return o; | ||
var r = _defineProperty({}, k, v); | ||
@@ -78,3 +86,3 @@ for (var p in o) { | ||
var conserve = function conserve(c1, c0) { | ||
return _ramda2.default.equals(c1, c0) ? c0 : c1; | ||
return R.equals(c1, c0) ? c0 : c1; | ||
}; | ||
@@ -90,17 +98,12 @@ | ||
var snd = function snd(_, c) { | ||
return c; | ||
var seemsLens = function seemsLens(x) { | ||
return typeof x === "function" && x.length === 1; | ||
}; | ||
// | ||
var fromRamda = exports.fromRamda = assert("a lens", seemsLens); | ||
var lift = exports.lift = function lift(l) { | ||
switch (typeof l === "undefined" ? "undefined" : _typeof(l)) { | ||
case "string": | ||
return prop(l); | ||
case "number": | ||
return index(l); | ||
default: | ||
return l; | ||
} | ||
var toRamda = exports.toRamda = function toRamda(l) { | ||
if (isProp(l)) return toRamdaProp(l); | ||
if (isIndex(l)) return toRamdaIndex(l); | ||
return fromRamda(l); | ||
}; | ||
@@ -113,10 +116,10 @@ | ||
return ls.length === 0 ? identity : ls.length === 1 ? lift(ls[0]) : _ramda2.default.compose.apply(_ramda2.default, _toConsumableArray(ls.map(lift))); | ||
return ls.length === 0 ? identity : ls.length === 1 ? ls[0] : R.compose.apply(R, _toConsumableArray(ls.map(toRamda))); | ||
}; | ||
var remove = exports.remove = _ramda2.default.curry(function (l, s) { | ||
return _ramda2.default.set(lift(l), undefined, s); | ||
var remove = exports.remove = R.curry(function (l, s) { | ||
return R.set(toRamda(l), undefined, s); | ||
}); | ||
var removeAll = exports.removeAll = _ramda2.default.curry(function (lens, data) { | ||
var removeAll = exports.removeAll = R.curry(function (lens, data) { | ||
while (get(lens, data) !== undefined) { | ||
@@ -127,18 +130,12 @@ data = remove(lens, data); | ||
var lens = exports.lens = _ramda2.default.lens; | ||
var modify = exports.modify = _ramda2.default.curry(function (l, x2x, s) { | ||
return _ramda2.default.over(lift(l), x2x, s); | ||
var lens = exports.lens = R.lens; | ||
var modify = exports.modify = R.curry(function (l, x2x, s) { | ||
return R.over(toRamda(l), x2x, s); | ||
}); | ||
var over = exports.over = _ramda2.default.curry(function (l, x2x, s) { | ||
return deprecated("`over` has been deprecated --- use `modify`") || _ramda2.default.over(lift(l), x2x, s); | ||
var set = exports.set = R.curry(function (l, x, s) { | ||
return R.set(toRamda(l), x, s); | ||
}); | ||
var set = exports.set = _ramda2.default.curry(function (l, x, s) { | ||
return _ramda2.default.set(lift(l), x, s); | ||
var get = exports.get = R.curry(function (l, s) { | ||
return R.view(toRamda(l), s); | ||
}); | ||
var get = exports.get = _ramda2.default.curry(function (l, s) { | ||
return _ramda2.default.view(lift(l), s); | ||
}); | ||
var view = exports.view = _ramda2.default.curry(function (l, s) { | ||
return deprecated("`view` has been deprecated --- use `get`") || _ramda2.default.view(lift(l), s); | ||
}); | ||
@@ -148,6 +145,6 @@ var choose = exports.choose = function choose(x2yL) { | ||
return function (target) { | ||
var l = lift(x2yL(target)); | ||
return _ramda2.default.map(function (focus) { | ||
return _ramda2.default.set(l, focus, target); | ||
}, toFunctor(_ramda2.default.view(l, target))); | ||
var l = toRamda(x2yL(target)); | ||
return R.map(function (focus) { | ||
return R.set(l, focus, target); | ||
}, toFunctor(R.view(l, target))); | ||
}; | ||
@@ -159,3 +156,3 @@ }; | ||
var orElse = exports.orElse = _ramda2.default.curry(function (d, l) { | ||
var orElse = exports.orElse = R.curry(function (d, l) { | ||
return choose(function (x) { | ||
@@ -179,15 +176,7 @@ return get(l, x) !== undefined ? l : d; | ||
var firstOf = exports.firstOf = function firstOf(l) { | ||
for (var _len3 = arguments.length, ls = Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) { | ||
ls[_key3 - 1] = arguments[_key3]; | ||
} | ||
return deprecated("`firstOf` has been deprecated --- use `choice` and `orElse`") || orElse(l, choice.apply(undefined, [l].concat(ls))); | ||
}; | ||
var replace = exports.replace = _ramda2.default.curry(function (inn, out) { | ||
return _ramda2.default.lens(function (x) { | ||
return _ramda2.default.equals(x, inn) ? out : x; | ||
var replace = exports.replace = R.curry(function (inn, out) { | ||
return lens(function (x) { | ||
return R.equals(x, inn) ? out : x; | ||
}, toConserve(function (y) { | ||
return _ramda2.default.equals(y, out) ? inn : y; | ||
return R.equals(y, out) ? inn : y; | ||
})); | ||
@@ -201,11 +190,17 @@ }); | ||
var define = exports.define = function define(v) { | ||
return _ramda2.default.compose(required(v), defaults(v)); | ||
return R.compose(required(v), defaults(v)); | ||
}; | ||
var normalize = exports.normalize = function normalize(transform) { | ||
return _ramda2.default.lens(toPartial(transform), toConserve(toPartial(transform))); | ||
return lens(toPartial(transform), toConserve(toPartial(transform))); | ||
}; | ||
var prop = exports.prop = function prop(k) { | ||
return _ramda2.default.lens(function (o) { | ||
var isProp = function isProp(x) { | ||
return typeof x === "string"; | ||
}; | ||
var prop = exports.prop = assert("a string", isProp); | ||
var toRamdaProp = function toRamdaProp(k) { | ||
return lens(function (o) { | ||
return o && o[k]; | ||
@@ -225,15 +220,17 @@ }, function (v, o) { | ||
var findWith = exports.findWith = function findWith(l) { | ||
for (var _len4 = arguments.length, ls = Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) { | ||
ls[_key4 - 1] = arguments[_key4]; | ||
} | ||
var lls = compose.apply(undefined, [l].concat(ls)); | ||
var findWith = exports.findWith = function findWith() { | ||
var lls = toRamda(compose.apply(undefined, arguments)); | ||
return compose(find(function (x) { | ||
return _ramda2.default.view(lls, x) !== undefined; | ||
return R.view(lls, x) !== undefined; | ||
}), lls); | ||
}; | ||
var index = exports.index = function index(i) { | ||
return _ramda2.default.lens(function (xs) { | ||
var isIndex = function isIndex(x) { | ||
return Number.isInteger(x) && 0 <= x; | ||
}; | ||
var index = exports.index = assert("a non-negative integer", isIndex); | ||
var toRamdaIndex = function toRamdaIndex(i) { | ||
return lens(function (xs) { | ||
return xs && xs[i]; | ||
@@ -248,3 +245,3 @@ }, function (x, xs) { | ||
if (xs.length <= i) return xs.concat(Array(i - xs.length), [x]); | ||
if (_ramda2.default.equals(x, xs[i])) return xs; | ||
if (R.equals(x, xs[i])) return xs; | ||
return xs.slice(0, i).concat([x], xs.slice(i + 1)); | ||
@@ -255,3 +252,3 @@ } | ||
var append = exports.append = _ramda2.default.lens(snd, function (x, xs) { | ||
var append = exports.append = lens(snd, function (x, xs) { | ||
return x === undefined ? xs : xs === undefined ? [x] : xs.concat([x]); | ||
@@ -261,6 +258,6 @@ }); | ||
var filter = exports.filter = function filter(p) { | ||
return _ramda2.default.lens(function (xs) { | ||
return lens(function (xs) { | ||
return xs && xs.filter(p); | ||
}, function (ys, xs) { | ||
return conserve(dropped(_ramda2.default.concat(ys || [], (xs || []).filter(_ramda2.default.complement(p)))), xs); | ||
return conserve(dropped(R.concat(ys || [], (xs || []).filter(R.complement(p)))), xs); | ||
}); | ||
@@ -270,3 +267,3 @@ }; | ||
var augment = exports.augment = function augment(template) { | ||
return _ramda2.default.lens(toPartial(function (x) { | ||
return lens(toPartial(function (x) { | ||
var z = _extends({}, x); | ||
@@ -291,3 +288,3 @@ for (var k in template) { | ||
var pick = exports.pick = function pick(template) { | ||
return _ramda2.default.lens(function (c) { | ||
return lens(function (c) { | ||
var r = void 0; | ||
@@ -313,14 +310,13 @@ for (var k in template) { | ||
var identity = exports.identity = _ramda2.default.lens(_ramda2.default.identity, conserve); | ||
var identity = exports.identity = lens(id, conserve); | ||
var props = exports.props = function props(k) { | ||
for (var _len5 = arguments.length, ks = Array(_len5 > 1 ? _len5 - 1 : 0), _key5 = 1; _key5 < _len5; _key5++) { | ||
ks[_key5 - 1] = arguments[_key5]; | ||
var props = exports.props = function props() { | ||
for (var _len3 = arguments.length, ks = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { | ||
ks[_key3] = arguments[_key3]; | ||
} | ||
var kks = [k].concat(ks); | ||
return pick(_ramda2.default.zipObj(kks, kks)); | ||
return pick(R.zipObj(ks, ks)); | ||
}; | ||
exports.default = compose; | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9wYXJ0aWFsLmxlbnNlcy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOzs7Ozs7Ozs7Ozs7QUFJQSxJQUFNLFNBQVMsRUFBVDs7QUFFTixJQUFNLGFBQWEsU0FBYixVQUFhLFVBQVc7QUFDNUIsTUFBSSxFQUFFLFdBQVcsTUFBWCxDQUFGLEVBQXNCO0FBQ3hCLFdBQU8sT0FBUCxJQUFrQixPQUFsQixDQUR3QjtBQUV4QixZQUFRLElBQVIsQ0FBYSxpQkFBYixFQUFnQyxPQUFoQyxFQUZ3QjtHQUExQjtDQURpQjs7OztBQVNuQixJQUFNLFFBQVEsRUFBUjs7QUFFTixJQUFNLFlBQVksU0FBWixTQUFZLENBQUMsQ0FBRCxFQUFJLENBQUosRUFBVTtBQUMxQixNQUFJLE1BQU0sU0FBTixJQUFtQixFQUFFLEtBQUssQ0FBTCxDQUFGLEVBQ3JCLE9BQU8sQ0FBUCxDQURGO0FBRUEsTUFBSSxVQUFKLENBSDBCO0FBSTFCLE9BQUssSUFBTSxDQUFOLElBQVcsQ0FBaEIsRUFBbUI7QUFDakIsUUFBSSxNQUFNLENBQU4sRUFBUztBQUNYLFVBQUksY0FBYyxDQUFkLEVBQ0YsSUFBSSxFQUFKLENBREY7QUFFQSxRQUFFLENBQUYsSUFBTyxFQUFFLENBQUYsQ0FBUCxDQUhXO0tBQWI7R0FERjtBQU9BLFNBQU8sQ0FBUCxDQVgwQjtDQUFWOztBQWNsQixJQUFNLFNBQVMsU0FBVCxNQUFTLENBQUMsQ0FBRCxFQUFJLENBQUosRUFBTyxDQUFQLEVBQWE7QUFDMUIsTUFBSSxNQUFNLFNBQU4sRUFDRiwyQkFBUyxHQUFJLEVBQWIsQ0FERjtBQUVBLE1BQUksS0FBSyxDQUFMLElBQVUsZ0JBQUUsTUFBRixDQUFTLENBQVQsRUFBWSxFQUFFLENBQUYsQ0FBWixDQUFWLEVBQ0YsT0FBTyxDQUFQLENBREY7QUFFQSxNQUFNLHdCQUFNLEdBQUksRUFBVixDQUxvQjtBQU0xQixPQUFLLElBQU0sQ0FBTixJQUFXLENBQWhCO0FBQ0UsUUFBSSxN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QUFkLENBQUwsQ0FBUCxDQUZpQztDQUFkOztrQkFLTiIsImZpbGUiOiJwYXJ0aWFsLmxlbnNlcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSIGZyb20gXCJyYW1kYVwiXG5cbi8vXG5cbmNvbnN0IHdhcm5lZCA9IHt9XG5cbmNvbnN0IGRlcHJlY2F0ZWQgPSBtZXNzYWdlID0+IHtcbiAgaWYgKCEobWVzc2FnZSBpbiB3YXJuZWQpKSB7XG4gICAgd2FybmVkW21lc3NhZ2VdID0gbWVzc2FnZVxuICAgIGNvbnNvbGUud2FybihcInBhcnRpYWwubGVuc2VzOlwiLCBtZXNzYWdlKVxuICB9XG59XG5cbi8vXG5cbmNvbnN0IGVtcHR5ID0ge31cblxuY29uc3QgZGVsZXRlS2V5ID0gKGssIG8pID0+IHtcbiAgaWYgKG8gPT09IHVuZGVmaW5lZCB8fCAhKGsgaW4gbykpXG4gICAgcmV0dXJuIG9cbiAgbGV0IHJcbiAgZm9yIChjb25zdCBwIGluIG8pIHtcbiAgICBpZiAocCAhPT0gaykge1xuICAgICAgaWYgKHVuZGVmaW5lZCA9PT0gcilcbiAgICAgICAgciA9IHt9XG4gICAgICByW3BdID0gb1twXVxuICAgIH1cbiAgfVxuICByZXR1cm4gclxufVxuXG5jb25zdCBzZXRLZXkgPSAoaywgdiwgbykgPT4ge1xuICBpZiAobyA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiB7W2tdOiB2fVxuICBpZiAoayBpbiBvICYmIFIuZXF1YWxzKHYsIG9ba10pKVxuICAgIHJldHVybiBvXG4gIGNvbnN0IHIgPSB7W2tdOiB2fVxuICBmb3IgKGNvbnN0IHAgaW4gbylcbiAgICBpZiAocCAhPT0gaylcbiAgICAgIHJbcF0gPSBvW3BdXG4gIHJldHVybiByXG59XG5cbi8vXG5cbmNvbnN0IGRyb3BwZWQgPSB4cyA9PiBPYmplY3Qua2V5cyh4cykubGVuZ3RoID09PSAwID8gdW5kZWZpbmVkIDogeHNcblxuLy9cblxuY29uc3QgdG9QYXJ0aWFsID0gdHJhbnNmb3JtID0+IHggPT4gdW5kZWZpbmVkID09PSB4ID8geCA6IHRyYW5zZm9ybSh4KVxuXG4vL1xuXG5jb25zdCBjb25zZXJ2ZSA9IChjMSwgYzApID0+IFIuZXF1YWxzKGMxLCBjMCkgPyBjMCA6IGMxXG5cbmNvbnN0IHRvQ29uc2VydmUgPSBmID0+ICh5LCBjMCkgPT4gY29uc2VydmUoZih5LCBjMCksIGMwKVxuXG4vL1xuXG5jb25zdCBzbmQgPSAoXywgYykgPT4gY1xuXG4vL1xuXG5leHBvcnQgY29uc3QgbGlmdCA9IGwgPT4ge1xuICBzd2l0Y2ggKHR5cGVvZiBsKSB7XG4gIGNhc2UgXCJzdHJpbmdcIjogcmV0dXJuIHByb3AobClcbiAgY2FzZSBcIm51bWJlclwiOiByZXR1cm4gaW5kZXgobClcbiAgZGVmYXVsdDogICAgICAgcmV0dXJuIGxcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgY29tcG9zZSA9ICguLi5scykgPT5cbiAgbHMubGVuZ3RoID09PSAwID8gaWRlbnRpdHkgICAgOlxuICBscy5sZW5ndGggPT09IDEgPyBsaWZ0KGxzWzBdKSA6XG4gIFIuY29tcG9zZSguLi5scy5tYXAobGlmdCkpXG5cbmV4cG9ydCBjb25zdCByZW1vdmUgPSBSLmN1cnJ5KChsLCBzKSA9PiBSLnNldChsaWZ0KGwpLCB1bmRlZmluZWQsIHMpKVxuXG5leHBvcnQgY29uc3QgcmVtb3ZlQWxsID0gUi5jdXJyeSgobGVucywgZGF0YSkgPT4ge1xuICB3aGlsZSAoZ2V0KGxlbnMsIGRhdGEpICE9PSB1bmRlZmluZWQpXG4gICAgZGF0YSA9IHJlbW92ZShsZW5zLCBkYXRhKVxuICByZXR1cm4gZGF0YVxufSlcblxuZXhwb3J0IGNvbnN0IGxlbnMgPSBSLmxlbnNcbmV4cG9ydCBjb25zdCBtb2RpZnkgPSBSLmN1cnJ5KChsLCB4MngsIHMpID0+IFIub3ZlcihsaWZ0KGwpLCB4MngsIHMpKVxuZXhwb3J0IGNvbnN0IG92ZXIgPSBSLmN1cnJ5KChsLCB4MngsIHMpID0+XG4gIGRlcHJlY2F0ZWQoXCJgb3ZlcmAgaGFzIGJlZW4gZGVwcmVjYXRlZCAtLS0gdXNlIGBtb2RpZnlgXCIpIHx8XG4gIFIub3ZlcihsaWZ0KGwpLCB4MngsIHMpKVxuZXhwb3J0IGNvbnN0IHNldCA9IFIuY3VycnkoKGwsIHgsIHMpID0+IFIuc2V0KGxpZnQobCksIHgsIHMpKVxuZXhwb3J0IGNvbnN0IGdldCA9IFIuY3VycnkoKGwsIHMpID0+IFIudmlldyhsaWZ0KGwpLCBzKSlcbmV4cG9ydCBjb25zdCB2aWV3ID0gUi5jdXJyeSgobCwgcykgPT5cbiAgZGVwcmVjYXRlZChcImB2aWV3YCBoYXMgYmVlbiBkZXByZWNhdGVkIC0tLSB1c2UgYGdldGBcIikgfHxcbiAgUi52aWV3KGxpZnQobCksIHMpKVxuXG5leHBvcnQgY29uc3QgY2hvb3NlID0geDJ5TCA9PiB0b0Z1bmN0b3IgPT4gdGFyZ2V0ID0+IHtcbiAgY29uc3QgbCA9IGxpZnQoeDJ5TCh0YXJnZXQpKVxuICByZXR1cm4gUi5tYXAoZm9jdXMgPT4gUi5zZXQobCwgZm9jdXMsIHRhcmdldCksIHRvRnVuY3RvcihSLnZpZXcobCwgdGFyZ2V0KSkpXG59XG5cbmV4cG9ydCBjb25zdCBub3RoaW5nID0gbGVucyhzbmQsIHNuZClcblxuZXhwb3J0IGNvbnN0IG9yRWxzZSA9XG4gIFIuY3VycnkoKGQsIGwpID0+IGNob29zZSh4ID0+IGdldChsLCB4KSAhPT0gdW5kZWZpbmVkID8gbCA6IGQpKVxuXG5leHBvcnQgY29uc3QgY2hvaWNlID0gKC4uLmxzKSA9PiBjaG9vc2UoeCA9PiB7XG4gIGNvbnN0IGkgPSBscy5maW5kSW5kZXgobCA9PiBnZXQobCwgeCkgIT09IHVuZGVmaW5lZClcbiAgcmV0dXJuIDAgPD0gaSA/IGxzW2ldIDogbm90aGluZ1xufSlcblxuZXhwb3J0IGNvbnN0IGZpcnN0T2YgPSAobCwgLi4ubHMpID0+XG4gIGRlcHJlY2F0ZWQoXCJgZmlyc3RPZmAgaGFzIGJlZW4gZGVwcmVjYXRlZCAtLS0gdXNlIGBjaG9pY2VgIGFuZCBgb3JFbHNlYFwiKSB8fFxuICBvckVsc2UobCwgY2hvaWNlKGwsIC4uLmxzKSlcblxuZXhwb3J0IGNvbnN0IHJlcGxhY2UgPSBSLmN1cnJ5KChpbm4sIG91dCkgPT5cbiAgUi5sZW5zKHggPT4gUi5lcXVhbHMoeCwgaW5uKSA/IG91dCA6IHgsXG4gICAgICAgICB0b0NvbnNlcnZlKHkgPT4gUi5lcXVhbHMoeSwgb3V0KSA/IGlubiA6IHkpKSlcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRzID0gcmVwbGFjZSh1bmRlZmluZWQpXG5leHBvcnQgY29uc3QgcmVxdWlyZWQgPSBpbm4gPT4gcmVwbGFjZShpbm4sIHVuZGVmaW5lZClcbmV4cG9ydCBjb25zdCBkZWZpbmUgPSB2ID0+IFIuY29tcG9zZShyZXF1aXJlZCh2KSwgZGVmYXVsdHModikpXG5cbmV4cG9ydCBjb25zdCBub3JtYWxpemUgPSB0cmFuc2Zvcm0gPT5cbiAgUi5sZW5zKHRvUGFydGlhbCh0cmFuc2Zvcm0pLCB0b0NvbnNlcnZlKHRvUGFydGlhbCh0cmFuc2Zvcm0pKSlcblxuZXhwb3J0IGNvbnN0IHByb3AgPSBrID0+XG4gIFIubGVucyhvID0+IG8gJiYgb1trXSxcbiAgICAgICAgICh2LCBvKSA9PiB2ID09PSB1bmRlZmluZWQgPyBkZWxldGVLZXkoaywgbykgOiBzZXRLZXkoaywgdiwgbykpXG5cbmV4cG9ydCBjb25zdCBmaW5kID0gcHJlZGljYXRlID0+IGNob29zZSh4cyA9PiB7XG4gIGlmICh4cyA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBhcHBlbmRcbiAgY29uc3QgaSA9IHhzLmZpbmRJbmRleChwcmVkaWNhdGUpXG4gIHJldHVybiBpIDwgMCA/IGFwcGVuZCA6IGlcbn0pXG5cbmV4cG9ydCBjb25zdCBmaW5kV2l0aCA9IChsLCAuLi5scykgPT4ge1xuICBjb25zdCBsbHMgPSBjb21wb3NlKGwsIC4uLmxzKVxuICByZXR1cm4gY29tcG9zZShmaW5kKHggPT4gUi52aWV3KGxscywgeCkgIT09IHVuZGVmaW5lZCksIGxscylcbn1cblxuZXhwb3J0IGNvbnN0IGluZGV4ID0gaSA9PiBSLmxlbnMoeHMgPT4geHMgJiYgeHNbaV0sICh4LCB4cykgPT4ge1xuICBpZiAoeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHhzID09PSB1bmRlZmluZWQpXG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgaWYgKGkgPCB4cy5sZW5ndGgpXG4gICAgICByZXR1cm4gZHJvcHBlZCh4cy5zbGljZSgwLCBpKS5jb25jYXQoeHMuc2xpY2UoaSsxKSkpXG4gICAgcmV0dXJuIHhzXG4gIH0gZWxzZSB7XG4gICAgaWYgKHhzID09PSB1bmRlZmluZWQpXG4gICAgICByZXR1cm4gQXJyYXkoaSkuY29uY2F0KFt4XSlcbiAgICBpZiAoeHMubGVuZ3RoIDw9IGkpXG4gICAgICByZXR1cm4geHMuY29uY2F0KEFycmF5KGkgLSB4cy5sZW5ndGgpLCBbeF0pXG4gICAgaWYgKFIuZXF1YWxzKHgsIHhzW2ldKSlcbiAgICAgIHJldHVybiB4c1xuICAgIHJldHVybiB4cy5zbGljZSgwLCBpKS5jb25jYXQoW3hdLCB4cy5zbGljZShpKzEpKVxuICB9XG59KVxuXG5leHBvcnQgY29uc3QgYXBwZW5kID0gUi5sZW5zKHNuZCwgKHgsIHhzKSA9PlxuICB4ID09PSB1bmRlZmluZWQgPyB4cyA6IHhzID09PSB1bmRlZmluZWQgPyBbeF0gOiB4cy5jb25jYXQoW3hdKSlcblxuZXhwb3J0IGNvbnN0IGZpbHRlciA9IHAgPT4gUi5sZW5zKHhzID0+IHhzICYmIHhzLmZpbHRlcihwKSwgKHlzLCB4cykgPT5cbiAgY29uc2VydmUoZHJvcHBlZChSLmNvbmNhdCh5cyB8fCBbXSwgKHhzIHx8IFtdKS5maWx0ZXIoUi5jb21wbGVtZW50KHApKSkpLCB4cykpXG5cbmV4cG9ydCBjb25zdCBhdWdtZW50ID0gdGVtcGxhdGUgPT4gUi5sZW5zKFxuICB0b1BhcnRpYWwoeCA9PiB7XG4gICAgY29uc3QgeiA9IHsuLi54fVxuICAgIGZvciAoY29uc3QgayBpbiB0ZW1wbGF0ZSlcbiAgICAgIHpba10gPSB0ZW1wbGF0ZVtrXSh4KVxuICAgIHJldHVybiB6XG4gIH0pLFxuICB0b0NvbnNlcnZlKCh5LCBjKSA9PiB7XG4gICAgaWYgKHkgPT09IHVuZGVmaW5lZClcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICBsZXQgelxuICAgIGNvbnN0IHNldCA9IChrLCB2KSA9PiB7XG4gICAgICBpZiAodW5kZWZpbmVkID09PSB6KVxuICAgICAgICB6ID0ge31cbiAgICAgIHpba10gPSB2XG4gICAgfVxuICAgIGZvciAoY29uc3QgayBpbiB5KSB7XG4gICAgICBpZiAoIShrIGluIHRlbXBsYXRlKSlcbiAgICAgICAgc2V0KGssIHlba10pXG4gICAgICBlbHNlXG4gICAgICAgIGlmIChrIGluIGMpXG4gICAgICAgICAgc2V0KGssIGNba10pXG4gICAgfVxuICAgIHJldHVybiB6XG4gIH0pKVxuXG5leHBvcnQgY29uc3QgcGljayA9IHRlbXBsYXRlID0+IFIubGVucyhcbiAgYyA9PiB7XG4gICAgbGV0IHJcbiAgICBmb3IgKGNvbnN0IGsgaW4gdGVtcGxhdGUpIHtcbiAgICAgIGNvbnN0IHYgPSBnZXQodGVtcGxhdGVba10sIGMpXG4gICAgICBpZiAodiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChyID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgciA9IHt9XG4gICAgICAgIHJba10gPSB2XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByXG4gIH0sXG4gIChvID0gZW1wdHksIGNJbikgPT4ge1xuICAgIGxldCBjID0gY0luXG4gICAgZm9yIChjb25zdCBrIGluIHRlbXBsYXRlKVxuICAgICAgYyA9IHNldCh0ZW1wbGF0ZVtrXSwgb1trXSwgYylcbiAgICByZXR1cm4gY1xuICB9KVxuXG5leHBvcnQgY29uc3QgaWRlbnRpdHkgPSBSLmxlbnMoUi5pZGVudGl0eSwgY29uc2VydmUpXG5cbmV4cG9ydCBjb25zdCBwcm9wcyA9IChrLCAuLi5rcykgPT4ge1xuICBjb25zdCBra3MgPSBbaywgLi4ua3NdXG4gIHJldHVybiBwaWNrKFIuemlwT2JqKGtrcywga2tzKSlcbn1cblxuZXhwb3J0IGRlZmF1bHQgY29tcG9zZVxuIl19 | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9wYXJ0aWFsLmxlbnNlcy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTs7SUFBWTs7Ozs7Ozs7OztBQUlaLElBQU0sS0FBSyxTQUFMLEVBQUs7U0FBSztDQUFMO0FBQ1gsSUFBTSxNQUFNLFNBQU4sR0FBTSxDQUFDLENBQUQsRUFBSSxDQUFKO1NBQVU7Q0FBVjs7OztBQUlaLElBQU0sUUFBUSxTQUFSLEtBQVEsQ0FBQyxRQUFELEVBQVcsU0FBWDtTQUF5QixhQUFLO0FBQzFDLFFBQUksVUFBVSxDQUFWLENBQUosRUFDRSxPQUFPLENBQVAsQ0FERixLQUdFLE1BQU0sSUFBSSxLQUFKLGVBQXNCLDBCQUFxQixPQUEzQyxDQUFOLENBSEY7R0FEcUM7Q0FBekI7O0FBT2QsSUFBTSxTQUFTLFFBQVEsR0FBUixDQUFZLFFBQVosS0FBeUIsWUFBekIsR0FBd0M7U0FBTTtDQUFOLEdBQVcsS0FBbkQ7Ozs7QUFJZixJQUFNLFFBQVEsRUFBUjs7QUFFTixJQUFNLFlBQVksU0FBWixTQUFZLENBQUMsQ0FBRCxFQUFJLENBQUosRUFBVTtBQUMxQixNQUFJLE1BQU0sU0FBTixJQUFtQixFQUFFLEtBQUssQ0FBTCxDQUFGLEVBQ3JCLE9BQU8sQ0FBUCxDQURGO0FBRUEsTUFBSSxVQUFKLENBSDBCO0FBSTFCLE9BQUssSUFBTSxDQUFOLElBQVcsQ0FBaEIsRUFBbUI7QUFDakIsUUFBSSxNQUFNLENBQU4sRUFBUztBQUNYLFVBQUksY0FBYyxDQUFkLEVBQ0YsSUFBSSxFQUFKLENBREY7QUFFQSxRQUFFLENBQUYsSUFBTyxFQUFFLENBQUYsQ0FBUCxDQUhXO0tBQWI7R0FERjtBQU9BLFNBQU8sQ0FBUCxDQVgwQjtDQUFWOztBQWNsQixJQUFNLFNBQVMsU0FBVCxNQUFTLENBQUMsQ0FBRCxFQUFJLENBQUosRUFBTyxDQUFQLEVBQWE7QUFDMUIsTUFBSSxNQUFNLFNBQU4sRUFDRiwyQkFBUyxHQUFJLEVBQWIsQ0FERjtBQUVBLE1BQUksS0FB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LEtBR0UsSUFBSSxLQUFLLENBQUwsRUFDRixJQUFJLENBQUosRUFBTyxFQUFFLENBQUYsQ0FBUCxFQURGO0tBSko7QUFPQSxXQUFPLENBQVAsQ0FoQm1CO0dBQVYsQ0FQc0I7Q0FBWjs7QUEwQmhCLElBQU0sc0JBQU8sU0FBUCxJQUFPO1NBQVksS0FDOUIsYUFBSztBQUNILFFBQUksVUFBSixDQURHO0FBRUgsU0FBSyxJQUFNLENBQU4sSUFBVyxRQUFoQixFQUEwQjtBQUN4QixVQUFNLElBQUksSUFBSSxTQUFTLENBQVQsQ0FBSixFQUFpQixDQUFqQixDQUFKLENBRGtCO0FBRXhCLFVBQUksTUFBTSxTQUFOLEVBQWlCO0FBQ25CLFlBQUksTUFBTSxTQUFOLEVBQ0YsSUFBSSxFQUFKLENBREY7QUFFQSxVQUFFLENBQUYsSUFBTyxDQUFQLENBSG1CO09BQXJCO0tBRkY7QUFRQSxXQUFPLENBQVAsQ0FWRztHQUFMLEVBWUEsWUFBb0I7UUFBbkIsMERBQUkscUJBQWU7UUFBUixtQkFBUTs7QUFDbEIsUUFBSSxJQUFJLEdBQUosQ0FEYztBQUVsQixTQUFLLElBQU0sQ0FBTixJQUFXLFFBQWhCO0FBQ0UsVUFBSSxJQUFJLFNBQVMsQ0FBVCxDQUFKLEVBQWlCLEVBQUUsQ0FBRixDQUFqQixFQUF1QixDQUF2QixDQUFKO0tBREYsT0FFTyxDQUFQLENBSmtCO0dBQXBCO0NBYmtCOztBQW9CYixJQUFNLDhCQUFXLEtBQUssRUFBTCxFQUFTLFFBQVQsQ0FBWDs7QUFFTixJQUFNLHdCQUFRLFNBQVIsS0FBUTtxQ0FBSTs7OztTQUFPLEtBQUssRUFBRSxNQUFGLENBQVMsRUFBVCxFQUFhLEVBQWIsQ0FBTDtDQUFYOztrQkFFTiIsImZpbGUiOiJwYXJ0aWFsLmxlbnNlcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFIgZnJvbSBcInJhbWRhXCJcblxuLy9cblxuY29uc3QgaWQgPSB4ID0+IHhcbmNvbnN0IHNuZCA9IChfLCBjKSA9PiBjXG5cbi8vXG5cbmNvbnN0IGNoZWNrID0gKGV4cGVjdGVkLCBwcmVkaWNhdGUpID0+IHggPT4ge1xuICBpZiAocHJlZGljYXRlKHgpKVxuICAgIHJldHVybiB4XG4gIGVsc2VcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7ZXhwZWN0ZWR9LCBidXQgZ290ICR7eH0uYClcbn1cblxuY29uc3QgYXNzZXJ0ID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gKCkgPT4gaWQgOiBjaGVja1xuXG4vL1xuXG5jb25zdCBlbXB0eSA9IHt9XG5cbmNvbnN0IGRlbGV0ZUtleSA9IChrLCBvKSA9PiB7XG4gIGlmIChvID09PSB1bmRlZmluZWQgfHwgIShrIGluIG8pKVxuICAgIHJldHVybiBvXG4gIGxldCByXG4gIGZvciAoY29uc3QgcCBpbiBvKSB7XG4gICAgaWYgKHAgIT09IGspIHtcbiAgICAgIGlmICh1bmRlZmluZWQgPT09IHIpXG4gICAgICAgIHIgPSB7fVxuICAgICAgcltwXSA9IG9bcF1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJcbn1cblxuY29uc3Qgc2V0S2V5ID0gKGssIHYsIG8pID0+IHtcbiAgaWYgKG8gPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4ge1trXTogdn1cbiAgaWYgKGsgaW4gbyAmJiBSLmVxdWFscyh2LCBvW2tdKSlcbiAgICByZXR1cm4gb1xuICBjb25zdCByID0ge1trXTogdn1cbiAgZm9yIChjb25zdCBwIGluIG8pXG4gICAgaWYgKHAgIT09IGspXG4gICAgICByW3BdID0gb1twXVxuICByZXR1cm4gclxufVxuXG4vL1xuXG5jb25zdCBkcm9wcGVkID0geHMgPT4gT2JqZWN0LmtleXMoeHMpLmxlbmd0aCA9PT0gMCA/IHVuZGVmaW5lZCA6IHhzXG5cbi8vXG5cbmNvbnN0IHRvUGFydGlhbCA9IHRyYW5zZm9ybSA9PiB4ID0+IHVuZGVmaW5lZCA9PT0geCA/IHggOiB0cmFuc2Zvcm0oeClcblxuLy9cblxuY29uc3QgY29uc2VydmUgPSAoYzEsIGMwKSA9PiBSLmVxdWFscyhjMSwgYzApID8gYzAgOiBjMVxuXG5jb25zdCB0b0NvbnNlcnZlID0gZiA9PiAoeSwgYzApID0+IGNvbnNlcnZlKGYoeSwgYzApLCBjMClcblxuLy9cblxuY29uc3Qgc2VlbXNMZW5zID0geCA9PiB0eXBlb2YgeCA9PT0gXCJmdW5jdGlvblwiICYmIHgubGVuZ3RoID09PSAxXG5cbmV4cG9ydCBjb25zdCBmcm9tUmFtZGEgPSBhc3NlcnQoXCJhIGxlbnNcIiwgc2VlbXNMZW5zKVxuXG5leHBvcnQgY29uc3QgdG9SYW1kYSA9IGwgPT4ge1xuICBpZiAoaXNQcm9wKGwpKSAgcmV0dXJuIHRvUmFtZGFQcm9wKGwpXG4gIGlmIChpc0luZGV4KGwpKSByZXR1cm4gdG9SYW1kYUluZGV4KGwpXG4gIHJldHVybiBmcm9tUmFtZGEobClcbn1cblxuZXhwb3J0IGNvbnN0IGNvbXBvc2UgPSAoLi4ubHMpID0+XG4gIGxzLmxlbmd0aCA9PT0gMCA/IGlkZW50aXR5IDpcbiAgbHMubGVuZ3RoID09PSAxID8gbHNbMF0gOlxuICBSLmNvbXBvc2UoLi4ubHMubWFwKHRvUmFtZGEpKVxuXG5leHBvcnQgY29uc3QgcmVtb3ZlID0gUi5jdXJyeSgobCwgcykgPT4gUi5zZXQodG9SYW1kYShsKSwgdW5kZWZpbmVkLCBzKSlcblxuZXhwb3J0IGNvbnN0IHJlbW92ZUFsbCA9IFIuY3VycnkoKGxlbnMsIGRhdGEpID0+IHtcbiAgd2hpbGUgKGdldChsZW5zLCBkYXRhKSAhPT0gdW5kZWZpbmVkKVxuICAgIGRhdGEgPSByZW1vdmUobGVucywgZGF0YSlcbiAgcmV0dXJuIGRhdGFcbn0pXG5cbmV4cG9ydCBjb25zdCBsZW5zID0gUi5sZW5zXG5leHBvcnQgY29uc3QgbW9kaWZ5ID0gUi5jdXJyeSgobCwgeDJ4LCBzKSA9PiBSLm92ZXIodG9SYW1kYShsKSwgeDJ4LCBzKSlcbmV4cG9ydCBjb25zdCBzZXQgPSBSLmN1cnJ5KChsLCB4LCBzKSA9PiBSLnNldCh0b1JhbWRhKGwpLCB4LCBzKSlcbmV4cG9ydCBjb25zdCBnZXQgPSBSLmN1cnJ5KChsLCBzKSA9PiBSLnZpZXcodG9SYW1kYShsKSwgcykpXG5cbmV4cG9ydCBjb25zdCBjaG9vc2UgPSB4MnlMID0+IHRvRnVuY3RvciA9PiB0YXJnZXQgPT4ge1xuICBjb25zdCBsID0gdG9SYW1kYSh4MnlMKHRhcmdldCkpXG4gIHJldHVybiBSLm1hcChmb2N1cyA9PiBSLnNldChsLCBmb2N1cywgdGFyZ2V0KSwgdG9GdW5jdG9yKFIudmlldyhsLCB0YXJnZXQpKSlcbn1cblxuZXhwb3J0IGNvbnN0IG5vdGhpbmcgPSBsZW5zKHNuZCwgc25kKVxuXG5leHBvcnQgY29uc3Qgb3JFbHNlID1cbiAgUi5jdXJyeSgoZCwgbCkgPT4gY2hvb3NlKHggPT4gZ2V0KGwsIHgpICE9PSB1bmRlZmluZWQgPyBsIDogZCkpXG5cbmV4cG9ydCBjb25zdCBjaG9pY2UgPSAoLi4ubHMpID0+IGNob29zZSh4ID0+IHtcbiAgY29uc3QgaSA9IGxzLmZpbmRJbmRleChsID0+IGdldChsLCB4KSAhPT0gdW5kZWZpbmVkKVxuICByZXR1cm4gMCA8PSBpID8gbHNbaV0gOiBub3RoaW5nXG59KVxuXG5leHBvcnQgY29uc3QgcmVwbGFjZSA9IFIuY3VycnkoKGlubiwgb3V0KSA9PlxuICBsZW5zKHggPT4gUi5lcXVhbHMoeCwgaW5uKSA/IG91dCA6IHgsXG4gICAgICAgdG9Db25zZXJ2ZSh5ID0+IFIuZXF1YWxzKHksIG91dCkgPyBpbm4gOiB5KSkpXG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0cyA9IHJlcGxhY2UodW5kZWZpbmVkKVxuZXhwb3J0IGNvbnN0IHJlcXVpcmVkID0gaW5uID0+IHJlcGxhY2UoaW5uLCB1bmRlZmluZWQpXG5leHBvcnQgY29uc3QgZGVmaW5lID0gdiA9PiBSLmNvbXBvc2UocmVxdWlyZWQodiksIGRlZmF1bHRzKHYpKVxuXG5leHBvcnQgY29uc3Qgbm9ybWFsaXplID0gdHJhbnNmb3JtID0+XG4gIGxlbnModG9QYXJ0aWFsKHRyYW5zZm9ybSksIHRvQ29uc2VydmUodG9QYXJ0aWFsKHRyYW5zZm9ybSkpKVxuXG5jb25zdCBpc1Byb3AgPSB4ID0+IHR5cGVvZiB4ID09PSBcInN0cmluZ1wiXG5cbmV4cG9ydCBjb25zdCBwcm9wID0gYXNzZXJ0KFwiYSBzdHJpbmdcIiwgaXNQcm9wKVxuXG5jb25zdCB0b1JhbWRhUHJvcCA9IGsgPT5cbiAgbGVucyhvID0+IG8gJiYgb1trXSxcbiAgICAgICAodiwgbykgPT4gdiA9PT0gdW5kZWZpbmVkID8gZGVsZXRlS2V5KGssIG8pIDogc2V0S2V5KGssIHYsIG8pKVxuXG5leHBvcnQgY29uc3QgZmluZCA9IHByZWRpY2F0ZSA9PiBjaG9vc2UoeHMgPT4ge1xuICBpZiAoeHMgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gYXBwZW5kXG4gIGNvbnN0IGkgPSB4cy5maW5kSW5kZXgocHJlZGljYXRlKVxuICByZXR1cm4gaSA8IDAgPyBhcHBlbmQgOiBpXG59KVxuXG5leHBvcnQgY29uc3QgZmluZFdpdGggPSAoLi4ubHMpID0+IHtcbiAgY29uc3QgbGxzID0gdG9SYW1kYShjb21wb3NlKC4uLmxzKSlcbiAgcmV0dXJuIGNvbXBvc2UoZmluZCh4ID0+IFIudmlldyhsbHMsIHgpICE9PSB1bmRlZmluZWQpLCBsbHMpXG59XG5cbmNvbnN0IGlzSW5kZXggPSB4ID0+IE51bWJlci5pc0ludGVnZXIoeCkgJiYgMCA8PSB4XG5cbmV4cG9ydCBjb25zdCBpbmRleCA9IGFzc2VydChcImEgbm9uLW5lZ2F0aXZlIGludGVnZXJcIiwgaXNJbmRleClcblxuY29uc3QgdG9SYW1kYUluZGV4ID0gaSA9PiBsZW5zKHhzID0+IHhzICYmIHhzW2ldLCAoeCwgeHMpID0+IHtcbiAgaWYgKHggPT09IHVuZGVmaW5lZCkge1xuICAgIGlmICh4cyA9PT0gdW5kZWZpbmVkKVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIGlmIChpIDwgeHMubGVuZ3RoKVxuICAgICAgcmV0dXJuIGRyb3BwZWQoeHMuc2xpY2UoMCwgaSkuY29uY2F0KHhzLnNsaWNlKGkrMSkpKVxuICAgIHJldHVybiB4c1xuICB9IGVsc2Uge1xuICAgIGlmICh4cyA9PT0gdW5kZWZpbmVkKVxuICAgICAgcmV0dXJuIEFycmF5KGkpLmNvbmNhdChbeF0pXG4gICAgaWYgKHhzLmxlbmd0aCA8PSBpKVxuICAgICAgcmV0dXJuIHhzLmNvbmNhdChBcnJheShpIC0geHMubGVuZ3RoKSwgW3hdKVxuICAgIGlmIChSLmVxdWFscyh4LCB4c1tpXSkpXG4gICAgICByZXR1cm4geHNcbiAgICByZXR1cm4geHMuc2xpY2UoMCwgaSkuY29uY2F0KFt4XSwgeHMuc2xpY2UoaSsxKSlcbiAgfVxufSlcblxuZXhwb3J0IGNvbnN0IGFwcGVuZCA9IGxlbnMoc25kLCAoeCwgeHMpID0+XG4gIHggPT09IHVuZGVmaW5lZCA/IHhzIDogeHMgPT09IHVuZGVmaW5lZCA/IFt4XSA6IHhzLmNvbmNhdChbeF0pKVxuXG5leHBvcnQgY29uc3QgZmlsdGVyID0gcCA9PiBsZW5zKHhzID0+IHhzICYmIHhzLmZpbHRlcihwKSwgKHlzLCB4cykgPT5cbiAgY29uc2VydmUoZHJvcHBlZChSLmNvbmNhdCh5cyB8fCBbXSwgKHhzIHx8IFtdKS5maWx0ZXIoUi5jb21wbGVtZW50KHApKSkpLCB4cykpXG5cbmV4cG9ydCBjb25zdCBhdWdtZW50ID0gdGVtcGxhdGUgPT4gbGVucyhcbiAgdG9QYXJ0aWFsKHggPT4ge1xuICAgIGNvbnN0IHogPSB7Li4ueH1cbiAgICBmb3IgKGNvbnN0IGsgaW4gdGVtcGxhdGUpXG4gICAgICB6W2tdID0gdGVtcGxhdGVba10oeClcbiAgICByZXR1cm4gelxuICB9KSxcbiAgdG9Db25zZXJ2ZSgoeSwgYykgPT4ge1xuICAgIGlmICh5ID09PSB1bmRlZmluZWQpXG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgbGV0IHpcbiAgICBjb25zdCBzZXQgPSAoaywgdikgPT4ge1xuICAgICAgaWYgKHVuZGVmaW5lZCA9PT0geilcbiAgICAgICAgeiA9IHt9XG4gICAgICB6W2tdID0gdlxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGsgaW4geSkge1xuICAgICAgaWYgKCEoayBpbiB0ZW1wbGF0ZSkpXG4gICAgICAgIHNldChrLCB5W2tdKVxuICAgICAgZWxzZVxuICAgICAgICBpZiAoayBpbiBjKVxuICAgICAgICAgIHNldChrLCBjW2tdKVxuICAgIH1cbiAgICByZXR1cm4gelxuICB9KSlcblxuZXhwb3J0IGNvbnN0IHBpY2sgPSB0ZW1wbGF0ZSA9PiBsZW5zKFxuICBjID0+IHtcbiAgICBsZXQgclxuICAgIGZvciAoY29uc3QgayBpbiB0ZW1wbGF0ZSkge1xuICAgICAgY29uc3QgdiA9IGdldCh0ZW1wbGF0ZVtrXSwgYylcbiAgICAgIGlmICh2ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHIgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICByID0ge31cbiAgICAgICAgcltrXSA9IHZcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJcbiAgfSxcbiAgKG8gPSBlbXB0eSwgY0luKSA9PiB7XG4gICAgbGV0IGMgPSBjSW5cbiAgICBmb3IgKGNvbnN0IGsgaW4gdGVtcGxhdGUpXG4gICAgICBjID0gc2V0KHRlbXBsYXRlW2tdLCBvW2tdLCBjKVxuICAgIHJldHVybiBjXG4gIH0pXG5cbmV4cG9ydCBjb25zdCBpZGVudGl0eSA9IGxlbnMoaWQsIGNvbnNlcnZlKVxuXG5leHBvcnQgY29uc3QgcHJvcHMgPSAoLi4ua3MpID0+IHBpY2soUi56aXBPYmooa3MsIGtzKSlcblxuZXhwb3J0IGRlZmF1bHQgY29tcG9zZVxuIl19 |
{ | ||
"name": "partial.lenses", | ||
"version": "2.2.1", | ||
"description": "Ramda compatible partial lenses", | ||
"version": "3.0.0", | ||
"description": "Partial lenses", | ||
"main": "lib/partial.lenses.js", | ||
@@ -17,6 +17,6 @@ "scripts": { | ||
"keywords": [ | ||
"ramda", | ||
"json", | ||
"lens", | ||
"partial", | ||
"json" | ||
"ramda" | ||
], | ||
@@ -23,0 +23,0 @@ "license": "MIT", |
167
README.md
@@ -5,7 +5,5 @@ [ [Tutorial](#tutorial) | [Reference](#reference) | [Background](#background) ] | ||
individual elements of immutable data structures. This library provides a | ||
collection of [Ramda](http://ramdajs.com/) compatible *partial* lenses. While | ||
an ordinary lens can be used to view and update an existing part of a data | ||
structure, a partial lens can *view* optional data, *insert* new data, *update* | ||
existing data and *remove* existing data and can provide *defaults* and maintain | ||
*required* data structure parts. | ||
collection of *partial* lenses. A partial lens can *view* optional data, | ||
*insert* new data, *update* existing data and *remove* existing data and can, | ||
for example, provide *defaults* and maintain *required* data structure parts. | ||
@@ -16,4 +14,4 @@ In JavaScript, missing data can be mapped to `undefined`, which is what partial | ||
inserts the new part. Setting an existing part to `undefined` removes it. | ||
Partial lenses are defined in such a way that operations compose and one can | ||
conveniently and robustly operate on deeply nested data structures. | ||
Partial lenses are defined in such a way that operations [compose](#lcomposels) | ||
and one can conveniently and robustly operate on deeply nested data structures. | ||
@@ -336,2 +334,5 @@ [![npm version](https://badge.fury.io/js/partial.lenses.svg)](http://badge.fury.io/js/partial.lenses) [![Build Status](https://travis-ci.org/calmm-js/partial.lenses.svg?branch=master)](https://travis-ci.org/calmm-js/partial.lenses) [![](https://david-dm.org/calmm-js/partial.lenses.svg)](https://david-dm.org/calmm-js/partial.lenses) [![](https://david-dm.org/calmm-js/partial.lenses/dev-status.svg)](https://david-dm.org/calmm-js/partial.lenses#info=devDependencies) [![Gitter](https://img.shields.io/gitter/room/calmm-js/chat.js.svg?style=flat-square)](https://gitter.im/calmm-js/chat) | ||
**Protip:** The link headings for functions in this reference have naive | ||
approximate types as tooltips. | ||
### Usage | ||
@@ -353,5 +354,3 @@ | ||
`L.get(l, s)` is the same as `R.view(lift(l), s)` (see | ||
[view](http://ramdajs.com/0.20.0/docs/#view)) and returns the focused element | ||
from a data structure. | ||
`L.get(l, s)` returns the focused element from a data structure. | ||
@@ -367,5 +366,4 @@ For example: | ||
`L.modify(l, x2x, s)` is the same as `R.over(lift(l), x2x, s)` (see | ||
[over](http://ramdajs.com/0.20.0/docs/#over)) and allows one to map over the | ||
focused element of a data structure. | ||
`L.modify(l, x2x, s)` allows one to map over the focused element of a data | ||
structure. | ||
@@ -379,6 +377,2 @@ For example: | ||
#### [`L.over(l, x2x, s)`](#loverl-x2x-s "L.over :: PLens s a -> (Maybe a -> Maybe a) -> Maybe s -> Maybe s") | ||
**`L.over` is a deprecated synonym for `L.modify` and will be removed.** | ||
#### [`L.remove(l, s)`](#lremovel-s "L.remove :: PLens s a -> Maybe s -> Maybe s") | ||
@@ -413,7 +407,3 @@ | ||
`L.set(l, x, s)` is the same as `R.set(lift(l), x, s)` (see | ||
[set](http://ramdajs.com/0.20.0/docs/#set)) and is also equivalent to | ||
`L.modify(l, () => x, s)`. Assuming that `0 <= i && i < xs.length` and `x !== | ||
undefined` then `L.set(i, x, xs)` is also equivalent to `R.update(i, x, xs)` | ||
(see [update](http://ramdajs.com/0.20.0/docs/#update)). | ||
`L.set(l, x, s)` is equivalent to `L.modify(l, () => x, s)`. | ||
@@ -427,6 +417,2 @@ For example: | ||
#### [`L.view(l, s)`](#lviewl-s "L.get :: PLens s a -> Maybe s -> Maybe a") | ||
**`L.view` is a deprecated synonym for `L.get` and will be removed.** | ||
### Lens combinators | ||
@@ -498,10 +484,15 @@ | ||
#### [`L.compose(l, ...ls)`](#lcomposel-ls "L.compose :: (PLens s s1, ...PLens sN a) -> PLens s a") | ||
#### [`L.compose(...ls)`](#lcomposels "L.compose :: (PLens s s1, ...PLens sN a) -> PLens s a") | ||
The default import `P(l, ...ls)` and `L.compose(l, ...ls)` both are the same as | ||
`R.compose(lift(l), ...ls.map(lift))` (see | ||
[compose](http://ramdajs.com/0.20.0/docs/#compose)) and compose a lens from a | ||
path of lenses. Furthermore, `L.compose()` is the same as `L.identity`, which | ||
reflects the fact that `L.identity` is the identity element of lens composition. | ||
The default import `P` and `L.compose` refer to the one and same function, which | ||
performs lens composition. The following equations characterize lens | ||
composition: | ||
```js | ||
L.compose() = L.identity | ||
L.compose(l) = l | ||
L.get(L.compose(l, ...ls)) = R.pipe(L.get(l), ...ls.map(L.get)) | ||
L.modify(L.compose(l, ...ls)) = R.pipe(L.modify(l), ...ls.map(L.modify)) | ||
``` | ||
For example: | ||
@@ -569,7 +560,7 @@ | ||
#### [`L.findWith(l, ...ls)`](#lfindwithl-ls "L.findWith :: (PLens s s1, ...PLens sN a) -> PLens [s] a") | ||
#### [`L.findWith(...ls)`](#lfindwithls "L.findWith :: (PLens s s1, ...PLens sN a) -> PLens [s] a") | ||
`L.findWith(l, ...ls)` chooses an index from an array through which the given | ||
lens, `P(l, ...ls)`, focuses on a defined item and then returns a lens that | ||
focuses on that item. | ||
`L.findWith(...ls)` chooses an index from an array through which the given lens, | ||
`P(...ls)`, focuses on a defined item and then returns a lens that focuses on | ||
that item. | ||
@@ -585,31 +576,23 @@ For example: | ||
#### [`L.firstOf(l, ...ls)`](#lfirstofl-ls "L.firstOf :: (PLens s a, ...PLens s a) -> PLens s a") | ||
#### [`L.identity`](#lidentity "L.identity :: PLens s s") | ||
**`L.firstOf` is deprecated and will be removed. See `L.choice` and `L.orElse`.** | ||
`L.identity` is the identity element of lens composition. The following | ||
equations characterize `L.identity`: | ||
`L.firstOf(l, ...ls)` returns a partial lens that acts like the first of the | ||
given lenses, `l, ...ls`, whose view is not undefined on the given target. When | ||
the views of all of the given lenses are undefined, the returned lens acts like | ||
`l`. | ||
```js | ||
L.get(L.identity, x) = x | ||
L.modify(L.identity, f, x) = f(x) | ||
L.compose(L.identity, l) = l | ||
L.compose(l, L.identity) = l | ||
``` | ||
Note that `L.firstOf` is an associative operation, but there is no identity | ||
element. | ||
#### [`L.index(integer)`](#lindexinteger "L.index :: Integer -> PLens [a] a") | ||
#### [`L.identity`](#lidentity "L.identity :: PLens s s") | ||
`L.index(integer)` or `integer` focuses on the specified array index. | ||
`L.identity` is equivalent to `R.lens(R.identity, R.identity)` and is the | ||
identity element of lenses: both `P(L.identity, l)` and `P(l, L.identity)` are | ||
equivalent to `l`. | ||
#### [`L.index(integer)`](#lindexinteger "L.index :: Integer -> PLens [a] a") | ||
`L.index(integer)` or `P(integer)` is similar to `R.lensIndex(integer)` (see | ||
[lensIndex](http://ramdajs.com/0.20.0/docs/#lensIndex)), but acts as a partial | ||
lens: | ||
* When viewing an undefined array index or an undefined array, the result is | ||
undefined. | ||
* When setting an array index to undefined, the element is removed from the | ||
resulting array, shifting all higher indices down by one. If the result would | ||
be an array without indices (ignoring length), the whole result will be | ||
undefined. | ||
* When setting to undefined, the element is removed from the resulting array, | ||
shifting all higher indices down by one. If the result would be an array | ||
without indices (ignoring length), the whole result will be undefined. | ||
@@ -646,5 +629,37 @@ **NOTE:** There is a gotcha related to removing elements from an array. Namely, | ||
`L.lens(get, set)` is the same as `R.lens(get, set)` (see | ||
[lens](http://ramdajs.com/0.20.0/docs/#lens)) and creates a new primitive lens. | ||
`L.lens(get, set)` creates a new primitive lens. One should think twice before | ||
introducing a new primitive lens—most of the combinators in this library | ||
have been introduced to reduce the need to write new primitive lenses. With | ||
that said, there are still valid reasons to create new primitive lenses. For | ||
example, here is a lens that we've used in production, written with the help of | ||
[Moment.js](http://momentjs.com/), to bidirectionally convert a pair of `start` | ||
and `end` times to a duration: | ||
```js | ||
const timesAsDuration = L.lens( | ||
({start, end} = {}) => { | ||
if (undefined === start) | ||
return undefined | ||
if (undefined === end) | ||
return "Infinity" | ||
return moment.duration(moment(end).diff(moment(start))).toJSON() | ||
}, | ||
(duration, {start = moment().toJSON()} = {}) => { | ||
if (undefined === duration || "Infinity" === duration) { | ||
return {start} | ||
} else { | ||
return { | ||
start, | ||
end: moment(start).add(moment.duration(duration)).toJSON() | ||
}; | ||
} | ||
} | ||
) | ||
``` | ||
When composed with `L.pick`, to flexibly pick the `start` and `end` times, the | ||
above can be adapted to work in a wide variety of cases. However, the above | ||
lens will never be added to this library, because it would require adding | ||
dependency to [Moment.js](http://momentjs.com/). | ||
#### [`L.normalize(value => value)`](#lnormalizevalue--value "L.normalize :: (s -> s) -> PLens s s") | ||
@@ -735,5 +750,4 @@ | ||
`L.prop(string)` or `P(string)` is similar to `R.lensProp(string)` (see | ||
[lensProp](http://ramdajs.com/0.20.0/docs/#lensProp)), but acts as a partial | ||
lens: | ||
`L.prop(string)` or `string` focuses on the specified object property. | ||
* When viewing an undefined property or an undefined object, the result is | ||
@@ -744,3 +758,3 @@ undefined. | ||
#### [`L.props(key, ...keys)`](#lpropskey-keys "L.props :: (p1 :: a1, ...ps) -> PLens {p1 :: a1, ...ps, ...o} {p1 :: a1, ...ps}") | ||
#### [`L.props(...strings)`](#lpropsstrings "L.props :: (p1 :: a1, ...ps) -> PLens {p1 :: a1, ...ps, ...o} {p1 :: a1, ...ps}") | ||
@@ -796,21 +810,16 @@ `L.props(k1, ..., kN)` is equivalent to `L.pick({[k1]: k1, ..., [kN]: kN})` and | ||
### Auxiliary | ||
### Interop | ||
#### [`L.lift(pl)`](#lliftpl "L.lift :: (p :: a) -> PLens {p :: a, ...ps} a & Integer -> PLens [a] a & PLens s a -> PLens s a") | ||
Conversions between lens libraries. | ||
The idempotent `lift` operation is defined as | ||
#### [`L.fromRamda(lens)`](#lfromramdalens "L.fromRamda :: Lens s a -> PLens s a") | ||
```js | ||
const lift = l => { | ||
switch (typeof l) { | ||
case "string": return L.prop(l) | ||
case "number": return L.index(l) | ||
default: return l | ||
} | ||
} | ||
``` | ||
`L.fromRamda(lens)` converts the given Ramda lens to a partial lens. Note that | ||
this does not change the behavior of the lens on undefined values. | ||
and is available as a non-default export. All operations in this library that | ||
take lenses as arguments implicitly lift them. | ||
#### [`L.toRamda(plens)`](#ltoramdaplens "L.toRamda :: PLens s a -> Lens s a") | ||
`L.toRamda(plens)` converts the given partial lens to a Ramda lens. Note that | ||
this does not change the behavior of the lens on undefined values. | ||
## Background | ||
@@ -841,3 +850,3 @@ | ||
With partial lenses you can robustly compose a path lens from prop lenses | ||
`R.compose(L.prop(p0), ...ps.map(L.prop))` or just use the shorthand notation | ||
`L.compose(L.prop(p0), ...ps.map(L.prop))` or just use the shorthand notation | ||
`P(p0, ...ps)`. | ||
@@ -844,0 +853,0 @@ |
@@ -1,14 +0,19 @@ | ||
import R from "ramda" | ||
import * as R from "ramda" | ||
// | ||
const warned = {} | ||
const id = x => x | ||
const snd = (_, c) => c | ||
const deprecated = message => { | ||
if (!(message in warned)) { | ||
warned[message] = message | ||
console.warn("partial.lenses:", message) | ||
} | ||
// | ||
const check = (expected, predicate) => x => { | ||
if (predicate(x)) | ||
return x | ||
else | ||
throw new Error(`Expected ${expected}, but got ${x}.`) | ||
} | ||
const assert = process.env.NODE_ENV === "production" ? () => id : check | ||
// | ||
@@ -60,20 +65,18 @@ | ||
const snd = (_, c) => c | ||
const seemsLens = x => typeof x === "function" && x.length === 1 | ||
// | ||
export const fromRamda = assert("a lens", seemsLens) | ||
export const lift = l => { | ||
switch (typeof l) { | ||
case "string": return prop(l) | ||
case "number": return index(l) | ||
default: return l | ||
} | ||
export const toRamda = l => { | ||
if (isProp(l)) return toRamdaProp(l) | ||
if (isIndex(l)) return toRamdaIndex(l) | ||
return fromRamda(l) | ||
} | ||
export const compose = (...ls) => | ||
ls.length === 0 ? identity : | ||
ls.length === 1 ? lift(ls[0]) : | ||
R.compose(...ls.map(lift)) | ||
ls.length === 0 ? identity : | ||
ls.length === 1 ? ls[0] : | ||
R.compose(...ls.map(toRamda)) | ||
export const remove = R.curry((l, s) => R.set(lift(l), undefined, s)) | ||
export const remove = R.curry((l, s) => R.set(toRamda(l), undefined, s)) | ||
@@ -87,14 +90,8 @@ export const removeAll = R.curry((lens, data) => { | ||
export const lens = R.lens | ||
export const modify = R.curry((l, x2x, s) => R.over(lift(l), x2x, s)) | ||
export const over = R.curry((l, x2x, s) => | ||
deprecated("`over` has been deprecated --- use `modify`") || | ||
R.over(lift(l), x2x, s)) | ||
export const set = R.curry((l, x, s) => R.set(lift(l), x, s)) | ||
export const get = R.curry((l, s) => R.view(lift(l), s)) | ||
export const view = R.curry((l, s) => | ||
deprecated("`view` has been deprecated --- use `get`") || | ||
R.view(lift(l), s)) | ||
export const modify = R.curry((l, x2x, s) => R.over(toRamda(l), x2x, s)) | ||
export const set = R.curry((l, x, s) => R.set(toRamda(l), x, s)) | ||
export const get = R.curry((l, s) => R.view(toRamda(l), s)) | ||
export const choose = x2yL => toFunctor => target => { | ||
const l = lift(x2yL(target)) | ||
const l = toRamda(x2yL(target)) | ||
return R.map(focus => R.set(l, focus, target), toFunctor(R.view(l, target))) | ||
@@ -113,9 +110,5 @@ } | ||
export const firstOf = (l, ...ls) => | ||
deprecated("`firstOf` has been deprecated --- use `choice` and `orElse`") || | ||
orElse(l, choice(l, ...ls)) | ||
export const replace = R.curry((inn, out) => | ||
R.lens(x => R.equals(x, inn) ? out : x, | ||
toConserve(y => R.equals(y, out) ? inn : y))) | ||
lens(x => R.equals(x, inn) ? out : x, | ||
toConserve(y => R.equals(y, out) ? inn : y))) | ||
@@ -127,8 +120,12 @@ export const defaults = replace(undefined) | ||
export const normalize = transform => | ||
R.lens(toPartial(transform), toConserve(toPartial(transform))) | ||
lens(toPartial(transform), toConserve(toPartial(transform))) | ||
export const prop = k => | ||
R.lens(o => o && o[k], | ||
(v, o) => v === undefined ? deleteKey(k, o) : setKey(k, v, o)) | ||
const isProp = x => typeof x === "string" | ||
export const prop = assert("a string", isProp) | ||
const toRamdaProp = k => | ||
lens(o => o && o[k], | ||
(v, o) => v === undefined ? deleteKey(k, o) : setKey(k, v, o)) | ||
export const find = predicate => choose(xs => { | ||
@@ -141,8 +138,12 @@ if (xs === undefined) | ||
export const findWith = (l, ...ls) => { | ||
const lls = compose(l, ...ls) | ||
export const findWith = (...ls) => { | ||
const lls = toRamda(compose(...ls)) | ||
return compose(find(x => R.view(lls, x) !== undefined), lls) | ||
} | ||
export const index = i => R.lens(xs => xs && xs[i], (x, xs) => { | ||
const isIndex = x => Number.isInteger(x) && 0 <= x | ||
export const index = assert("a non-negative integer", isIndex) | ||
const toRamdaIndex = i => lens(xs => xs && xs[i], (x, xs) => { | ||
if (x === undefined) { | ||
@@ -165,9 +166,9 @@ if (xs === undefined) | ||
export const append = R.lens(snd, (x, xs) => | ||
export const append = lens(snd, (x, xs) => | ||
x === undefined ? xs : xs === undefined ? [x] : xs.concat([x])) | ||
export const filter = p => R.lens(xs => xs && xs.filter(p), (ys, xs) => | ||
export const filter = p => lens(xs => xs && xs.filter(p), (ys, xs) => | ||
conserve(dropped(R.concat(ys || [], (xs || []).filter(R.complement(p)))), xs)) | ||
export const augment = template => R.lens( | ||
export const augment = template => lens( | ||
toPartial(x => { | ||
@@ -198,3 +199,3 @@ const z = {...x} | ||
export const pick = template => R.lens( | ||
export const pick = template => lens( | ||
c => { | ||
@@ -219,9 +220,6 @@ let r | ||
export const identity = R.lens(R.identity, conserve) | ||
export const identity = lens(id, conserve) | ||
export const props = (k, ...ks) => { | ||
const kks = [k, ...ks] | ||
return pick(R.zipObj(kks, kks)) | ||
} | ||
export const props = (...ks) => pick(R.zipObj(ks, ks)) | ||
export default compose |
@@ -1,2 +0,2 @@ | ||
import R from "ramda" | ||
import * as R from "ramda" | ||
@@ -15,4 +15,6 @@ import P, * as L from "../src/partial.lenses" | ||
const run = expr => eval(`(P, L, R) => ${expr}`)(P, L, R) | ||
const testEq = (expr, expect) => it(`${expr} => ${show(expect)}`, () => { | ||
const actual = eval(`(P, L, R) => ${expr}`)(P, L, R) | ||
const actual = run(expr) | ||
if (!R.equals(actual, expect)) | ||
@@ -22,9 +24,23 @@ throw new Error(`Expected: ${show(expect)}, actual: ${show(actual)}`) | ||
describe("default === compose", () => { | ||
it("P === L.compose", () => { | ||
if (P !== L.compose) | ||
throw new Error("Not the same") | ||
}) | ||
const testThrows = expr => it(`${expr} => throws`, () => { | ||
let raised | ||
let result | ||
try { | ||
result = run(expr) | ||
raised = false | ||
} catch (e) { | ||
result = e | ||
raised = true | ||
} | ||
if (!raised) | ||
throw new Error(`Expected ${expr} to throw, returned ${show(result)}`) | ||
}) | ||
describe("compose", () => { | ||
testEq("P === L.compose", true) | ||
testEq('P() === L.identity', true) | ||
testEq('P("x")', "x") | ||
testEq('P(101)', 101) | ||
}) | ||
describe("arities", () => { | ||
@@ -38,3 +54,4 @@ testEq('L.augment.length', 1) | ||
testEq('L.find.length', 1) | ||
testEq('L.findWith.length', 1) | ||
testEq('L.findWith.length', 0) | ||
testEq('L.fromRamda.length', 1) | ||
testEq('L.get.length', 2) | ||
@@ -48,3 +65,3 @@ testEq('L.index.length', 1) | ||
testEq('L.prop.length', 1) | ||
testEq('L.props.length', 1) | ||
testEq('L.props.length', 0) | ||
testEq('L.remove.length', 2) | ||
@@ -54,4 +71,10 @@ testEq('L.replace.length', 2) | ||
testEq('L.set.length', 3) | ||
testEq('L.toRamda.length', 1) | ||
}) | ||
describe("interop", () => { | ||
testEq('R.set(L.toRamda(0), "a", ["b"])', ["a"]) | ||
testEq('L.get(L.fromRamda(R.lensProp("x")), {x: "b"})', "b") | ||
}) | ||
describe('L.find', () => { | ||
@@ -69,2 +92,7 @@ testEq('L.set(L.find(R.equals(2)), undefined, [,,2])', undefined) | ||
describe('L.index', () => { | ||
if (process.env.NODE_ENV !== "production") { | ||
testThrows('L.index("x")') | ||
testThrows('L.index(-1)') | ||
testThrows('L.index()') | ||
} | ||
testEq('L.set(P(1), undefined, [,,])', undefined) | ||
@@ -85,2 +113,7 @@ testEq('L.set(P(L.required([]), 1), undefined, [,,])', []) | ||
describe('L.prop', () => { | ||
if (process.env.NODE_ENV !== "production") { | ||
testThrows('L.prop(2)') | ||
testThrows('L.prop(x => x)') | ||
testThrows('L.prop()') | ||
} | ||
testEq('L.set(P("x"), undefined, {x: 1})', undefined) | ||
@@ -144,15 +177,2 @@ testEq('L.set(P("x", L.required(null)), undefined, {x: 1})', {x: null}) | ||
describe("L.firstOf", () => { | ||
testEq('L.get(L.firstOf("x", "y"), {x: 11, y: 12})', 11) | ||
testEq('L.get(L.firstOf("y", "x"), {x: 11, y: 12})', 12) | ||
testEq('L.get(L.firstOf("x", "y"), {z: 13})', undefined) | ||
testEq('L.modify(L.firstOf("x", "y"), x => x-2, {x: 11, y: 12})', {x: 9, y: 12}) | ||
testEq('L.modify(L.firstOf("y", "x"), x => x-2, {x: 11, y: 12})', {x: 11, y: 10}) | ||
testEq('L.set(L.firstOf("x", "y"), 12, {z: 13})', {x: 12, z: 13}) | ||
testEq('L.set(L.firstOf("y", "x"), 12, {z: 13})', {y: 12, z: 13}) | ||
testEq('L.remove(L.firstOf("x", "y"), {z: 13})', {z: 13}) | ||
testEq('L.remove(L.firstOf("x", "y"), {x: 11, y: 12})', {y: 12}) | ||
testEq('L.remove(L.firstOf("y", "x"), {x: 11, y: 12})', {x: 11}) | ||
}) | ||
describe("L.findWith", () => { | ||
@@ -194,3 +214,3 @@ testEq('L.get(L.findWith("x", 1), [{x: ["a"]},{x: ["b","c"]}])', "c") | ||
testEq('L.remove(P(L.pick({x: "b"}), "x"), {a: [2], b: 1})', {a: [2]}) | ||
testEq('L.removeAll(P(L.pick({x: "b", y: "a"}), L.firstOf("y", "x")), {a: [2], b: 1})', undefined) | ||
testEq('L.removeAll(P(L.pick({x: "b", y: "a"}), L.choice("y", "x")), {a: [2], b: 1})', undefined) | ||
}) | ||
@@ -197,0 +217,0 @@ |
Sorry, the diff of this file is not supported yet
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 1 instance in 1 package
1087
864
190871
4