UNPKG

agson

Version:

Querying and manipulating JSON graphs

104 lines (93 loc) 2.55 kB
(function() { var Just, Nothing, Traversal, fromNullable, isArray, isObject, list, maybeMap, maybeMapValues, nothing, object, recurse, traversal, _ref, _ref1; _ref = require('data.maybe'), Just = _ref.Just, Nothing = _ref.Nothing, fromNullable = _ref.fromNullable; _ref1 = require('./util'), maybeMap = _ref1.maybeMap, maybeMapValues = _ref1.maybeMapValues, isArray = _ref1.isArray, isObject = _ref1.isObject; Traversal = require('./Traversal'); traversal = Traversal.of; nothing = { modify: Nothing, get: Nothing }; list = traversal("list", function(mta) { return { modify: function(f) { return mta.chain(function(ta) { if (!isArray(ta)) { return Nothing(); } else { return Just(maybeMap(ta, function(a) { return f(fromNullable(a)); })); } }); }, get: function() { return mta.chain(function(ta) { if (!isArray(ta)) { return Nothing(); } else { return Just(ta); } }); } }; }); object = traversal("object", function(mo) { return { modify: function(f) { return mo.map(function(object) { if (!isObject(object)) { return Nothing(); } else { return maybeMapValues(object, function(value) { return f(fromNullable(value)); }); } }); }, get: function() { return mo.chain(function(object) { if (!isObject(object)) { return Nothing(); } else { return Just(object); } }); } }; }); recurse = function(lensf) { return traversal("recurse(...)", function(ma) { var abl; abl = lensf(); return { modify: function(f) { return ma.chain(function(a) { var mb, storeb; storeb = abl.runM(ma); mb = storeb.get(); if (mb.isNothing) { return f(ma); } else { return f(storeb.modify(f)); } }); }, get: function() { return ma.chain(function(a) { return abl.runM(ma).get().map(function(bs) { return bs.concat([a]); }).orElse(function() { return Just([a]); }); }); } }; }); }; module.exports = { list: list, object: object, recurse: recurse }; }).call(this);