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.
153 lines • 10.5 kB
JavaScript
/**
* State Machine Algebra - State management with algebraic operations
* XState replacement with category-theoretic foundations
*/
import { effect } from '../core/effect';
/**
* Creates a State effect with state management operations
*/
export const state = (initialState, initialValue) => {
let currentState = initialState;
const baseEffect = effect(initialValue);
const stateInstance = {
value: baseEffect.value,
map: baseEffect.map,
subscribe: baseEffect.subscribe,
bind: baseEffect.bind,
chain: baseEffect.chain,
get: () => {
return state(currentState, currentState);
},
put: (newState) => {
const putState = state(newState, undefined);
currentState = newState;
return putState;
},
modify: (f) => {
const newState = f(currentState);
return stateInstance.put(newState);
},
_setState: (s) => {
currentState = s;
},
_set: (value) => {
currentState = value;
},
_setValue: baseEffect._set,
};
return stateInstance;
};
/**
* Creates a state machine with reducer-like transitions
*/
export const machine = (initialState, reducer) => {
let currentState = initialState;
const subscribers = new Set();
const notify = () => {
subscribers.forEach((fn) => fn(currentState));
};
return {
get state() {
return currentState;
},
send: (action) => {
const newState = reducer(currentState, action);
if (newState !== currentState) {
currentState = newState;
notify();
}
},
subscribe: (fn) => {
subscribers.add(fn);
return () => subscribers.delete(fn);
},
// Compatibility methods for factories
getState: () => currentState,
dispatch: (action) => {
const newState = reducer(currentState, action);
if (newState !== currentState) {
currentState = newState;
notify();
}
},
};
};
/**
* Creates a finite state machine with explicit transitions
*/
export const fsm = (initialState, transitions) => {
let currentState = initialState;
const subscribers = new Set();
const notify = () => {
subscribers.forEach((fn) => fn(currentState));
};
const getTransition = (action) => {
return transitions.find((t) => t.from === currentState && t.on === action && (!t.guard || t.guard()));
};
return {
get current() {
return currentState;
},
send: (action) => {
const transition = getTransition(action);
if (transition) {
currentState = transition.to;
notify();
}
},
can: (action) => {
return getTransition(action) !== undefined;
},
subscribe: (fn) => {
subscribers.add(fn);
return () => subscribers.delete(fn);
},
};
};
/**
* Natural transformation: State → Signal (lens view)
* Simplified implementation that maps over the value
*/
export const lens = (f) => (stateEffect) => {
// For now, just cast the result - this is a simplified implementation
return stateEffect.map(f);
};
/**
* Combines multiple state machines
*/
export const combine = (machine1, machine2) => {
const subscribers = new Set();
const notify = () => {
subscribers.forEach((fn) => fn({ m1: machine1.state, m2: machine2.state }));
};
machine1.subscribe(notify);
machine2.subscribe(notify);
return {
get state() {
return { m1: machine1.state, m2: machine2.state };
},
send: (action) => {
if (action.type === 'm1') {
machine1.send(action.action);
}
else {
machine2.send(action.action);
}
},
subscribe: (fn) => {
subscribers.add(fn);
return () => subscribers.delete(fn);
},
// Compatibility methods for factories
getState: () => ({ m1: machine1.state, m2: machine2.state }),
dispatch: (action) => {
if (action.type === 'm1') {
machine1.send(action.action);
}
else {
machine2.send(action.action);
}
},
};
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYWxnZWJyYXMvc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUFVLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBUWhEOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLENBQ25CLFlBQWUsRUFDZixZQUFlLEVBQ3lELEVBQUU7SUFDMUUsSUFBSSxZQUFZLEdBQUcsWUFBWSxDQUFDO0lBQ2hDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUV4QyxNQUFNLGFBQWEsR0FHZjtRQUNGLEtBQUssRUFBRSxVQUFVLENBQUMsS0FBSztRQUN2QixHQUFHLEVBQUUsVUFBVSxDQUFDLEdBQUc7UUFDbkIsU0FBUyxFQUFFLFVBQVUsQ0FBQyxTQUFTO1FBQy9CLElBQUksRUFBRSxVQUFVLENBQUMsSUFBSTtRQUNyQixLQUFLLEVBQUUsVUFBVSxDQUFDLEtBQUs7UUFFdkIsR0FBRyxFQUFFLEdBQWdCLEVBQUU7WUFDckIsT0FBTyxLQUFLLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQzNDLENBQUM7UUFFRCxHQUFHLEVBQUUsQ0FBQyxRQUFXLEVBQWtCLEVBQUU7WUFDbkMsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBRSxTQUFpQixDQUFDLENBQUM7WUFDcEQsWUFBWSxHQUFHLFFBQVEsQ0FBQztZQUN4QixPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDO1FBRUQsTUFBTSxFQUFFLENBQUMsQ0FBYyxFQUFrQixFQUFFO1lBQ3pDLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNqQyxPQUFPLGFBQWEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDckMsQ0FBQztRQUVELFNBQVMsRUFBRSxDQUFDLENBQUksRUFBRSxF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