resig.js
Version:
Universal reactive signal library with complete platform features: signals, animations, CRDTs, scheduling, DOM integration. Works identically across React, SolidJS, Svelte, Vue, and Qwik.
70 lines • 5 kB
JavaScript
;
/**
* Effect Monad - Extends Signal with monadic composition
* Following monadic laws for effect composition
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.sequence = exports.apply = exports.flatten = exports.pureEffect = exports.effect = void 0;
const signal_1 = require("./signal");
/**
* Creates an Effect that follows monadic laws
* Laws verified:
* - bind(pure(a), f) ≡ f(a) (left identity)
* - bind(ma, pure) ≡ ma (right identity)
* - bind(bind(ma, f), g) ≡ bind(ma, λa. bind(f(a), g)) (associativity)
*/
const effect = (initial) => {
const baseSignal = (0, signal_1.signal)(initial);
const effectInstance = {
value: baseSignal.value,
map: baseSignal.map,
subscribe: baseSignal.subscribe,
_set: baseSignal._set,
bind: (f) => {
// Create new effect for the result
const resultEffect = (0, exports.effect)(f(baseSignal.value()).value());
// Subscribe to changes and bind them
baseSignal.subscribe((newValue) => {
const newEffect = f(newValue);
resultEffect._set(newEffect.value());
// Subscribe to the new effect's changes
newEffect.subscribe((boundValue) => {
resultEffect._set(boundValue);
});
});
return resultEffect;
},
chain: function (f) {
return this.bind(f);
},
};
return effectInstance;
};
exports.effect = effect;
/**
* Lifts a value into Effect context (pure for Effect monad)
*/
const pureEffect = (value) => (0, exports.effect)(value);
exports.pureEffect = pureEffect;
/**
* Flattens nested Effects (join operation)
*/
const flatten = (nestedEffect) => {
return nestedEffect.bind((innerEffect) => innerEffect);
};
exports.flatten = flatten;
/**
* Applies a function wrapped in an Effect to a value wrapped in an Effect
*/
const apply = (effectF, effectA) => {
return effectF.bind((f) => effectA.bind((a) => (0, exports.pureEffect)(f(a))));
};
exports.apply = apply;
/**
* Sequences an array of Effects into an Effect of array
*/
const sequence = (effects) => {
return effects.reduce((acc, curr) => acc.bind((arr) => curr.bind((val) => (0, exports.pureEffect)([...arr, val]))), (0, exports.pureEffect)([]));
};
exports.sequence = sequence;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWZmZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvcmUvZWZmZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7OztBQUVILHFDQUFpRDtBQU9qRDs7Ozs7O0dBTUc7QUFDSSxNQUFNLE1BQU0sR0FBRyxDQUNwQixPQUFVLEVBQ2dDLEVBQUU7SUFDNUMsTUFBTSxVQUFVLEdBQUcsSUFBQSxlQUFNLEVBQUMsT0FBTyxDQUFDLENBQUM7SUFFbkMsTUFBTSxjQUFjLEdBQTZDO1FBQy9ELEtBQUssRUFBRSxVQUFVLENBQUMsS0FBSztRQUN2QixHQUFHLEVBQUUsVUFBVSxDQUFDLEdBQUc7UUFDbkIsU0FBUyxFQUFFLFVBQVUsQ0FBQyxTQUFTO1FBQy9CLElBQUksRUFBRSxVQUFVLENBQUMsSUFBSTtRQUVyQixJQUFJLEVBQUUsQ0FBSSxDQUFzQixFQUFhLEVBQUU7WUFDN0MsbUNBQW1DO1lBQ25DLE1BQU0sWUFBWSxHQUFHLElBQUEsY0FBTSxFQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBRTNELHFDQUFxQztZQUNyQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7Z0JBQ2hDLE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDOUIsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztnQkFFckMsd0NBQXdDO2dCQUN4QyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUU7b0JBQ2pDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ2hDLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7WUFFSCxPQUFPLFlBQVksQ0FBQztRQUN0QixDQUFDO1FBRUQsS0FBSyxFQUFFLFVBQWEsQ0FBc0I7WUFDeEMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLENBQUM7S0FDRixDQUFDO0lBRUYsT0FBTyxjQUFjLENBQUM7QUFDeEIsQ0FBQyxDQUFDO0FBbkNXLFFBQUEsTUFBTSxVQW1DakI7QUFFRjs7R0FFRztBQUNJLE1BQU0sVUFBVSxHQUFHLENBQUksS0FBUSxFQUFhLEVBQUUsQ0FBQyxJQUFBLGNBQU0sRUFBQyxLQUFLLENBQUMsQ0FBQztBQUF2RCxRQUFBLFVBQVUsY0FBNkM7QUFFcEU7O0dBRUc7QUFDSSxNQUFNLE9BQU8sR0FBRyxDQUFJLFlBQStCLEVBQWEsRUFBRTtJQUN2RSxPQUFPLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3pELENBQUMsQ0FBQztBQUZXLFFBQUEsT0FBTyxXQUVsQjtBQUVGOztHQUVHO0FBQ0ksTUFBTSxLQUFLLEdBQUcsQ0FDbkIsT0FBNEIsRUFDNUIsT0FBa0IsRUFDUCxFQUFFO0lBQ2IsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFBLGtCQUFVLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BFLENBQUMsQ0FBQztBQUxXLFFBQUEsS0FBSyxTQUtoQjtBQUVGOztHQUVHO0FBQ0ksTUFBTSxRQUFRLEdBQUcsQ0FBSSxPQUFvQixFQUFlLEVBQUU7SUFDL0QsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUNuQixDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUNaLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUEsa0JBQVUsRUFBQyxDQUFDLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUNsRSxJQUFBLGtCQUFVLEVBQUMsRUFBUyxDQUFDLENBQ3RCLENBQUM7QUFDSixDQUFDLENBQUM7QUFOVyxRQUFBLFFBQVEsWUFNbkIifQ==