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.

62 lines 4.55 kB
/** * Effect Monad - Extends Signal with monadic composition * Following monadic laws for effect composition */ import { signal } from './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) */ export const effect = (initial) => { const baseSignal = 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 = 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; }; /** * Lifts a value into Effect context (pure for Effect monad) */ export const pureEffect = (value) => effect(value); /** * Flattens nested Effects (join operation) */ export const flatten = (nestedEffect) => { return nestedEffect.bind((innerEffect) => innerEffect); }; /** * Applies a function wrapped in an Effect to a value wrapped in an Effect */ export const apply = (effectF, effectA) => { return effectF.bind((f) => effectA.bind((a) => pureEffect(f(a)))); }; /** * Sequences an array of Effects into an Effect of array */ export const sequence = (effects) => { return effects.reduce((acc, curr) => acc.bind((arr) => curr.bind((val) => pureEffect([...arr, val]))), pureEffect([])); }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWZmZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvcmUvZWZmZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFBaUIsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBT2pEOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxDQUNwQixPQUFVLEVBQ2dDLEVBQUU7SUFDNUMsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRW5DLE1BQU0sY0FBYyxHQUE2QztRQUMvRCxLQUFLLEVBQUUsVUFBVSxDQUFDLEtBQUs7UUFDdkIsR0FBRyxFQUFFLFVBQVUsQ0FBQyxHQUFHO1FBQ25CLFNBQVMsRUFBRSxVQUFVLENBQUMsU0FBUztRQUMvQixJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUk7UUFFckIsSUFBSSxFQUFFLENBQUksQ0FBc0IsRUFBYSxFQUFFO1lBQzdDLG1DQUFtQztZQUNuQyxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7WUFFM0QscUNBQXFDO1lBQ3JDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtnQkFDaEMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUM5QixZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO2dCQUVyQyx3Q0FBd0M7Z0JBQ3hDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtvQkFDakMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDaEMsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztZQUVILE9BQU8sWUFBWSxDQUFDO1FBQ3RCLENBQUM7UUFFRCxLQUFLLEVBQUUsVUFBYSxDQUFzQjtZQUN4QyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsQ0FBQztLQUNGLENBQUM7SUFFRixPQUFPLGNBQWMsQ0FBQztBQUN4QixDQUFDLENBQUM7QUFFRjs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxDQUFJLEtBQVEsRUFBYSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBRXBFOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLENBQUksWUFBK0IsRUFBYSxFQUFFO0lBQ3ZFLE9BQU8sWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDekQsQ0FBQyxDQUFDO0FBRUY7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsQ0FDbkIsT0FBNEIsRUFDNUIsT0FBa0IsRUFDUCxFQUFFO0lBQ2IsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BFLENBQUMsQ0FBQztBQUVGOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLENBQUksT0FBb0IsRUFBZSxFQUFFO0lBQy9ELE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FDbkIsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FDWixHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDbEUsVUFBVSxDQUFDLEVBQVMsQ0FBQyxDQUN0QixDQUFDO0FBQ0osQ0FBQyxDQUFDIn0=