UNPKG

ptrs

Version:

Manage your state with pointers.

2 lines 4.16 kB
import{useEffect as A,useMemo as v,useRef as D,useState as W}from"react";var x=(e,r)=>{let t=new Map,n=new Map,i=!1,s=o=>{if(t.has(o))return t.get(o);let f=Object.getOwnPropertyDescriptors(o),a=new Set;p(f,Object.getOwnPropertyNames(f),a),p(f,Object.getOwnPropertySymbols(f),a);let y=Array.isArray(o);y&&delete f.length;let c=y?Object.defineProperties([],f):Object.create(Object.getPrototypeOf(o),f);return t.set(o,c),n.set(c,a),y&&(c.length=o.length),c},p=(o,f,a)=>{for(let y of f){let c=o[y];if(c.writable!==void 0){let u=!1,k=()=>{let m=c.value;return i&&!u&&typeof m=="object"?(u=!0,c.value=s(m)):m};o[y]={configurable:!0,enumerable:c.enumerable,get:k,set:m=>(u=!0,c.value=m)},a.add(k)}}},d=s(e);i=!0,r(d),i=!1;for(let o of t.values())F(o,n.get(o));return d},F=(e,r)=>{let t=Object.getOwnPropertyDescriptors(e);M(e,t,Object.getOwnPropertyNames(t),r),M(e,t,Object.getOwnPropertySymbols(t),r),Object.freeze(e)},M=(e,r,t,n)=>{for(let i of t){let s=r[i];s.get&&n.has(s.get)&&Object.defineProperty(e,i,{value:s.get()})}};var T=new Set,P=!1,V=e=>r=>{if(P)throw new Error("There should never run two ptrs components at the same time. If they do, it breaks general assumptions about the ptrs component.");P=!0;try{return e(r)}finally{P=!1,g(...T),T.clear()}};var l=new WeakMap,z=(e,...r)=>{let t=new Map;for(let n of r){let i=()=>{e(n)};t.set(n,i),w(n,i)}return(...n)=>{let i=n.length===0?t.keys():n;for(let s of i){let p=t.get(s);p&&(j(s,p),t.delete(s))}}},w=(e,r)=>{let t=l.get(e)?.filter(n=>{let i=n.deref();return i&&i!==r})??[];t.push(new WeakRef(r)),l.set(e,t)},j=(e,r)=>{let t=l.get(e);if(!t)return;let n=t.filter(i=>{let s=i.deref();return s&&s!==r});n.length===0?l.delete(e):l.set(e,n)},S=e=>{let r=l.get(e);if(r)for(let t of r)t.deref()?.(n=>n+1)};var h=Symbol("PointerProperties"),b=!0,N=!1,I=()=>{N=!0;let e=["at","concat","entries","every","filter","find","findIndex","findLast","findLastIndex","flat","flatMap","forEach","includes","indexOf","join","keys","lastIndexOf","map","reduce","reduceRight","slice","some","toLocaleString","toString","valueOf","values","with"];Object.defineProperty(Array.prototype,h,{configurable:!1,enumerable:!1,writable:!1,value:Object.freeze({...Object.fromEntries(Object.getOwnPropertyNames(Array.prototype).map(r=>[r,e.includes(r)?"readonly":"mutate"])),length:"get-set"})})},R=(e,r)=>(N||I(),U(e,r)),U=(e,r,t,n)=>{Object.freeze(e);let i={},s=O(t,n,e),p=new Proxy(()=>e,{apply(d,o,f){if(typeof e=="function"&&s!=="pointer"){if(s==="readonly")return e.apply(t(),f);let a,y=x(t(),c=>{a=e.apply(c,f)});return b=!1,t(y),b=!0,a}if(f.length===0)return P&&T.add(p),e;if(f.length===1){let a=f[0];if(a===e)return;e=Object.freeze(a),s=O(t,n,e),b&&r?.(e),S(p);let y=b;b=!1;for(let c in i)typeof e?.[c]!="function"&&i[c].deref()?.(e?.[c]);b=y}else throw new Error("Pointer can only be called with 0 or 1 arguments.")},get(d,o){let f=O(p,o,void 0);if(f!=="pointer"){let y;if(f==="mutate"?p(x(e,c=>{y=Reflect.get(c,o,c)})):y=e?.[o],typeof y!="function")return y}let a=i[o]?.deref();if(!a){let y=e?.[o];i[o]=new WeakRef(a=U(y,c=>{e===void 0&&(typeof o=="string"&&parseInt(o,10).toString()===o?e=[]:e={}),e=x(e,u=>{c===void 0?Reflect.deleteProperty(u,o):Reflect.set(u,o,c,u)}),s=O(t,n,e),Object.freeze(e),r?.(e),S(p)},p,o))}return a},set(d,o,f){return O(p,o,void 0)!=="pointer"?(p(x(e,a=>{Reflect.set(a,o,f,a)})),!0):!1}});return p},O=(e,r,t)=>{if(e&&r){let i=e()?.[h];if(i&&r in i)return i[r]}return typeof t=="function"?"mutate":"pointer"},E=(e,r)=>{let t=e;return t[h]=Object.freeze(r),t};var K=(e,r=!0)=>{let t=v(()=>R(e),[]);return r&&(P?T.add(t):g(t)),t},C=(e,r=!0)=>{let t=K(e,r);return A(()=>{t(e)},[t,e]),t},g=(...e)=>{if(P){for(let s of e)T.add(s);return}let[,r]=W(0),t=D(null),n=t.current??(t.current=new Map),i=n.version=(n.version??0)+1;for(let s of e){let p=n.get(s);p?p.version=i:(n.set(s,{version:i}),w(s,r))}for(let s of n.entries()){let[p,{version:d}]=s;d!==i&&(j(p,r),n.delete(p))}A(()=>()=>{let s=t.current;for(let p of s.keys())j(p,r);s.clear()},[])};export{R as createPointer,E as pointerSchema,V as ptrs,z as subscribe,C as useMemoPointer,g as usePointer,K as useStatePointer}; //# sourceMappingURL=index.js.map