UNPKG

signalforge

Version:

Fine-grained reactive state management with automatic dependency tracking - Ultra-optimized, zero dependencies

2 lines (1 loc) 4.02 kB
var y=[],g=new Map,G=0,b=!0;function O(){return`signal_${++G}_${Date.now()}`}function x(e,n,t){let r={id:O(),type:e,createdAt:Date.now(),label:t};if(g.set(r.id,r),b){for(let i of y)if(i.onSignalCreate)try{i.onSignalCreate(r,n)}catch(a){console.error(`Error in plugin "${i.name}" onSignalCreate:`,a)}}return r}function C(e,n,t,r="set"){if(!b)return;let i=g.get(e);if(!i)return;let a={signal:i,oldValue:n,newValue:t,timestamp:Date.now(),source:r};for(let p of y)if(p.onSignalUpdate)try{p.onSignalUpdate(a)}catch(q){console.error(`Error in plugin "${p.name}" onSignalUpdate:`,q)}}function $(e){if(!b)return;let n=g.get(e);if(n){for(let t of y)if(t.onSignalDestroy)try{t.onSignalDestroy(n)}catch(r){console.error(`Error in plugin "${t.name}" onSignalDestroy:`,r)}g.delete(e)}}var s=1,v=2,m=4,S=8,E=16,D=1e4,I=new Array(D),f=0;function z(e){f<D&&(e.value=void 0,e.subscribers=null,e.listeners=null,e.dependencies=null,e.computeFn=null,e.flags=0,I[f++]=e)}var d=new WeakMap,M=new Map;var U=1e4,V=new Array(U),l=0,u=0,T=!1;function W(e){if(e.flags&v)return;let n=(u+1)%U;n===l&&(console.error("[SignalForge] Batch queue overflow \u2192 forcing flush"),h()),e.flags|=v,V[u]=e,u=n,T||(T=!0,queueMicrotask(h))}function h(){for(T=!1;l!==u;){let e=V[l];l=(l+1)%U,e.flags&=~v,e.flags&s&&c(e)}}var B=new Array(100),A=0,o=null;function j(e){B[A++]=o,o=e}function Q(){o=B[--A]}var Z=function(){return this._node.value},Y=function(e){this._node.subscribers||(this._node.subscribers=new Set),this._node.subscribers.add(e)},J=function(e){this._node.subscribers&&this._node.subscribers.delete(e)};function _(e,n=null){let t=f>0?I[--f]:{value:void 0,subscribers:null,listeners:null,dependencies:null,computeFn:null,flags:0};return t.value=e,t.computeFn=n,t.flags=n?E|s:0,n&&c(t),t}function L(e,n){return o?(o!==e&&(R(e,o),ee(o,n)),e.flags&s&&e.computeFn&&c(e),e.value):(e.flags&s&&e.computeFn&&c(e),e.value)}function K(e,n,t){if(e.flags&E)throw new Error("Cannot set computed signal");if(typeof t=="function"&&(t=t(e.value)),Object.is(t,e.value))return;let r=e.value;e.value=t;let i=d.get(n);i&&C(i,r,t,"set"),F(e)}function R(e,n){e.subscribers||(e.subscribers=new Set),e.subscribers.add(n)}function X(e,n){e.subscribers&&e.subscribers.delete(n)}function ee(e,n){e.dependencies||(e.dependencies=new Set),e.dependencies.has(n)||(e.dependencies.add(n),R(n._node,e))}function k(e){if(e.dependencies){for(let n of e.dependencies)X(n._node,e);e.dependencies.clear()}}function w(e){if(!(e.flags&s)&&(e.flags|=s,W(e),e.subscribers))for(let n of e.subscribers)w(n)}function c(e){if(e.computeFn&&!(e.flags&m)){e.flags|=m,k(e),j(e);try{let n=e.computeFn();e.flags&=~s,e.flags&=~m,Object.is(n,e.value)||(e.value=n,F(e))}finally{Q()}}}function F(e){if(e.subscribers)for(let n of e.subscribers)w(n);if(e.flags&S&&e.listeners)for(let n of e.listeners)n(e.value)}function H(e,n){return e.listeners||(e.listeners=new Set),e.listeners.add(n),e.flags|=S,()=>{e.listeners.delete(n),e.listeners.size===0&&(e.flags&=~S)}}function P(e){k(e),e.subscribers&&e.subscribers.clear(),e.listeners&&e.listeners.clear(),z(e)}function ne(e){let n=_(e,null),t={get:()=>L(n,t),set:i=>K(n,t,i),subscribe:i=>H(n,i),destroy:()=>{let i=d.get(t);i&&($(i),M.delete(i),d.delete(t)),P(n)},_node:n,_peek:Z,_addSubscriber:Y,_removeSubscriber:J},r=x("signal",e);return d.set(t,r.id),M.set(r.id,t),t}function te(e){let n,t=o;o=null;try{n=e()}finally{o=t}let r=_(n,e),i={get:()=>L(r,i),set:()=>{throw new Error("Cannot set a computed signal")},subscribe:a=>H(r,a),destroy:()=>P(r),_node:r,_peek:()=>r.value,_addSubscriber:a=>{r.subscribers||(r.subscribers=new Set),r.subscribers.add(a)},_removeSubscriber:a=>{r.subscribers&&r.subscribers.delete(a)},_markDirty:()=>w(r),_recompute:()=>c(r)};return i}function re(e){let n=_(void 0,e);return()=>P(n)}function ie(e){let n=e();return N(),n}function N(){l!==u&&h()}function oe(e){let n=o;o=null;try{return e()}finally{o=n}}var ae=N;export{ie as batch,te as createComputed,re as createEffect,ne as createSignal,ae as flushSync,oe as untrack};