eff
Version:
An extensible effect monad based on the freer monad
69 lines (56 loc) • 5.05 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.interpretState = exports.put = exports.modify = exports.get = void 0;
var _daggy = _interopRequireDefault(require("daggy"));
var _eff = require("./eff.js");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var State = _daggy.default.taggedSum("State", {
get: [],
modify: ["modificationFunction"],
put: ["newState"]
});
var get = function get() {
return (0, _eff.send)(State.get);
};
exports.get = get;
var modify = function modify(modificationFunction) {
return (0, _eff.send)(State.modify(modificationFunction));
};
exports.modify = modify;
var put = function put(newState) {
return (0, _eff.send)(State.put(newState));
};
exports.put = put;
var interpretState = function interpretState(startingState) {
var state = startingState;
return (0, _eff.interpreter)({
predicate: function predicate(x) {
return State.is(x);
},
handler: function handler(stateEffect) {
return stateEffect.cata({
get: function get() {
return function (continuation) {
return continuation(state);
};
},
modify: function modify(modificationFunction) {
return function (continuation) {
state = modificationFunction(state);
return continuation(null);
};
},
put: function put(newState) {
return function (continuation) {
state = newState;
return continuation(null);
};
}
});
}
});
};
exports.interpretState = interpretState;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NvdXJjZXMvc3RhdGUuanMiXSwibmFtZXMiOlsiU3RhdGUiLCJkYWdneSIsInRhZ2dlZFN1bSIsImdldCIsIm1vZGlmeSIsInB1dCIsIm1vZGlmaWNhdGlvbkZ1bmN0aW9uIiwibmV3U3RhdGUiLCJpbnRlcnByZXRTdGF0ZSIsInN0YXJ0aW5nU3RhdGUiLCJzdGF0ZSIsInByZWRpY2F0ZSIsIngiLCJpcyIsImhhbmRsZXIiLCJzdGF0ZUVmZmVjdCIsImNhdGEiLCJjb250aW51YXRpb24iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFFQTs7QUFFQTs7OztBQUVBLElBQU1BLEtBQUssR0FBR0MsZUFBTUMsU0FBTixDQUFnQixPQUFoQixFQUF5QjtBQUN0Q0MsRUFBQUEsR0FBRyxFQUFFLEVBRGlDO0FBRXRDQyxFQUFBQSxNQUFNLEVBQUUsQ0FBQyxzQkFBRCxDQUY4QjtBQUd0Q0MsRUFBQUEsR0FBRyxFQUFFLENBQUMsVUFBRDtBQUhpQyxDQUF6QixDQUFkOztBQU1PLElBQU1GLEdBQUcsR0FBRyxTQUFOQSxHQUFNO0FBQUEsU0FBTSxlQUFLSCxLQUFLLENBQUNHLEdBQVgsQ0FBTjtBQUFBLENBQVo7Ozs7QUFDQSxJQUFNQyxNQUFNLEdBQUcsU0FBVEEsTUFBUyxDQUFDRSxvQkFBRDtBQUFBLFNBQ3JCLGVBQUtOLEtBQUssQ0FBQ0ksTUFBTixDQUFhRSxvQkFBYixDQUFMLENBRHFCO0FBQUEsQ0FBZjs7OztBQUVBLElBQU1ELEdBQUcsR0FBRyxTQUFOQSxHQUFNLENBQUNFLFFBQUQ7QUFBQSxTQUFxQixlQUFLUCxLQUFLLENBQUNLLEdBQU4sQ0FBVUUsUUFBVixDQUFMLENBQXJCO0FBQUEsQ0FBWjs7OztBQUVBLElBQU1DLGNBQWMsR0FBRyxTQUFqQkEsY0FBaUIsQ0FBQ0MsYUFBRCxFQUEwQjtBQUN2RCxNQUFJQyxLQUFLLEdBQUdELGFBQVo7QUFFQSxTQUFPLHNCQUFZO0FBQ2xCRSxJQUFBQSxTQUFTLEVBQUUsbUJBQUFDLENBQUM7QUFBQSxhQUFJWixLQUFLLENBQUNhLEVBQU4sQ0FBU0QsQ0FBVCxDQUFKO0FBQUEsS0FETTtBQUVsQkUsSUFBQUEsT0FBTyxFQUFFLGlCQUFBQyxXQUFXO0FBQUEsYUFDbkJBLFdBQVcsQ0FBQ0MsSUFBWixDQUFpQjtBQUNoQmIsUUFBQUEsR0FBRyxFQUFFO0FBQUEsaUJBQU0sVUFBQWMsWUFBWTtBQUFBLG1CQUFJQSxZQUFZLENBQUNQLEtBQUQsQ0FBaEI7QUFBQSxXQUFsQjtBQUFBLFNBRFc7QUFFaEJOLFFBQUFBLE1BQU0sRUFBRSxnQkFBQUUsb0JBQW9CO0FBQUEsaUJBQUksVUFBQVcsWUFBWSxFQUFJO0FBQy9DUCxZQUFBQSxLQUFLLEdBQUdKLG9CQUFvQixDQUFDSSxLQUFELENBQTVCO0FBQ0EsbUJBQU9PLFlBQVksQ0FBQyxJQUFELENBQW5CO0FBQ0EsV0FIMkI7QUFBQSxTQUZaO0FBTWhCWixRQUFBQSxHQUFHLEVBQUUsYUFBQUUsUUFBUTtBQUFBLGlCQUFJLFVBQUFVLFlBQVksRUFBSTtBQUNoQ1AsWUFBQUEsS0FBSyxHQUFHSCxRQUFSO0FBQ0EsbUJBQU9VLFlBQVksQ0FBQyxJQUFELENBQW5CO0FBQ0EsV0FIWTtBQUFBO0FBTkcsT0FBakIsQ0FEbUI7QUFBQTtBQUZGLEdBQVosQ0FBUDtBQWVBLENBbEJNIiwic291cmNlc0NvbnRlbnQiOlsiLyogQGZsb3cgKi9cblxuaW1wb3J0IGRhZ2d5IGZyb20gXCJkYWdneVwiO1xuXG5pbXBvcnQgeyBpbnRlcnByZXRlciwgc2VuZCB9IGZyb20gXCIuL2VmZi5qc1wiO1xuXG5jb25zdCBTdGF0ZSA9IGRhZ2d5LnRhZ2dlZFN1bShcIlN0YXRlXCIsIHtcblx0Z2V0OiBbXSxcblx0bW9kaWZ5OiBbXCJtb2RpZmljYXRpb25GdW5jdGlvblwiXSxcblx0cHV0OiBbXCJuZXdTdGF0ZVwiXSxcbn0pO1xuXG5leHBvcnQgY29uc3QgZ2V0ID0gKCkgPT4gc2VuZChTdGF0ZS5nZXQpO1xuZXhwb3J0IGNvbnN0IG1vZGlmeSA9IChtb2RpZmljYXRpb25GdW5jdGlvbjogYW55ID0+IGFueSkgPT5cblx0c2VuZChTdGF0ZS5tb2RpZnkobW9kaWZpY2F0aW9uRnVuY3Rpb24pKTtcbmV4cG9ydCBjb25zdCBwdXQgPSAobmV3U3RhdGU6IG1peGVkKSA9PiBzZW5kKFN0YXRlLnB1dChuZXdTdGF0ZSkpO1xuXG5leHBvcnQgY29uc3QgaW50ZXJwcmV0U3RhdGUgPSAoc3RhcnRpbmdTdGF0ZTogbWl4ZWQpID0+IHtcblx0bGV0IHN0YXRlID0gc3RhcnRpbmdTdGF0ZTtcblxuXHRyZXR1cm4gaW50ZXJwcmV0ZXIoe1xuXHRcdHByZWRpY2F0ZTogeCA9PiBTdGF0ZS5pcyh4KSxcblx0XHRoYW5kbGVyOiBzdGF0ZUVmZmVjdCA9PlxuXHRcdFx0c3RhdGVFZmZlY3QuY2F0YSh7XG5cdFx0XHRcdGdldDogKCkgPT4gY29udGludWF0aW9uID0+IGNvbnRpbnVhdGlvbihzdGF0ZSksXG5cdFx0XHRcdG1vZGlmeTogbW9kaWZpY2F0aW9uRnVuY3Rpb24gPT4gY29udGludWF0aW9uID0+IHtcblx0XHRcdFx0XHRzdGF0ZSA9IG1vZGlmaWNhdGlvbkZ1bmN0aW9uKHN0YXRlKTtcblx0XHRcdFx0XHRyZXR1cm4gY29udGludWF0aW9uKG51bGwpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRwdXQ6IG5ld1N0YXRlID0+IGNvbnRpbnVhdGlvbiA9PiB7XG5cdFx0XHRcdFx0c3RhdGUgPSBuZXdTdGF0ZTtcblx0XHRcdFx0XHRyZXR1cm4gY29udGludWF0aW9uKG51bGwpO1xuXHRcdFx0XHR9LFxuXHRcdFx0fSksXG5cdH0pO1xufTtcbiJdfQ==