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
JavaScript
/**
* 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=