agson
Version:
Querying and manipulating JSON graphs
104 lines (93 loc) • 2.55 kB
JavaScript
(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);