UNPKG

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
"use strict"; /** * 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==