state-monad-ts
Version:
state monad in typescript
57 lines (56 loc) • 1.87 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.State = exports.unit = void 0;
exports.unit = null;
var State = /** @class */ (function () {
function State(runState) {
var _this = this;
this[Symbol.toStringTag] = "StateMoand";
this.then = this.bind;
this.runState = runState;
this.execState = function (s) { return _this.runState(s)[1]; };
this.evalState = function (s) { return _this.runState(s)[0]; };
}
State.prototype.map = function (f) {
var _this = this;
var runState = function (s) {
var _a = _this.runState(s), a = _a[0], s1 = _a[1];
var b = f(a);
return [b, s1];
};
return new State(runState);
};
State.pure = function (a) {
var runState = function (s) { return [a, s]; };
return new State(runState);
};
State.prototype.ap = function (fa) {
var _this = this;
var runState = function (s) {
var _a = fa.runState(s), f = _a[0], s1 = _a[1];
var _b = _this.runState(s1), a = _b[0], s2 = _b[1];
return [f(a), s2];
};
return new State(runState);
};
State.prototype.bind = function (f) {
var _this = this;
var runState = function (s) {
var _a = _this.runState(s), a = _a[0], s1 = _a[1];
return f(a).runState(s1);
};
return new State(runState);
};
State.prototype.get = function () {
return this;
};
State.prototype.put = function (s) {
return new State(function () { return [exports.unit, s]; });
};
State.prototype.modify = function (f) {
return new State(function (s) { return [exports.unit, f(s)]; });
};
State.return = State.pure;
return State;
}());
exports.State = State;