UNPKG

eff

Version:

An extensible effect monad based on the freer monad

160 lines (134 loc) 14.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.interpreter = exports.run = exports.chain = exports.equals = exports.map = exports.send = exports.impure = exports.of = exports.pure = void 0; var _ramda = require("ramda"); var _daggy = require("daggy"); // value :: any // effect :: any // continuation :: any -> Eff var Eff = (0, _daggy.taggedSum)("Eff", { Pure: ["value"], Impure: ["effect", "continuation"] }); var pure = Eff.Pure; exports.pure = pure; var of = pure; exports.of = of; var impure = function impure(continuation) { return function (effect) { return Eff.Impure(effect, continuation); }; }; exports.impure = impure; var send = function send(effect) { return Eff.Impure(effect, Eff.Pure); }; exports.send = send; var pipeK = function pipeK(a, b) { return function (c) { return a(c).chain(b); }; }; // ----------------------------------------------------------------------------- // Equals // ----------------------------------------------------------------------------- var map = function map(f) { return function (eff) { return chain(function (a) { return pure(f(a)); })(eff); }; }; exports.map = map; Eff.prototype.map = function (f) { return map(f)(this); }; // ----------------------------------------------------------------------------- // Equals // ----------------------------------------------------------------------------- var equals = function equals(a) { return function (b) { return a.cata({ Pure: b.cata({ Pure: _ramda.equals, Impure: (0, _ramda.always)(_ramda.F) }), Impure: function Impure(aEffect, aContinuation) { return b.cata({ Pure: _ramda.F, Impure: function Impure(bEffect, bContinuation) { return (0, _ramda.equals)(aEffect, bEffect) && (0, _ramda.equals)(aContinuation, bContinuation); } }); } }); }; }; exports.equals = equals; Eff.prototype.equals = function (b) { return equals(this)(b); }; // ----------------------------------------------------------------------------- // Chain // ----------------------------------------------------------------------------- var chain = function chain(nextContinuation) { return function (eff) { return eff.cata({ Pure: function Pure(x) { return nextContinuation(x); }, Impure: function Impure(effect, continuation) { return Eff.Impure(effect, pipeK(continuation, nextContinuation)); } }); }; }; exports.chain = chain; Eff.prototype.chain = function (nextContinuation) { return chain(nextContinuation)(this); }; // ----------------------------------------------------------------------------- // Interpreting and Running // ----------------------------------------------------------------------------- var run = function run(interpreters) { return function (callback) { return function (effectfulMonad) { return interpreters.reduce(function (previousInterpreter, currentInterpreter) { return currentInterpreter({ interpreterContinuation: previousInterpreter, interpreterRestart: function interpreterRestart(x) { return run(interpreters)(callback)(x); } }); }, function (finalMonad) { return finalMonad.cata({ Pure: function Pure(x) { callback(x); }, Impure: function Impure(effect) { throw "There was an unhandled effect: ".concat(effect.toString()); } }); })(effectfulMonad); }; }; }; exports.run = run; var interpreter = function interpreter(_ref) { var predicate = _ref.predicate, handler = _ref.handler; return function (_ref2) { var interpreterContinuation = _ref2.interpreterContinuation, interpreterRestart = _ref2.interpreterRestart; return function (m) { return m.cata({ Pure: function Pure(x) { return interpreterContinuation(Eff.Pure(x)); }, Impure: function Impure(effect, continuation) { return predicate(effect) ? handler(effect)((0, _ramda.pipe)(continuation, interpreterRestart)) : interpreterContinuation(Eff.Impure(effect, continuation)); } }); }; }; }; exports.interpreter = interpreter; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NvdXJjZXMvZWZmLmpzIl0sIm5hbWVzIjpbIkVmZiIsIlB1cmUiLCJJbXB1cmUiLCJwdXJlIiwib2YiLCJpbXB1cmUiLCJjb250aW51YXRpb24iLCJlZmZlY3QiLCJzZW5kIiwicGlwZUsiLCJhIiwiYiIsImMiLCJjaGFpbiIsIm1hcCIsImYiLCJlZmYiLCJwcm90b3R5cGUiLCJlcXVhbHMiLCJjYXRhIiwiZXF1YWxzR2VuZXJpYyIsIkYiLCJhRWZmZWN0IiwiYUNvbnRpbnVhdGlvbiIsImJFZmZlY3QiLCJiQ29udGludWF0aW9uIiwibmV4dENvbnRpbnVhdGlvbiIsIngiLCJydW4iLCJpbnRlcnByZXRlcnMiLCJjYWxsYmFjayIsImVmZmVjdGZ1bE1vbmFkIiwicmVkdWNlIiwicHJldmlvdXNJbnRlcnByZXRlciIsImN1cnJlbnRJbnRlcnByZXRlciIsImludGVycHJldGVyQ29udGludWF0aW9uIiwiaW50ZXJwcmV0ZXJSZXN0YXJ0IiwiZmluYWxNb25hZCIsInRvU3RyaW5nIiwiaW50ZXJwcmV0ZXIiLCJwcmVkaWNhdGUiLCJoYW5kbGVyIiwibSJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUVBOztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQU1BLEdBQUcsR0FBRyxzQkFBVSxLQUFWLEVBQWlCO0FBQzVCQyxFQUFBQSxJQUFJLEVBQUUsQ0FBQyxPQUFELENBRHNCO0FBRTVCQyxFQUFBQSxNQUFNLEVBQUUsQ0FBQyxRQUFELEVBQVcsY0FBWDtBQUZvQixDQUFqQixDQUFaO0FBU08sSUFBTUMsSUFBSSxHQUFHSCxHQUFHLENBQUNDLElBQWpCOztBQUVBLElBQU1HLEVBQUUsR0FBR0QsSUFBWDs7O0FBRUEsSUFBTUUsTUFBTSxHQUFHLFNBQVRBLE1BQVMsQ0FBQ0MsWUFBRDtBQUFBLFNBQTRCLFVBQUNDLE1BQUQ7QUFBQSxXQUNqRFAsR0FBRyxDQUFDRSxNQUFKLENBQVdLLE1BQVgsRUFBbUJELFlBQW5CLENBRGlEO0FBQUEsR0FBNUI7QUFBQSxD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Q0MsSUFBSixDQUFTMEIsQ0FBVCxDQUFELENBQTNCO0FBQUEsU0FERDtBQUVOekIsUUFBQUEsTUFBTSxFQUFFLGdCQUFDSyxNQUFELEVBQVNELFlBQVQ7QUFBQSxpQkFDUGtDLFNBQVMsQ0FBQ2pDLE1BQUQsQ0FBVCxHQUNHa0MsT0FBTyxDQUFDbEMsTUFBRCxDQUFQLENBQ0EsaUJBQ0NELFlBREQsRUFFQzhCLGtCQUZELENBREEsQ0FESCxHQU9HRCx1QkFBdUIsQ0FBQ25DLEdBQUcsQ0FBQ0UsTUFBSixDQUFXSyxNQUFYLEVBQW1CRCxZQUFuQixDQUFELENBUm5CO0FBQUE7QUFGRixPQUFQLENBREs7QUFBQSxLQU5BO0FBQUEsR0FOcUI7QUFBQSxDQUFwQiIsInNvdXJjZXNDb250ZW50IjpbIi8qIEBmbG93ICovXG5cbmltcG9ydCB7IGFsd2F5cywgcGlwZSwgZXF1YWxzIGFzIGVxdWFsc0dlbmVyaWMsIEYgfSBmcm9tIFwicmFtZGFcIjtcbmltcG9ydCB7IHRhZ2dlZFN1bSB9IGZyb20gXCJkYWdneVwiO1xuXG4vLyB2YWx1ZSA6OiBhbnlcbi8vIGVmZmVjdCA6OiBhbnlcbi8vIGNvbnRpbnVhdGlvbiA6OiBhbnkgLT4gRWZmXG5jb25zdCBFZmYgPSB0YWdnZWRTdW0oXCJFZmZcIiwge1xuXHRQdXJlOiBbXCJ2YWx1ZVwiXSxcblx0SW1wdXJlOiBbXCJlZmZlY3RcIiwgXCJjb250aW51YXRpb25cIl0sXG59KTtcblxudHlwZSBQdXJlID0geyBjYXRhOiBGdW5jdGlvbiB9O1xudHlwZSBJbXB1cmUgPSB7IGNhdGE6IEZ1bmN0aW9uIH07XG50eXBlIEVmZk1vbmFkID0gUHVyZSB8IEltcHVyZTtcblxuZXhwb3J0IGNvbnN0IHB1cmUgPSBFZmYuUHVyZTtcblxuZXhwb3J0IGNvbnN0IG9mID0gcHVyZTtcblxuZXhwb3J0IGNvbnN0IGltcHVyZSA9IChjb250aW51YXRpb246IEZ1bmN0aW9uKSA9PiAoZWZmZWN0OiBFZmZNb25hZCkgPT5cblx0RWZmLkltcHVyZShlZmZlY3QsIGNvbnRpbnVhdGlvbik7XG5cbmV4cG9ydCBjb25zdCBzZW5kID0gKGVmZmVjdDogYW55KSA9PiBFZmYuSW1wdXJlKGVmZmVjdCwgRWZmLlB1cmUpO1xuXG5jb25zdCBwaXBlSyA9IChhLCBiKSA9PiBjID0+IGEoYykuY2hhaW4oYik7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBFcXVhbHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCBjb25zdCBtYXAgPSAoZjogRnVuY3Rpb24pID0+IChlZmY6IEVmZk1vbmFkKSA9PlxuXHRjaGFpbihhID0+IHB1cmUoZihhKSkpKGVmZik7XG5cbkVmZi5wcm90b3R5cGUubWFwID0gZnVuY3Rpb24oZikge1xuXHRyZXR1cm4gbWFwKGYpKHRoaXMpO1xufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEVxdWFsc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGNvbnN0IGVxdWFscyA9IChhOiBFZmZNb25hZCkgPT4gKGI6IEVmZk1vbmFkKSA9PlxuXHRhLmNhdGEoe1xuXHRcdFB1cmU6IGIuY2F0YSh7XG5cdFx0XHRQdXJlOiBlcXVhbHNHZW5lcmljLFxuXHRcdFx0SW1wdXJlOiBhbHdheXMoRiksXG5cdFx0fSksXG5cdFx0SW1wdXJlOiAoYUVmZmVjdCwgYUNvbnRpbnVhdGlvbikgPT5cblx0XHRcdGIuY2F0YSh7XG5cdFx0XHRcdFB1cmU6IEYsXG5cdFx0XHRcdEltcHVyZTogKGJFZmZlY3QsIGJDb250aW51YXRpb24pID0+XG5cdFx0XHRcdFx0ZXF1YWxzR2VuZXJpYyhhRWZmZWN0LCBiRWZmZWN0KSAmJlxuXHRcdFx0XHRcdGVxdWFsc0dlbmVyaWMoYUNvbnRpbnVhdGlvbiwgYkNvbnRpbnVhdGlvbiksXG5cdFx0XHR9KSxcblx0fSk7XG5cbkVmZi5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24oYikge1xuXHRyZXR1cm4gZXF1YWxzKHRoaXMpKGIpO1xufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENoYWluXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgY29uc3QgY2hhaW4gPSAobmV4dENvbnRpbnVhdGlvbjogRnVuY3Rpb24pID0+IChlZmY6IEVmZk1vbmFkKSA9PlxuXHRlZmYuY2F0YSh7XG5cdFx0UHVyZTogeCA9PiBuZXh0Q29udGludWF0aW9uKHgpLFxuXHRcdEltcHVyZTogKGVmZmVjdCwgY29udGludWF0aW9uKSA9PlxuXHRcdFx0RWZmLkltcHVyZShcblx0XHRcdFx0ZWZmZWN0LFxuXHRcdFx0XHRwaXBlSyhcblx0XHRcdFx0XHRjb250aW51YXRpb24sXG5cdFx0XHRcdFx0bmV4dENvbnRpbnVhdGlvbixcblx0XHRcdFx0KSxcblx0XHRcdCksXG5cdH0pO1xuXG5FZmYucHJvdG90eXBlLmNoYWluID0gZnVuY3Rpb24obmV4dENvbnRpbnVhdGlvbikge1xuXHRyZXR1cm4gY2hhaW4obmV4dENvbnRpbnVhdGlvbikodGhpcyk7XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gSW50ZXJwcmV0aW5nIGFuZCBSdW5uaW5nXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgY29uc3QgcnVuID0gKGludGVycHJldGVyczogQXJyYXk8RnVuY3Rpb24+KSA9PiAoY2FsbGJhY2s6IEZ1bmN0aW9uKSA9PiAoXG5cdGVmZmVjdGZ1bE1vbmFkOiBFZmZNb25hZCxcbikgPT5cblx0aW50ZXJwcmV0ZXJzLnJlZHVjZShcblx0XHQocHJldmlvdXNJbnRlcnByZXRlciwgY3VycmVudEludGVycHJldGVyKSA9PlxuXHRcdFx0Y3VycmVudEludGVycHJldGVyKHtcblx0XHRcdFx0aW50ZXJwcmV0ZXJDb250aW51YXRpb246IHByZXZpb3VzSW50ZXJwcmV0ZXIsXG5cdFx0XHRcdGludGVycHJldGVyUmVzdGFydDogeCA9PiBydW4oaW50ZXJwcmV0ZXJzKShjYWxsYmFjaykoeCksXG5cdFx0XHR9KSxcblx0XHRmaW5hbE1vbmFkID0+XG5cdFx0XHRmaW5hbE1vbmFkLmNhdGEoe1xuXHRcdFx0XHRQdXJlOiB4ID0+IHtcblx0XHRcdFx0XHRjYWxsYmFjayh4KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0SW1wdXJlOiBlZmZlY3QgPT4ge1xuXHRcdFx0XHRcdHRocm93IGBUaGVyZSB3YXMgYW4gdW5oYW5kbGVkIGVmZmVjdDogJHtlZmZlY3QudG9TdHJpbmcoKX1gO1xuXHRcdFx0XHR9LFxuXHRcdFx0fSksXG5cdCkoZWZmZWN0ZnVsTW9uYWQpO1xuXG5leHBvcnQgY29uc3QgaW50ZXJwcmV0ZXIgPSAoe1xuXHRwcmVkaWNhdGUsXG5cdGhhbmRsZXIsXG59OiB7XG5cdHByZWRpY2F0ZTogRnVuY3Rpb24sXG5cdGhhbmRsZXI6IEZ1bmN0aW9uLFxufSkgPT4gKHtcblx0aW50ZXJwcmV0ZXJDb250aW51YXRpb24sXG5cdGludGVycHJldGVyUmVzdGFydCxcbn06IHtcblx0aW50ZXJwcmV0ZXJDb250aW51YXRpb246IEZ1bmN0aW9uLFxuXHRpbnRlcnByZXRlclJlc3RhcnQ6IEZ1bmN0aW9uLFxufSkgPT4gKG06IEVmZk1vbmFkKSA9PlxuXHRtLmNhdGEoe1xuXHRcdFB1cmU6IHggPT4gaW50ZXJwcmV0ZXJDb250aW51YXRpb24oRWZmLlB1cmUoeCkpLFxuXHRcdEltcHVyZTogKGVmZmVjdCwgY29udGludWF0aW9uKSA9PlxuXHRcdFx0cHJlZGljYXRlKGVmZmVjdClcblx0XHRcdFx0PyBoYW5kbGVyKGVmZmVjdCkoXG5cdFx0XHRcdFx0XHRwaXBlKFxuXHRcdFx0XHRcdFx0XHRjb250aW51YXRpb24sXG5cdFx0XHRcdFx0XHRcdGludGVycHJldGVyUmVzdGFydCxcblx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdCAgKVxuXHRcdFx0XHQ6IGludGVycHJldGVyQ29udGludWF0aW9uKEVmZi5JbXB1cmUoZWZmZWN0LCBjb250aW51YXRpb24pKSxcblx0fSk7XG4iXX0=