🚀 Socket Launch Week Day 5:Introducing Repository Access Permissions and Custom Roles.Learn more
Sign In

@statx/core

Package Overview
Dependencies
Maintainers
1
Versions
60
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@statx/core - npm Package Compare versions

Comparing version
1.0.21
to
1.0.22
+1
-1
./build/index.js

@@ -1,2 +0,2 @@

var e=void 0;let r,s=!1;const t="Unnamed state",n=new Set,o=[],a=new Set,i=e=>e.history[e.historyCursor],c=(e,r)=>{const s=e.historyCursor;e.history[s]=r,e.historyCursor=(s+1)%e.history.length},d=e=>e&&n.has(e)?(console.error(`Name ${e} already used! Replaced to undefined`),t):e||t,u=e=>{if("reducer"in e)return e},h=e=>"function"==typeof e,l=e=>{try{const s=i(e);if(((e,r)=>!1===e.hasParentUpdates&&void 0!==r)(e,s))return r&&e.depends.forEach(e=>{r?.add(e)}),s;w(e.isComputing,`Loops dosen't allows. Name: ${e.name??"Unnamed state"}`),o.push(e),e.depends.forEach(r=>{r.childs.delete(e)}),e.depends.clear(),e.isComputing=!0;const t=e.reducer(s??e.initial);return e.isComputing=!1,e.hasParentUpdates=!1,o.pop(),c(e,t),t}catch(e){return void console.error(e.message)}},p=e=>{const s=u(e);try{const t=o.at(-1);return t&&!e.childs.has(t)&&(e.childs.add(t),t.depends.add(e)),s?l(s):i(e)}finally{r&&!s&&r.add(e)}},f=(e,r)=>{const s=h(r)?((e,r)=>r(i(e)))(e,r):r;s!==i(e)&&(c(e,s),b(e),m())},b=e=>{const r=[e];for(;r.length;){const e=r.pop();e.childs.forEach(e=>r.push(e)),e.hasParentUpdates=!0,e.subscribes.size&&a.add(e)}},m=()=>{!1===s&&(s=!0,queueMicrotask(()=>{a.forEach(e=>{try{e.subscribes.forEach(r=>r(p(e)))}catch(r){console.error("Error in subscriber function of:",e.name)}}),a.clear(),s=!1}))},y=(e,r)=>{if(e.subscribes.has(r))return()=>({});const s=u(e);return s&&(l(s),e.depends.forEach(r=>r.childs.add(e))),e.subscribes.add(r),()=>{e.subscribes.delete(r),0===e.subscribes.size&&e.depends.forEach(r=>r.childs.delete(e))}},w=(e,r)=>{if(e)throw new Error(r)};exports.action=(r,s)=>({run:function(){return r(...[].slice.call(arguments)),e},name:d(s.name),onAction:s.onAction}),exports.computed=(e,r)=>{const s={childs:new Set,depends:new Set,hasParentUpdates:!0,history:Array.from({length:5}),historyCursor:0,initial:r?.initial,isComputing:!1,name:d(r?.name),reducer:e,subscribes:new Set},t=function(){return p(s)};return Object.defineProperty(t,"name",{value:s.name}),t.subscribe=e=>y(s,e),t._internal=s,t},exports.flushStates=()=>{const e=r;return r=void 0,e},exports.startRecord=()=>{r=new Set},exports.state=function(e,r){w(h(e),"Function not allowed in state");const s={childs:new Set,depends:new Set,history:Array.from({length:5}),historyCursor:0,name:d(r?.name),subscribes:new Set,hasParentUpdates:void 0};f(s,e);const t=function(){return p(s)};return Object.defineProperty(t,"name",{value:s.name}),t.subscribe=e=>y(s,e),t.set=e=>f(s,e),t._internal=s,t},exports.subscribe=y;
var e=void 0;let r,s=!1;const t="Unnamed state",n=new Set,o=[],i=new Set,a=e=>e.history[e.historyCursor],c=(e,r)=>{e.historyCursor=(e.historyCursor+1)%e.history.length,e.history[e.historyCursor]=r},d=e=>e&&n.has(e)?(console.error(`Name ${e} already used! Replaced to undefined`),t):e||t,u=e=>{if("reducer"in e)return e},h=e=>"function"==typeof e,l=e=>{try{const s=a(e);if(((e,r)=>!1===e.hasParentUpdates&&void 0!==r)(e,s))return r&&e.depends.forEach(e=>{r?.add(e)}),s;w(e.isComputing,`Loops dosen't allows. Name: ${e.name??"Unnamed state"}`),o.push(e),e.depends.forEach(r=>{r.childs.delete(e)}),e.depends.clear(),e.isComputing=!0;const t=e.reducer(s??e.initial);return e.isComputing=!1,e.hasParentUpdates=!1,o.pop(),c(e,t),t}catch(e){return void console.error(e.message)}},p=e=>{const s=u(e);try{const t=o.at(-1);return t&&!e.childs.has(t)&&(e.childs.add(t),t.depends.add(e)),s?l(s):a(e)}finally{r&&!s&&r.add(e)}},f=(e,r)=>{const s=h(r)?((e,r)=>r(a(e)))(e,r):r;s!==a(e)&&(c(e,s),b(e),m())},b=e=>{const r=[e];for(;r.length;){const e=r.pop();e.childs.forEach(e=>r.push(e)),e.hasParentUpdates=!0,e.subscribes.size&&i.add(e)}},m=()=>{!1===s&&(s=!0,queueMicrotask(()=>{i.forEach(e=>{try{e.subscribes.forEach(r=>r(p(e)))}catch(r){console.error("Error in subscriber function of:",e.name)}}),i.clear(),s=!1}))},y=(e,r)=>{if(e.subscribes.has(r))return()=>({});const s=u(e);return s&&(l(s),e.depends.forEach(r=>r.childs.add(e))),e.subscribes.add(r),()=>{e.subscribes.delete(r),0===e.subscribes.size&&e.depends.forEach(r=>r.childs.delete(e))}},w=(e,r)=>{if(e)throw new Error(r)};exports.action=(r,s)=>({run:function(){return r(...[].slice.call(arguments)),e},name:d(s?.name),onAction:s?.onAction}),exports.computed=(e,r)=>{const s={childs:new Set,depends:new Set,hasParentUpdates:!0,history:Array.from({length:5}),historyCursor:-1,initial:r?.initial,isComputing:!1,name:d(r?.name),reducer:e,subscribes:new Set},t=function(){return p(s)};return Object.defineProperty(t,"name",{value:s.name}),t.subscribe=e=>y(s,e),t._internal=s,t},exports.flushStates=()=>{const e=r;return r=void 0,e},exports.startRecord=()=>{r=new Set},exports.state=function(e,r){w(h(e),"Function not allowed in state");const s={childs:new Set,depends:new Set,history:Array.from({length:5}),historyCursor:-1,name:d(r?.name),subscribes:new Set,hasParentUpdates:void 0};f(s,e);const t=function(){return p(s)};return Object.defineProperty(t,"name",{value:s.name}),t.subscribe=e=>y(s,e),t.set=e=>f(s,e),t._internal=s,t},exports.subscribe=y;
//# sourceMappingURL=index.js.map

@@ -1,2 +0,2 @@

var e=void 0;let r,s=!1;const t="Unnamed state",n=new Set,o=[],a=new Set,i=e=>e.history[e.historyCursor],c=(e,r)=>{const s=e.historyCursor;e.history[s]=r,e.historyCursor=(s+1)%e.history.length},d=e=>e&&n.has(e)?(console.error(`Name ${e} already used! Replaced to undefined`),t):e||t,u=e=>{if("reducer"in e)return e},h=e=>"function"==typeof e,l=e=>{try{const s=i(e);if(((e,r)=>!1===e.hasParentUpdates&&void 0!==r)(e,s))return r&&e.depends.forEach(e=>{r?.add(e)}),s;w(e.isComputing,`Loops dosen't allows. Name: ${e.name??"Unnamed state"}`),o.push(e),e.depends.forEach(r=>{r.childs.delete(e)}),e.depends.clear(),e.isComputing=!0;const t=e.reducer(s??e.initial);return e.isComputing=!1,e.hasParentUpdates=!1,o.pop(),c(e,t),t}catch(e){return void console.error(e.message)}},p=e=>{const s=u(e);try{const t=o.at(-1);return t&&!e.childs.has(t)&&(e.childs.add(t),t.depends.add(e)),s?l(s):i(e)}finally{r&&!s&&r.add(e)}},f=(e,r)=>{const s=h(r)?((e,r)=>r(i(e)))(e,r):r;s!==i(e)&&(c(e,s),b(e),m())},b=e=>{const r=[e];for(;r.length;){const e=r.pop();e.childs.forEach(e=>r.push(e)),e.hasParentUpdates=!0,e.subscribes.size&&a.add(e)}},m=()=>{!1===s&&(s=!0,queueMicrotask(()=>{a.forEach(e=>{try{e.subscribes.forEach(r=>r(p(e)))}catch(r){console.error("Error in subscriber function of:",e.name)}}),a.clear(),s=!1}))},y=(e,r)=>{if(e.subscribes.has(r))return()=>({});const s=u(e);return s&&(l(s),e.depends.forEach(r=>r.childs.add(e))),e.subscribes.add(r),()=>{e.subscribes.delete(r),0===e.subscribes.size&&e.depends.forEach(r=>r.childs.delete(e))}},w=(e,r)=>{if(e)throw new Error(r)};exports.action=(r,s)=>({run:function(){return r(...[].slice.call(arguments)),e},name:d(s.name),onAction:s.onAction}),exports.computed=(e,r)=>{const s={childs:new Set,depends:new Set,hasParentUpdates:!0,history:Array.from({length:5}),historyCursor:0,initial:r?.initial,isComputing:!1,name:d(r?.name),reducer:e,subscribes:new Set},t=function(){return p(s)};return Object.defineProperty(t,"name",{value:s.name}),t.subscribe=e=>y(s,e),t._internal=s,t},exports.flushStates=()=>{const e=r;return r=void 0,e},exports.startRecord=()=>{r=new Set},exports.state=function(e,r){w(h(e),"Function not allowed in state");const s={childs:new Set,depends:new Set,history:Array.from({length:5}),historyCursor:0,name:d(r?.name),subscribes:new Set,hasParentUpdates:void 0};f(s,e);const t=function(){return p(s)};return Object.defineProperty(t,"name",{value:s.name}),t.subscribe=e=>y(s,e),t.set=e=>f(s,e),t._internal=s,t},exports.subscribe=y;
var e=void 0;let r,s=!1;const t="Unnamed state",n=new Set,o=[],i=new Set,a=e=>e.history[e.historyCursor],c=(e,r)=>{e.historyCursor=(e.historyCursor+1)%e.history.length,e.history[e.historyCursor]=r},d=e=>e&&n.has(e)?(console.error(`Name ${e} already used! Replaced to undefined`),t):e||t,u=e=>{if("reducer"in e)return e},h=e=>"function"==typeof e,l=e=>{try{const s=a(e);if(((e,r)=>!1===e.hasParentUpdates&&void 0!==r)(e,s))return r&&e.depends.forEach(e=>{r?.add(e)}),s;w(e.isComputing,`Loops dosen't allows. Name: ${e.name??"Unnamed state"}`),o.push(e),e.depends.forEach(r=>{r.childs.delete(e)}),e.depends.clear(),e.isComputing=!0;const t=e.reducer(s??e.initial);return e.isComputing=!1,e.hasParentUpdates=!1,o.pop(),c(e,t),t}catch(e){return void console.error(e.message)}},p=e=>{const s=u(e);try{const t=o.at(-1);return t&&!e.childs.has(t)&&(e.childs.add(t),t.depends.add(e)),s?l(s):a(e)}finally{r&&!s&&r.add(e)}},f=(e,r)=>{const s=h(r)?((e,r)=>r(a(e)))(e,r):r;s!==a(e)&&(c(e,s),b(e),m())},b=e=>{const r=[e];for(;r.length;){const e=r.pop();e.childs.forEach(e=>r.push(e)),e.hasParentUpdates=!0,e.subscribes.size&&i.add(e)}},m=()=>{!1===s&&(s=!0,queueMicrotask(()=>{i.forEach(e=>{try{e.subscribes.forEach(r=>r(p(e)))}catch(r){console.error("Error in subscriber function of:",e.name)}}),i.clear(),s=!1}))},y=(e,r)=>{if(e.subscribes.has(r))return()=>({});const s=u(e);return s&&(l(s),e.depends.forEach(r=>r.childs.add(e))),e.subscribes.add(r),()=>{e.subscribes.delete(r),0===e.subscribes.size&&e.depends.forEach(r=>r.childs.delete(e))}},w=(e,r)=>{if(e)throw new Error(r)};exports.action=(r,s)=>({run:function(){return r(...[].slice.call(arguments)),e},name:d(s?.name),onAction:s?.onAction}),exports.computed=(e,r)=>{const s={childs:new Set,depends:new Set,hasParentUpdates:!0,history:Array.from({length:5}),historyCursor:-1,initial:r?.initial,isComputing:!1,name:d(r?.name),reducer:e,subscribes:new Set},t=function(){return p(s)};return Object.defineProperty(t,"name",{value:s.name}),t.subscribe=e=>y(s,e),t._internal=s,t},exports.flushStates=()=>{const e=r;return r=void 0,e},exports.startRecord=()=>{r=new Set},exports.state=function(e,r){w(h(e),"Function not allowed in state");const s={childs:new Set,depends:new Set,history:Array.from({length:5}),historyCursor:-1,name:d(r?.name),subscribes:new Set,hasParentUpdates:void 0};f(s,e);const t=function(){return p(s)};return Object.defineProperty(t,"name",{value:s.name}),t.subscribe=e=>y(s,e),t.set=e=>f(s,e),t._internal=s,t},exports.subscribe=y;
//# sourceMappingURL=index.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"index.js","sources":["../src/core.ts"],"sourcesContent":["import {\r\n ComputedInternal,\r\n Listner,\r\n StateType,\r\n Settings,\r\n StateVariants,\r\n Action,\r\n Options,\r\n ComputedInternalOptions,\r\n Nullable,\r\n StatlessFunc,\r\n GetStatlessFunc,\r\n HistoryInternal,\r\n State,\r\n Computed,\r\n Func,\r\n UnSubscribe,\r\n CommonInternal,\r\n StateInternal,\r\n SetterFunc,\r\n ActionOptions,\r\n} from './types.js'\r\n\r\nlet isNotifying = false\r\nlet isActionNow = false\r\nlet recording: Set<StateInternal> | undefined\r\n\r\nconst defaultName = 'Unnamed state'\r\nconst names = new Set()\r\nconst requesters: ComputedInternal[] = []\r\nconst states2notify = new Set<StateVariants>()\r\nconst settings: Settings = {\r\n historyLength: 5,\r\n}\r\n\r\nexport const getHistoryValue = (state: StateVariants): unknown => {\r\n return state.history[state.historyCursor]\r\n}\r\nconst pushHistory = <T extends HistoryInternal>(state: T, value: unknown) => {\r\n const cursorHistory = state.historyCursor\r\n state.history[cursorHistory] = value\r\n state.historyCursor = (cursorHistory + 1) % state.history.length\r\n}\r\n\r\nconst getName = (name?: string): string => {\r\n if (name && names.has(name)) {\r\n console.error(`Name ${name} already used! Replaced to undefined`)\r\n return defaultName\r\n }\r\n if (name) {\r\n return name\r\n }\r\n return defaultName\r\n}\r\n\r\nexport const setSetting = (data: Partial<Settings>) => {\r\n Object.assign(settings, data)\r\n}\r\n\r\nconst getComputed = (state: CommonInternal | ComputedInternal) => {\r\n if ('reducer' in state) {\r\n return state\r\n }\r\n}\r\n\r\nconst isFunction = (v: unknown): v is Func => {\r\n return typeof v === 'function'\r\n}\r\n\r\nconst isDontNeedRecalc = (state: CommonInternal, prevState: unknown): boolean => {\r\n return state.hasParentUpdates === false && prevState !== undefined\r\n}\r\n\r\nconst getComputedValue = (state: ComputedInternal): unknown => {\r\n try {\r\n const prevState = getHistoryValue(state)\r\n\r\n if (isDontNeedRecalc(state, prevState)) {\r\n if (recording) {\r\n state.depends.forEach((item) => {\r\n recording?.add(item)\r\n })\r\n }\r\n return prevState\r\n }\r\n\r\n assert(state.isComputing, `Loops dosen't allows. Name: ${state.name ?? 'Unnamed state'}`)\r\n\r\n requesters.push(state)\r\n state.depends.forEach((item) => {\r\n item.childs.delete(state)\r\n })\r\n state.depends.clear()\r\n state.isComputing = true\r\n const value = state.reducer(prevState ?? state.initial)\r\n state.isComputing = false\r\n state.hasParentUpdates = false\r\n\r\n requesters.pop()\r\n pushHistory(state, value)\r\n\r\n return value\r\n } catch (e) {\r\n console.error((e as Error).message)\r\n return undefined\r\n }\r\n}\r\n\r\nconst getValue = (state: CommonInternal) => {\r\n const reducer = getComputed(state)\r\n try {\r\n const lastRequester = requesters.at(-1)\r\n if (lastRequester && !state.childs.has(lastRequester)) {\r\n state.childs.add(lastRequester)\r\n lastRequester.depends.add(state)\r\n }\r\n if (reducer) {\r\n return getComputedValue(reducer)\r\n }\r\n return getHistoryValue(state)\r\n } finally {\r\n if (recording && !reducer) {\r\n recording.add(state)\r\n }\r\n }\r\n}\r\n\r\nconst getValueOfSetterFunction = (state: CommonInternal, value: SetterFunc): unknown => {\r\n const prevValue = getHistoryValue(state)\r\n return value(prevValue)\r\n}\r\n\r\nconst setValue = (state: CommonInternal, value: unknown): void => {\r\n const newValue = isFunction(value) ? getValueOfSetterFunction(state, value) : value\r\n\r\n if (newValue === getHistoryValue(state)) {\r\n return\r\n }\r\n pushHistory(state, newValue)\r\n invalidateSubtree(state)\r\n notifySubscribers()\r\n}\r\n\r\n/**\r\n * Mark all subtree is non actual.\r\n * Collect all nodes to notify subscribers im microtask queue.\r\n */\r\nconst invalidateSubtree = (state: CommonInternal) => {\r\n const stack: CommonInternal[] = [state]\r\n\r\n while (stack.length) {\r\n const st = stack.pop()\r\n st.childs.forEach((it) => stack.push(it))\r\n st.hasParentUpdates = true\r\n if (st.subscribes.size) {\r\n states2notify.add(st)\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Notify all collected subscribers once in microtask queue\r\n */\r\nconst notifySubscribers = () => {\r\n if (isNotifying === false) {\r\n isNotifying = true\r\n queueMicrotask(() => {\r\n // Нужно обновить дерево\r\n states2notify.forEach((state) => {\r\n try {\r\n state.subscribes.forEach((listner) => {\r\n return listner(getValue(state))\r\n })\r\n } catch (e) {\r\n console.error('Error in subscriber function of:', state.name)\r\n }\r\n })\r\n states2notify.clear()\r\n isNotifying = false\r\n })\r\n }\r\n}\r\n\r\n/**\r\n * Start collecting all non computed states.\r\n *\r\n * Helper for render adapters.\r\n */\r\nexport const startRecord = () => {\r\n recording = new Set()\r\n}\r\n\r\n/**\r\n * Flush all collected non computed states.\r\n */\r\nexport const flushStates = (): Set<StateInternal> => {\r\n const data = recording\r\n recording = undefined\r\n return data\r\n}\r\n\r\nexport const subscribe = (state: CommonInternal | CommonInternal, listner: Listner): UnSubscribe => {\r\n /**\r\n * Если значение стейта ниразу не расчитывалось, его нужно обновить\r\n * Если подписываемся на вычисляемый стэйт, то нужно узнать всех родителей\r\n * Родители могут меняться, поэтому после каждого вычисления нужно обновлять зависимости дерева\r\n *\r\n * При отписке нужно оповестить всех на кого были опдписанты о том что мы отписались\r\n *\r\n */\r\n\r\n if (state.subscribes.has(listner)) {\r\n return () => ({})\r\n }\r\n\r\n const computedState = getComputed(state)\r\n // Нужно актуализировать в родилеях зависимость\r\n if (computedState) {\r\n getComputedValue(computedState)\r\n state.depends.forEach((parent) => parent.childs.add(state))\r\n }\r\n\r\n state.subscribes.add(listner)\r\n\r\n return () => {\r\n state.subscribes.delete(listner)\r\n if (state.subscribes.size === 0) {\r\n state.depends.forEach((parent) => parent.childs.delete(state))\r\n }\r\n }\r\n}\r\n\r\nconst assert = (condtion: boolean, msg: string) => {\r\n if (condtion) {\r\n throw new Error(msg)\r\n }\r\n}\r\n\r\n/**\r\n *\r\n * @param value - Reducer or value\r\n * @param name - name of state. For loggin or easy debug\r\n * @returns State<T>\r\n */\r\nexport function state<T extends StateType = StateType>(value: T, options?: Options): State<T> {\r\n assert(isFunction(value), 'Function not allowed in state')\r\n\r\n const data: CommonInternal = {\r\n childs: new Set(),\r\n depends: new Set(),\r\n history: Array.from({length: settings.historyLength}),\r\n historyCursor: 0,\r\n name: getName(options?.name),\r\n subscribes: new Set(),\r\n hasParentUpdates: undefined,\r\n }\r\n\r\n setValue(data, value)\r\n\r\n const publicApi = function () {\r\n return getValue(data)\r\n }\r\n\r\n Object.defineProperty(publicApi, 'name', {value: data.name})\r\n publicApi.subscribe = (listner: Listner) => subscribe(data, listner)\r\n publicApi.set = (value: T) => setValue(data, value)\r\n publicApi._internal = data\r\n\r\n return publicApi as State<T>\r\n}\r\n\r\nexport const computed = <\r\n T extends StateType = -1,\r\n S extends StatlessFunc<T> = StatlessFunc<T>,\r\n O extends Nullable<ComputedInternalOptions> = Nullable<ComputedInternalOptions>,\r\n>(\r\n value: GetStatlessFunc<T, S, O>,\r\n options?: O,\r\n): Computed<T> => {\r\n const data: ComputedInternal = {\r\n childs: new Set(),\r\n depends: new Set(),\r\n hasParentUpdates: true,\r\n history: Array.from({length: settings.historyLength}),\r\n historyCursor: 0,\r\n initial: options?.initial as ReturnType<typeof value> | undefined,\r\n isComputing: false,\r\n name: getName(options?.name),\r\n reducer: value,\r\n subscribes: new Set(),\r\n }\r\n\r\n const publicApi = function () {\r\n return getValue(data)\r\n }\r\n\r\n Object.defineProperty(publicApi, 'name', {value: data.name})\r\n publicApi.subscribe = (listner: Listner<T>) => subscribe(data, listner as Listner)\r\n publicApi._internal = data\r\n\r\n return publicApi as Computed<T>\r\n}\r\n\r\n/**\r\n * ## Action state\r\n *\r\n * @param value - Action function\r\n * @param name\r\n */\r\nexport const action = <T extends unknown[]>(\r\n value: (...args: T) => void,\r\n options?: ActionOptions,\r\n): Action<T> => {\r\n return {\r\n run: (...args: T) => {\r\n isActionNow = true\r\n value(...args)\r\n isActionNow = false\r\n return this\r\n },\r\n name: getName(options.name),\r\n onAction: options.onAction,\r\n }\r\n}\r\n"],"names":["_this","this","recording","isNotifying","names","Set","requesters","states2notify","getHistoryValue","state","history","historyCursor","pushHistory","value","cursorHistory","length","getName","name","has","console","error","defaultName","isFunction","v","prevState","hasParentUpdates","undefined","isDontNeedRecalc","depends","forEach","item","add","assert","isComputing","push","childs","delete","clear","reducer","initial","pop","e","message","getValue","getComputed","lastRequester","at","getComputedValue","setValue","newValue","getValueOfSetterFunction","invalidateSubtree","notifySubscribers","stack","st","it","subscribes","size","queueMicrotask","listner","subscribe","computedState","parent","condtion","msg","Error","options","run","slice","call","arguments","onAction","data","Array","from","publicApi","Object","defineProperty","_internal","set"],"mappings":"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"}
{"version":3,"file":"index.js","sources":["../src/core.ts"],"sourcesContent":["import {\r\n ComputedInternal,\r\n Listner,\r\n StateType,\r\n Settings,\r\n StateVariants,\r\n Action,\r\n Options,\r\n ComputedInternalOptions,\r\n Nullable,\r\n StatlessFunc,\r\n GetStatlessFunc,\r\n HistoryInternal,\r\n State,\r\n Computed,\r\n Func,\r\n UnSubscribe,\r\n CommonInternal,\r\n StateInternal,\r\n SetterFunc,\r\n ActionOptions,\r\n} from './types.js'\r\n\r\nlet isNotifying = false\r\nlet isActionNow = false\r\nlet recording: Set<StateInternal> | undefined\r\n\r\nconst defaultName = 'Unnamed state'\r\nconst names = new Set()\r\nconst requesters: ComputedInternal[] = []\r\nconst states2notify = new Set<StateVariants>()\r\nconst settings: Settings = {\r\n historyLength: 5,\r\n}\r\n\r\nexport const getHistoryValue = (state: StateVariants): unknown => {\r\n return state.history[state.historyCursor]\r\n}\r\nconst pushHistory = <T extends HistoryInternal>(state: T, value: unknown) => {\r\n const cursorHistory = state.historyCursor\r\n state.historyCursor = (cursorHistory + 1) % state.history.length\r\n state.history[state.historyCursor] = value\r\n}\r\n\r\nconst getName = (name?: string): string => {\r\n if (name && names.has(name)) {\r\n console.error(`Name ${name} already used! Replaced to undefined`)\r\n return defaultName\r\n }\r\n if (name) {\r\n return name\r\n }\r\n return defaultName\r\n}\r\n\r\nexport const setSetting = (data: Partial<Settings>) => {\r\n Object.assign(settings, data)\r\n}\r\n\r\nconst getComputed = (state: CommonInternal | ComputedInternal) => {\r\n if ('reducer' in state) {\r\n return state\r\n }\r\n}\r\n\r\nconst isFunction = (v: unknown): v is Func => {\r\n return typeof v === 'function'\r\n}\r\n\r\nconst isDontNeedRecalc = (state: CommonInternal, prevState: unknown): boolean => {\r\n return state.hasParentUpdates === false && prevState !== undefined\r\n}\r\n\r\nconst getComputedValue = (state: ComputedInternal): unknown => {\r\n try {\r\n const prevState = getHistoryValue(state)\r\n\r\n if (isDontNeedRecalc(state, prevState)) {\r\n if (recording) {\r\n state.depends.forEach((item) => {\r\n recording?.add(item)\r\n })\r\n }\r\n return prevState\r\n }\r\n\r\n assert(state.isComputing, `Loops dosen't allows. Name: ${state.name ?? 'Unnamed state'}`)\r\n\r\n requesters.push(state)\r\n state.depends.forEach((item) => {\r\n item.childs.delete(state)\r\n })\r\n state.depends.clear()\r\n state.isComputing = true\r\n const value = state.reducer(prevState ?? state.initial)\r\n state.isComputing = false\r\n state.hasParentUpdates = false\r\n\r\n requesters.pop()\r\n pushHistory(state, value)\r\n\r\n return value\r\n } catch (e) {\r\n console.error((e as Error).message)\r\n return undefined\r\n }\r\n}\r\n\r\nconst getValue = (state: CommonInternal) => {\r\n const reducer = getComputed(state)\r\n try {\r\n const lastRequester = requesters.at(-1)\r\n if (lastRequester && !state.childs.has(lastRequester)) {\r\n state.childs.add(lastRequester)\r\n lastRequester.depends.add(state)\r\n }\r\n if (reducer) {\r\n return getComputedValue(reducer)\r\n }\r\n return getHistoryValue(state)\r\n } finally {\r\n if (recording && !reducer) {\r\n recording.add(state)\r\n }\r\n }\r\n}\r\n\r\nconst getValueOfSetterFunction = (state: CommonInternal, value: SetterFunc): unknown => {\r\n const prevValue = getHistoryValue(state)\r\n return value(prevValue)\r\n}\r\n\r\nconst setValue = (state: CommonInternal, value: unknown): void => {\r\n const newValue = isFunction(value) ? getValueOfSetterFunction(state, value) : value\r\n\r\n if (newValue === getHistoryValue(state)) {\r\n return\r\n }\r\n pushHistory(state, newValue)\r\n invalidateSubtree(state)\r\n notifySubscribers()\r\n}\r\n\r\n/**\r\n * Mark all subtree is non actual.\r\n * Collect all nodes to notify subscribers im microtask queue.\r\n */\r\nconst invalidateSubtree = (state: CommonInternal) => {\r\n const stack: CommonInternal[] = [state]\r\n\r\n while (stack.length) {\r\n const st = stack.pop()\r\n st.childs.forEach((it) => stack.push(it))\r\n st.hasParentUpdates = true\r\n if (st.subscribes.size) {\r\n states2notify.add(st)\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Notify all collected subscribers once in microtask queue\r\n */\r\nconst notifySubscribers = () => {\r\n if (isNotifying === false) {\r\n isNotifying = true\r\n queueMicrotask(() => {\r\n // Нужно обновить дерево\r\n states2notify.forEach((state) => {\r\n try {\r\n state.subscribes.forEach((listner) => {\r\n return listner(getValue(state))\r\n })\r\n } catch (e) {\r\n console.error('Error in subscriber function of:', state.name)\r\n }\r\n })\r\n states2notify.clear()\r\n isNotifying = false\r\n })\r\n }\r\n}\r\n\r\n/**\r\n * Start collecting all non computed states.\r\n *\r\n * Helper for render adapters.\r\n */\r\nexport const startRecord = () => {\r\n recording = new Set()\r\n}\r\n\r\n/**\r\n * Flush all collected non computed states.\r\n */\r\nexport const flushStates = (): Set<StateInternal> => {\r\n const data = recording\r\n recording = undefined\r\n return data\r\n}\r\n\r\nexport const subscribe = (state: CommonInternal | CommonInternal, listner: Listner): UnSubscribe => {\r\n /**\r\n * Если значение стейта ниразу не расчитывалось, его нужно обновить\r\n * Если подписываемся на вычисляемый стэйт, то нужно узнать всех родителей\r\n * Родители могут меняться, поэтому после каждого вычисления нужно обновлять зависимости дерева\r\n *\r\n * При отписке нужно оповестить всех на кого были опдписанты о том что мы отписались\r\n *\r\n */\r\n\r\n if (state.subscribes.has(listner)) {\r\n return () => ({})\r\n }\r\n\r\n const computedState = getComputed(state)\r\n // Нужно актуализировать в родилеях зависимость\r\n if (computedState) {\r\n getComputedValue(computedState)\r\n state.depends.forEach((parent) => parent.childs.add(state))\r\n }\r\n\r\n state.subscribes.add(listner)\r\n\r\n return () => {\r\n state.subscribes.delete(listner)\r\n if (state.subscribes.size === 0) {\r\n state.depends.forEach((parent) => parent.childs.delete(state))\r\n }\r\n }\r\n}\r\n\r\nconst assert = (condtion: boolean, msg: string) => {\r\n if (condtion) {\r\n throw new Error(msg)\r\n }\r\n}\r\n\r\n/**\r\n *\r\n * @param value - Reducer or value\r\n * @param name - name of state. For loggin or easy debug\r\n * @returns State<T>\r\n */\r\nexport function state<T extends StateType = StateType>(value: T, options?: Options): State<T> {\r\n assert(isFunction(value), 'Function not allowed in state')\r\n\r\n const data: CommonInternal = {\r\n childs: new Set(),\r\n depends: new Set(),\r\n history: Array.from({length: settings.historyLength}),\r\n historyCursor: -1,\r\n name: getName(options?.name),\r\n subscribes: new Set(),\r\n hasParentUpdates: undefined,\r\n }\r\n\r\n setValue(data, value)\r\n\r\n const publicApi = function () {\r\n return getValue(data)\r\n }\r\n\r\n Object.defineProperty(publicApi, 'name', {value: data.name})\r\n publicApi.subscribe = (listner: Listner) => subscribe(data, listner)\r\n publicApi.set = (value: T) => setValue(data, value)\r\n publicApi._internal = data\r\n\r\n return publicApi as State<T>\r\n}\r\n\r\nexport const computed = <\r\n T extends StateType = -1,\r\n S extends StatlessFunc<T> = StatlessFunc<T>,\r\n O extends Nullable<ComputedInternalOptions> = Nullable<ComputedInternalOptions>,\r\n>(\r\n value: GetStatlessFunc<T, S, O>,\r\n options?: O,\r\n): Computed<T> => {\r\n const data: ComputedInternal = {\r\n childs: new Set(),\r\n depends: new Set(),\r\n hasParentUpdates: true,\r\n history: Array.from({length: settings.historyLength}),\r\n historyCursor: -1,\r\n initial: options?.initial as ReturnType<typeof value> | undefined,\r\n isComputing: false,\r\n name: getName(options?.name),\r\n reducer: value,\r\n subscribes: new Set(),\r\n }\r\n\r\n const publicApi = function () {\r\n return getValue(data)\r\n }\r\n\r\n Object.defineProperty(publicApi, 'name', {value: data.name})\r\n publicApi.subscribe = (listner: Listner<T>) => subscribe(data, listner as Listner)\r\n publicApi._internal = data\r\n\r\n return publicApi as Computed<T>\r\n}\r\n\r\n/**\r\n * ## Action state\r\n *\r\n * @param value - Action function\r\n * @param name\r\n */\r\nexport const action = <T extends unknown[]>(\r\n value: (...args: T) => void,\r\n options?: ActionOptions,\r\n): Action<T> => {\r\n return {\r\n run: (...args: T) => {\r\n isActionNow = true\r\n value(...args)\r\n isActionNow = false\r\n return this\r\n },\r\n name: getName(options?.name),\r\n onAction: options?.onAction,\r\n }\r\n}\r\n"],"names":["_this","this","recording","isNotifying","names","Set","requesters","states2notify","getHistoryValue","state","history","historyCursor","pushHistory","value","length","getName","name","has","console","error","defaultName","getComputed","isFunction","v","getComputedValue","prevState","hasParentUpdates","undefined","isDontNeedRecalc","depends","forEach","item","add","assert","isComputing","push","childs","delete","clear","reducer","initial","pop","e","message","getValue","lastRequester","at","setValue","newValue","getValueOfSetterFunction","invalidateSubtree","notifySubscribers","stack","st","it","subscribes","size","queueMicrotask","listner","subscribe","computedState","parent","condtion","msg","Error","options","run","slice","call","arguments","onAction","data","Array","from","publicApi","Object","defineProperty","_internal","set"],"mappings":"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"}

@@ -1,2 +0,2 @@

let e,n=!1;const r="Unnamed state",s=new Set,t=[],o=new Set,i=e=>e.history[e.historyCursor],a=(e,n)=>{const r=e.historyCursor;e.history[r]=n,e.historyCursor=(r+1)%e.history.length},d=e=>e&&s.has(e)?(console.error(`Name ${e} already used! Replaced to undefined`),r):e||r,c=e=>{if("reducer"in e)return e},u=e=>"function"==typeof e,l=n=>{try{var r;const s=i(n);if(((e,n)=>!1===e.hasParentUpdates&&void 0!==n)(n,s))return e&&n.depends.forEach(n=>{var r;null==(r=e)||r.add(n)}),s;v(n.isComputing,`Loops dosen't allows. Name: ${null!=(r=n.name)?r:"Unnamed state"}`),t.push(n),n.depends.forEach(e=>{e.childs.delete(n)}),n.depends.clear(),n.isComputing=!0;const o=n.reducer(null!=s?s:n.initial);return n.isComputing=!1,n.hasParentUpdates=!1,t.pop(),a(n,o),o}catch(e){return void console.error(e.message)}},h=n=>{const r=c(n);try{const s=t.at(-1);return s&&!n.childs.has(s)&&(n.childs.add(s),s.depends.add(n)),r?l(r):i(n)}finally{e&&!r&&e.add(n)}},p=(e,n)=>{const r=u(n)?((e,n)=>n(i(e)))(e,n):n;r!==i(e)&&(a(e,r),f(e),b())},f=e=>{const n=[e];for(;n.length;){const e=n.pop();e.childs.forEach(e=>n.push(e)),e.hasParentUpdates=!0,e.subscribes.size&&o.add(e)}},b=()=>{!1===n&&(n=!0,queueMicrotask(()=>{o.forEach(e=>{try{e.subscribes.forEach(n=>n(h(e)))}catch(n){console.error("Error in subscriber function of:",e.name)}}),o.clear(),n=!1}))},m=()=>{e=new Set},y=()=>{const n=e;return e=void 0,n},w=(e,n)=>{if(e.subscribes.has(n))return()=>({});const r=c(e);return r&&(l(r),e.depends.forEach(n=>n.childs.add(e))),e.subscribes.add(n),()=>{e.subscribes.delete(n),0===e.subscribes.size&&e.depends.forEach(n=>n.childs.delete(e))}},v=(e,n)=>{if(e)throw new Error(n)};function g(e,n){v(u(e),"Function not allowed in state");const r={childs:new Set,depends:new Set,history:Array.from({length:5}),historyCursor:0,name:d(null==n?void 0:n.name),subscribes:new Set,hasParentUpdates:void 0};p(r,e);const s=function(){return h(r)};return Object.defineProperty(s,"name",{value:r.name}),s.subscribe=e=>w(r,e),s.set=e=>p(r,e),s._internal=r,s}const C=(e,n)=>{const r={childs:new Set,depends:new Set,hasParentUpdates:!0,history:Array.from({length:5}),historyCursor:0,initial:null==n?void 0:n.initial,isComputing:!1,name:d(null==n?void 0:n.name),reducer:e,subscribes:new Set},s=function(){return h(r)};return Object.defineProperty(s,"name",{value:r.name}),s.subscribe=e=>w(r,e),s._internal=r,s},E=(e,n)=>({run:(...n)=>{e(...n)},name:d(n.name),onAction:n.onAction});export{E as action,C as computed,y as flushStates,m as startRecord,g as state,w as subscribe};
let e,n=!1;const r="Unnamed state",s=new Set,t=[],o=new Set,i=e=>e.history[e.historyCursor],a=(e,n)=>{e.historyCursor=(e.historyCursor+1)%e.history.length,e.history[e.historyCursor]=n},d=e=>e&&s.has(e)?(console.error(`Name ${e} already used! Replaced to undefined`),r):e||r,c=e=>{if("reducer"in e)return e},u=e=>"function"==typeof e,l=n=>{try{var r;const s=i(n);if(((e,n)=>!1===e.hasParentUpdates&&void 0!==n)(n,s))return e&&n.depends.forEach(n=>{var r;null==(r=e)||r.add(n)}),s;w(n.isComputing,`Loops dosen't allows. Name: ${null!=(r=n.name)?r:"Unnamed state"}`),t.push(n),n.depends.forEach(e=>{e.childs.delete(n)}),n.depends.clear(),n.isComputing=!0;const o=n.reducer(null!=s?s:n.initial);return n.isComputing=!1,n.hasParentUpdates=!1,t.pop(),a(n,o),o}catch(e){return void console.error(e.message)}},h=n=>{const r=c(n);try{const s=t.at(-1);return s&&!n.childs.has(s)&&(n.childs.add(s),s.depends.add(n)),r?l(r):i(n)}finally{e&&!r&&e.add(n)}},p=(e,n)=>{const r=u(n)?((e,n)=>n(i(e)))(e,n):n;r!==i(e)&&(a(e,r),f(e),b())},f=e=>{const n=[e];for(;n.length;){const e=n.pop();e.childs.forEach(e=>n.push(e)),e.hasParentUpdates=!0,e.subscribes.size&&o.add(e)}},b=()=>{!1===n&&(n=!0,queueMicrotask(()=>{o.forEach(e=>{try{e.subscribes.forEach(n=>n(h(e)))}catch(n){console.error("Error in subscriber function of:",e.name)}}),o.clear(),n=!1}))},m=()=>{e=new Set},y=()=>{const n=e;return e=void 0,n},v=(e,n)=>{if(e.subscribes.has(n))return()=>({});const r=c(e);return r&&(l(r),e.depends.forEach(n=>n.childs.add(e))),e.subscribes.add(n),()=>{e.subscribes.delete(n),0===e.subscribes.size&&e.depends.forEach(n=>n.childs.delete(e))}},w=(e,n)=>{if(e)throw new Error(n)};function C(e,n){w(u(e),"Function not allowed in state");const r={childs:new Set,depends:new Set,history:Array.from({length:5}),historyCursor:-1,name:d(null==n?void 0:n.name),subscribes:new Set,hasParentUpdates:void 0};p(r,e);const s=function(){return h(r)};return Object.defineProperty(s,"name",{value:r.name}),s.subscribe=e=>v(r,e),s.set=e=>p(r,e),s._internal=r,s}const g=(e,n)=>{const r={childs:new Set,depends:new Set,hasParentUpdates:!0,history:Array.from({length:5}),historyCursor:-1,initial:null==n?void 0:n.initial,isComputing:!1,name:d(null==n?void 0:n.name),reducer:e,subscribes:new Set},s=function(){return h(r)};return Object.defineProperty(s,"name",{value:r.name}),s.subscribe=e=>v(r,e),s._internal=r,s},E=(e,n)=>({run:(...n)=>{e(...n)},name:d(null==n?void 0:n.name),onAction:null==n?void 0:n.onAction});export{E as action,g as computed,y as flushStates,m as startRecord,C as state,v as subscribe};
//# sourceMappingURL=index.modern.mjs.map

@@ -1,1 +0,1 @@

{"version":3,"file":"index.modern.mjs","sources":["../src/core.ts"],"sourcesContent":["import {\r\n ComputedInternal,\r\n Listner,\r\n StateType,\r\n Settings,\r\n StateVariants,\r\n Action,\r\n Options,\r\n ComputedInternalOptions,\r\n Nullable,\r\n StatlessFunc,\r\n GetStatlessFunc,\r\n HistoryInternal,\r\n State,\r\n Computed,\r\n Func,\r\n UnSubscribe,\r\n CommonInternal,\r\n StateInternal,\r\n SetterFunc,\r\n ActionOptions,\r\n} from './types.js'\r\n\r\nlet isNotifying = false\r\nlet isActionNow = false\r\nlet recording: Set<StateInternal> | undefined\r\n\r\nconst defaultName = 'Unnamed state'\r\nconst names = new Set()\r\nconst requesters: ComputedInternal[] = []\r\nconst states2notify = new Set<StateVariants>()\r\nconst settings: Settings = {\r\n historyLength: 5,\r\n}\r\n\r\nexport const getHistoryValue = (state: StateVariants): unknown => {\r\n return state.history[state.historyCursor]\r\n}\r\nconst pushHistory = <T extends HistoryInternal>(state: T, value: unknown) => {\r\n const cursorHistory = state.historyCursor\r\n state.history[cursorHistory] = value\r\n state.historyCursor = (cursorHistory + 1) % state.history.length\r\n}\r\n\r\nconst getName = (name?: string): string => {\r\n if (name && names.has(name)) {\r\n console.error(`Name ${name} already used! Replaced to undefined`)\r\n return defaultName\r\n }\r\n if (name) {\r\n return name\r\n }\r\n return defaultName\r\n}\r\n\r\nexport const setSetting = (data: Partial<Settings>) => {\r\n Object.assign(settings, data)\r\n}\r\n\r\nconst getComputed = (state: CommonInternal | ComputedInternal) => {\r\n if ('reducer' in state) {\r\n return state\r\n }\r\n}\r\n\r\nconst isFunction = (v: unknown): v is Func => {\r\n return typeof v === 'function'\r\n}\r\n\r\nconst isDontNeedRecalc = (state: CommonInternal, prevState: unknown): boolean => {\r\n return state.hasParentUpdates === false && prevState !== undefined\r\n}\r\n\r\nconst getComputedValue = (state: ComputedInternal): unknown => {\r\n try {\r\n const prevState = getHistoryValue(state)\r\n\r\n if (isDontNeedRecalc(state, prevState)) {\r\n if (recording) {\r\n state.depends.forEach((item) => {\r\n recording?.add(item)\r\n })\r\n }\r\n return prevState\r\n }\r\n\r\n assert(state.isComputing, `Loops dosen't allows. Name: ${state.name ?? 'Unnamed state'}`)\r\n\r\n requesters.push(state)\r\n state.depends.forEach((item) => {\r\n item.childs.delete(state)\r\n })\r\n state.depends.clear()\r\n state.isComputing = true\r\n const value = state.reducer(prevState ?? state.initial)\r\n state.isComputing = false\r\n state.hasParentUpdates = false\r\n\r\n requesters.pop()\r\n pushHistory(state, value)\r\n\r\n return value\r\n } catch (e) {\r\n console.error((e as Error).message)\r\n return undefined\r\n }\r\n}\r\n\r\nconst getValue = (state: CommonInternal) => {\r\n const reducer = getComputed(state)\r\n try {\r\n const lastRequester = requesters.at(-1)\r\n if (lastRequester && !state.childs.has(lastRequester)) {\r\n state.childs.add(lastRequester)\r\n lastRequester.depends.add(state)\r\n }\r\n if (reducer) {\r\n return getComputedValue(reducer)\r\n }\r\n return getHistoryValue(state)\r\n } finally {\r\n if (recording && !reducer) {\r\n recording.add(state)\r\n }\r\n }\r\n}\r\n\r\nconst getValueOfSetterFunction = (state: CommonInternal, value: SetterFunc): unknown => {\r\n const prevValue = getHistoryValue(state)\r\n return value(prevValue)\r\n}\r\n\r\nconst setValue = (state: CommonInternal, value: unknown): void => {\r\n const newValue = isFunction(value) ? getValueOfSetterFunction(state, value) : value\r\n\r\n if (newValue === getHistoryValue(state)) {\r\n return\r\n }\r\n pushHistory(state, newValue)\r\n invalidateSubtree(state)\r\n notifySubscribers()\r\n}\r\n\r\n/**\r\n * Mark all subtree is non actual.\r\n * Collect all nodes to notify subscribers im microtask queue.\r\n */\r\nconst invalidateSubtree = (state: CommonInternal) => {\r\n const stack: CommonInternal[] = [state]\r\n\r\n while (stack.length) {\r\n const st = stack.pop()\r\n st.childs.forEach((it) => stack.push(it))\r\n st.hasParentUpdates = true\r\n if (st.subscribes.size) {\r\n states2notify.add(st)\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Notify all collected subscribers once in microtask queue\r\n */\r\nconst notifySubscribers = () => {\r\n if (isNotifying === false) {\r\n isNotifying = true\r\n queueMicrotask(() => {\r\n // Нужно обновить дерево\r\n states2notify.forEach((state) => {\r\n try {\r\n state.subscribes.forEach((listner) => {\r\n return listner(getValue(state))\r\n })\r\n } catch (e) {\r\n console.error('Error in subscriber function of:', state.name)\r\n }\r\n })\r\n states2notify.clear()\r\n isNotifying = false\r\n })\r\n }\r\n}\r\n\r\n/**\r\n * Start collecting all non computed states.\r\n *\r\n * Helper for render adapters.\r\n */\r\nexport const startRecord = () => {\r\n recording = new Set()\r\n}\r\n\r\n/**\r\n * Flush all collected non computed states.\r\n */\r\nexport const flushStates = (): Set<StateInternal> => {\r\n const data = recording\r\n recording = undefined\r\n return data\r\n}\r\n\r\nexport const subscribe = (state: CommonInternal | CommonInternal, listner: Listner): UnSubscribe => {\r\n /**\r\n * Если значение стейта ниразу не расчитывалось, его нужно обновить\r\n * Если подписываемся на вычисляемый стэйт, то нужно узнать всех родителей\r\n * Родители могут меняться, поэтому после каждого вычисления нужно обновлять зависимости дерева\r\n *\r\n * При отписке нужно оповестить всех на кого были опдписанты о том что мы отписались\r\n *\r\n */\r\n\r\n if (state.subscribes.has(listner)) {\r\n return () => ({})\r\n }\r\n\r\n const computedState = getComputed(state)\r\n // Нужно актуализировать в родилеях зависимость\r\n if (computedState) {\r\n getComputedValue(computedState)\r\n state.depends.forEach((parent) => parent.childs.add(state))\r\n }\r\n\r\n state.subscribes.add(listner)\r\n\r\n return () => {\r\n state.subscribes.delete(listner)\r\n if (state.subscribes.size === 0) {\r\n state.depends.forEach((parent) => parent.childs.delete(state))\r\n }\r\n }\r\n}\r\n\r\nconst assert = (condtion: boolean, msg: string) => {\r\n if (condtion) {\r\n throw new Error(msg)\r\n }\r\n}\r\n\r\n/**\r\n *\r\n * @param value - Reducer or value\r\n * @param name - name of state. For loggin or easy debug\r\n * @returns State<T>\r\n */\r\nexport function state<T extends StateType = StateType>(value: T, options?: Options): State<T> {\r\n assert(isFunction(value), 'Function not allowed in state')\r\n\r\n const data: CommonInternal = {\r\n childs: new Set(),\r\n depends: new Set(),\r\n history: Array.from({length: settings.historyLength}),\r\n historyCursor: 0,\r\n name: getName(options?.name),\r\n subscribes: new Set(),\r\n hasParentUpdates: undefined,\r\n }\r\n\r\n setValue(data, value)\r\n\r\n const publicApi = function () {\r\n return getValue(data)\r\n }\r\n\r\n Object.defineProperty(publicApi, 'name', {value: data.name})\r\n publicApi.subscribe = (listner: Listner) => subscribe(data, listner)\r\n publicApi.set = (value: T) => setValue(data, value)\r\n publicApi._internal = data\r\n\r\n return publicApi as State<T>\r\n}\r\n\r\nexport const computed = <\r\n T extends StateType = -1,\r\n S extends StatlessFunc<T> = StatlessFunc<T>,\r\n O extends Nullable<ComputedInternalOptions> = Nullable<ComputedInternalOptions>,\r\n>(\r\n value: GetStatlessFunc<T, S, O>,\r\n options?: O,\r\n): Computed<T> => {\r\n const data: ComputedInternal = {\r\n childs: new Set(),\r\n depends: new Set(),\r\n hasParentUpdates: true,\r\n history: Array.from({length: settings.historyLength}),\r\n historyCursor: 0,\r\n initial: options?.initial as ReturnType<typeof value> | undefined,\r\n isComputing: false,\r\n name: getName(options?.name),\r\n reducer: value,\r\n subscribes: new Set(),\r\n }\r\n\r\n const publicApi = function () {\r\n return getValue(data)\r\n }\r\n\r\n Object.defineProperty(publicApi, 'name', {value: data.name})\r\n publicApi.subscribe = (listner: Listner<T>) => subscribe(data, listner as Listner)\r\n publicApi._internal = data\r\n\r\n return publicApi as Computed<T>\r\n}\r\n\r\n/**\r\n * ## Action state\r\n *\r\n * @param value - Action function\r\n * @param name\r\n */\r\nexport const action = <T extends unknown[]>(\r\n value: (...args: T) => void,\r\n options?: ActionOptions,\r\n): Action<T> => {\r\n return {\r\n run: (...args: T) => {\r\n isActionNow = true\r\n value(...args)\r\n isActionNow = false\r\n return this\r\n },\r\n name: getName(options.name),\r\n onAction: options.onAction,\r\n }\r\n}\r\n"],"names":["recording","isNotifying","names","Set","requesters","states2notify","getHistoryValue","state","history","historyCursor","pushHistory","value","cursorHistory","length","getName","name","has","console","error","defaultName","getComputed","isFunction","v","getComputedValue","_state$name","prevState","hasParentUpdates","undefined","isDontNeedRecalc","depends","forEach","item","_recording","add","assert","isComputing","push","childs","delete","clear","reducer","initial","pop","e","message","getValue","at","lastRequester","setValue","newValue","getValueOfSetterFunction","invalidateSubtree","notifySubscribers","stack","st","it","subscribes","size","queueMicrotask","listner","startRecord","flushStates","data","subscribe","computedState","parent","condtion","msg","options","Array","from","publicApi","Object","defineProperty","set","_internal","computed","action","run","args","this","onAction"],"mappings":"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"}
{"version":3,"file":"index.modern.mjs","sources":["../src/core.ts"],"sourcesContent":["import {\r\n ComputedInternal,\r\n Listner,\r\n StateType,\r\n Settings,\r\n StateVariants,\r\n Action,\r\n Options,\r\n ComputedInternalOptions,\r\n Nullable,\r\n StatlessFunc,\r\n GetStatlessFunc,\r\n HistoryInternal,\r\n State,\r\n Computed,\r\n Func,\r\n UnSubscribe,\r\n CommonInternal,\r\n StateInternal,\r\n SetterFunc,\r\n ActionOptions,\r\n} from './types.js'\r\n\r\nlet isNotifying = false\r\nlet isActionNow = false\r\nlet recording: Set<StateInternal> | undefined\r\n\r\nconst defaultName = 'Unnamed state'\r\nconst names = new Set()\r\nconst requesters: ComputedInternal[] = []\r\nconst states2notify = new Set<StateVariants>()\r\nconst settings: Settings = {\r\n historyLength: 5,\r\n}\r\n\r\nexport const getHistoryValue = (state: StateVariants): unknown => {\r\n return state.history[state.historyCursor]\r\n}\r\nconst pushHistory = <T extends HistoryInternal>(state: T, value: unknown) => {\r\n const cursorHistory = state.historyCursor\r\n state.historyCursor = (cursorHistory + 1) % state.history.length\r\n state.history[state.historyCursor] = value\r\n}\r\n\r\nconst getName = (name?: string): string => {\r\n if (name && names.has(name)) {\r\n console.error(`Name ${name} already used! Replaced to undefined`)\r\n return defaultName\r\n }\r\n if (name) {\r\n return name\r\n }\r\n return defaultName\r\n}\r\n\r\nexport const setSetting = (data: Partial<Settings>) => {\r\n Object.assign(settings, data)\r\n}\r\n\r\nconst getComputed = (state: CommonInternal | ComputedInternal) => {\r\n if ('reducer' in state) {\r\n return state\r\n }\r\n}\r\n\r\nconst isFunction = (v: unknown): v is Func => {\r\n return typeof v === 'function'\r\n}\r\n\r\nconst isDontNeedRecalc = (state: CommonInternal, prevState: unknown): boolean => {\r\n return state.hasParentUpdates === false && prevState !== undefined\r\n}\r\n\r\nconst getComputedValue = (state: ComputedInternal): unknown => {\r\n try {\r\n const prevState = getHistoryValue(state)\r\n\r\n if (isDontNeedRecalc(state, prevState)) {\r\n if (recording) {\r\n state.depends.forEach((item) => {\r\n recording?.add(item)\r\n })\r\n }\r\n return prevState\r\n }\r\n\r\n assert(state.isComputing, `Loops dosen't allows. Name: ${state.name ?? 'Unnamed state'}`)\r\n\r\n requesters.push(state)\r\n state.depends.forEach((item) => {\r\n item.childs.delete(state)\r\n })\r\n state.depends.clear()\r\n state.isComputing = true\r\n const value = state.reducer(prevState ?? state.initial)\r\n state.isComputing = false\r\n state.hasParentUpdates = false\r\n\r\n requesters.pop()\r\n pushHistory(state, value)\r\n\r\n return value\r\n } catch (e) {\r\n console.error((e as Error).message)\r\n return undefined\r\n }\r\n}\r\n\r\nconst getValue = (state: CommonInternal) => {\r\n const reducer = getComputed(state)\r\n try {\r\n const lastRequester = requesters.at(-1)\r\n if (lastRequester && !state.childs.has(lastRequester)) {\r\n state.childs.add(lastRequester)\r\n lastRequester.depends.add(state)\r\n }\r\n if (reducer) {\r\n return getComputedValue(reducer)\r\n }\r\n return getHistoryValue(state)\r\n } finally {\r\n if (recording && !reducer) {\r\n recording.add(state)\r\n }\r\n }\r\n}\r\n\r\nconst getValueOfSetterFunction = (state: CommonInternal, value: SetterFunc): unknown => {\r\n const prevValue = getHistoryValue(state)\r\n return value(prevValue)\r\n}\r\n\r\nconst setValue = (state: CommonInternal, value: unknown): void => {\r\n const newValue = isFunction(value) ? getValueOfSetterFunction(state, value) : value\r\n\r\n if (newValue === getHistoryValue(state)) {\r\n return\r\n }\r\n pushHistory(state, newValue)\r\n invalidateSubtree(state)\r\n notifySubscribers()\r\n}\r\n\r\n/**\r\n * Mark all subtree is non actual.\r\n * Collect all nodes to notify subscribers im microtask queue.\r\n */\r\nconst invalidateSubtree = (state: CommonInternal) => {\r\n const stack: CommonInternal[] = [state]\r\n\r\n while (stack.length) {\r\n const st = stack.pop()\r\n st.childs.forEach((it) => stack.push(it))\r\n st.hasParentUpdates = true\r\n if (st.subscribes.size) {\r\n states2notify.add(st)\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Notify all collected subscribers once in microtask queue\r\n */\r\nconst notifySubscribers = () => {\r\n if (isNotifying === false) {\r\n isNotifying = true\r\n queueMicrotask(() => {\r\n // Нужно обновить дерево\r\n states2notify.forEach((state) => {\r\n try {\r\n state.subscribes.forEach((listner) => {\r\n return listner(getValue(state))\r\n })\r\n } catch (e) {\r\n console.error('Error in subscriber function of:', state.name)\r\n }\r\n })\r\n states2notify.clear()\r\n isNotifying = false\r\n })\r\n }\r\n}\r\n\r\n/**\r\n * Start collecting all non computed states.\r\n *\r\n * Helper for render adapters.\r\n */\r\nexport const startRecord = () => {\r\n recording = new Set()\r\n}\r\n\r\n/**\r\n * Flush all collected non computed states.\r\n */\r\nexport const flushStates = (): Set<StateInternal> => {\r\n const data = recording\r\n recording = undefined\r\n return data\r\n}\r\n\r\nexport const subscribe = (state: CommonInternal | CommonInternal, listner: Listner): UnSubscribe => {\r\n /**\r\n * Если значение стейта ниразу не расчитывалось, его нужно обновить\r\n * Если подписываемся на вычисляемый стэйт, то нужно узнать всех родителей\r\n * Родители могут меняться, поэтому после каждого вычисления нужно обновлять зависимости дерева\r\n *\r\n * При отписке нужно оповестить всех на кого были опдписанты о том что мы отписались\r\n *\r\n */\r\n\r\n if (state.subscribes.has(listner)) {\r\n return () => ({})\r\n }\r\n\r\n const computedState = getComputed(state)\r\n // Нужно актуализировать в родилеях зависимость\r\n if (computedState) {\r\n getComputedValue(computedState)\r\n state.depends.forEach((parent) => parent.childs.add(state))\r\n }\r\n\r\n state.subscribes.add(listner)\r\n\r\n return () => {\r\n state.subscribes.delete(listner)\r\n if (state.subscribes.size === 0) {\r\n state.depends.forEach((parent) => parent.childs.delete(state))\r\n }\r\n }\r\n}\r\n\r\nconst assert = (condtion: boolean, msg: string) => {\r\n if (condtion) {\r\n throw new Error(msg)\r\n }\r\n}\r\n\r\n/**\r\n *\r\n * @param value - Reducer or value\r\n * @param name - name of state. For loggin or easy debug\r\n * @returns State<T>\r\n */\r\nexport function state<T extends StateType = StateType>(value: T, options?: Options): State<T> {\r\n assert(isFunction(value), 'Function not allowed in state')\r\n\r\n const data: CommonInternal = {\r\n childs: new Set(),\r\n depends: new Set(),\r\n history: Array.from({length: settings.historyLength}),\r\n historyCursor: -1,\r\n name: getName(options?.name),\r\n subscribes: new Set(),\r\n hasParentUpdates: undefined,\r\n }\r\n\r\n setValue(data, value)\r\n\r\n const publicApi = function () {\r\n return getValue(data)\r\n }\r\n\r\n Object.defineProperty(publicApi, 'name', {value: data.name})\r\n publicApi.subscribe = (listner: Listner) => subscribe(data, listner)\r\n publicApi.set = (value: T) => setValue(data, value)\r\n publicApi._internal = data\r\n\r\n return publicApi as State<T>\r\n}\r\n\r\nexport const computed = <\r\n T extends StateType = -1,\r\n S extends StatlessFunc<T> = StatlessFunc<T>,\r\n O extends Nullable<ComputedInternalOptions> = Nullable<ComputedInternalOptions>,\r\n>(\r\n value: GetStatlessFunc<T, S, O>,\r\n options?: O,\r\n): Computed<T> => {\r\n const data: ComputedInternal = {\r\n childs: new Set(),\r\n depends: new Set(),\r\n hasParentUpdates: true,\r\n history: Array.from({length: settings.historyLength}),\r\n historyCursor: -1,\r\n initial: options?.initial as ReturnType<typeof value> | undefined,\r\n isComputing: false,\r\n name: getName(options?.name),\r\n reducer: value,\r\n subscribes: new Set(),\r\n }\r\n\r\n const publicApi = function () {\r\n return getValue(data)\r\n }\r\n\r\n Object.defineProperty(publicApi, 'name', {value: data.name})\r\n publicApi.subscribe = (listner: Listner<T>) => subscribe(data, listner as Listner)\r\n publicApi._internal = data\r\n\r\n return publicApi as Computed<T>\r\n}\r\n\r\n/**\r\n * ## Action state\r\n *\r\n * @param value - Action function\r\n * @param name\r\n */\r\nexport const action = <T extends unknown[]>(\r\n value: (...args: T) => void,\r\n options?: ActionOptions,\r\n): Action<T> => {\r\n return {\r\n run: (...args: T) => {\r\n isActionNow = true\r\n value(...args)\r\n isActionNow = false\r\n return this\r\n },\r\n name: getName(options?.name),\r\n onAction: options?.onAction,\r\n }\r\n}\r\n"],"names":["recording","isNotifying","names","Set","requesters","states2notify","getHistoryValue","state","history","historyCursor","pushHistory","value","length","getName","name","has","console","error","defaultName","getComputed","isFunction","v","getComputedValue","_state$name","prevState","hasParentUpdates","undefined","isDontNeedRecalc","depends","forEach","item","_recording","add","assert","isComputing","push","childs","delete","clear","reducer","initial","pop","e","message","getValue","lastRequester","at","setValue","newValue","getValueOfSetterFunction","invalidateSubtree","notifySubscribers","stack","st","it","subscribes","size","queueMicrotask","listner","startRecord","flushStates","data","subscribe","computedState","parent","condtion","msg","Error","options","Array","from","publicApi","Object","defineProperty","set","_internal","computed","action","run","args","this","onAction"],"mappings":"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"}

@@ -1,2 +0,2 @@

var e=void 0;let r,n=!1;const s="Unnamed state",t=new Set,o=[],i=new Set,a=e=>e.history[e.historyCursor],c=(e,r)=>{const n=e.historyCursor;e.history[n]=r,e.historyCursor=(n+1)%e.history.length},d=e=>e&&t.has(e)?(console.error(`Name ${e} already used! Replaced to undefined`),s):e||s,u=e=>{if("reducer"in e)return e},h=e=>"function"==typeof e,l=e=>{try{const n=a(e);if(((e,r)=>!1===e.hasParentUpdates&&void 0!==r)(e,n))return r&&e.depends.forEach(e=>{r?.add(e)}),n;C(e.isComputing,`Loops dosen't allows. Name: ${e.name??"Unnamed state"}`),o.push(e),e.depends.forEach(r=>{r.childs.delete(e)}),e.depends.clear(),e.isComputing=!0;const s=e.reducer(n??e.initial);return e.isComputing=!1,e.hasParentUpdates=!1,o.pop(),c(e,s),s}catch(e){return void console.error(e.message)}},p=e=>{const n=u(e);try{const s=o.at(-1);return s&&!e.childs.has(s)&&(e.childs.add(s),s.depends.add(e)),n?l(n):a(e)}finally{r&&!n&&r.add(e)}},f=(e,r)=>{const n=h(r)?((e,r)=>r(a(e)))(e,r):r;n!==a(e)&&(c(e,n),b(e),m())},b=e=>{const r=[e];for(;r.length;){const e=r.pop();e.childs.forEach(e=>r.push(e)),e.hasParentUpdates=!0,e.subscribes.size&&i.add(e)}},m=()=>{!1===n&&(n=!0,queueMicrotask(()=>{i.forEach(e=>{try{e.subscribes.forEach(r=>r(p(e)))}catch(r){console.error("Error in subscriber function of:",e.name)}}),i.clear(),n=!1}))},y=()=>{r=new Set},w=()=>{const e=r;return r=void 0,e},g=(e,r)=>{if(e.subscribes.has(r))return()=>({});const n=u(e);return n&&(l(n),e.depends.forEach(r=>r.childs.add(e))),e.subscribes.add(r),()=>{e.subscribes.delete(r),0===e.subscribes.size&&e.depends.forEach(r=>r.childs.delete(e))}},C=(e,r)=>{if(e)throw new Error(r)};function E(e,r){C(h(e),"Function not allowed in state");const n={childs:new Set,depends:new Set,history:Array.from({length:5}),historyCursor:0,name:d(r?.name),subscribes:new Set,hasParentUpdates:void 0};f(n,e);const s=function(){return p(n)};return Object.defineProperty(s,"name",{value:n.name}),s.subscribe=e=>g(n,e),s.set=e=>f(n,e),s._internal=n,s}const S=(e,r)=>{const n={childs:new Set,depends:new Set,hasParentUpdates:!0,history:Array.from({length:5}),historyCursor:0,initial:r?.initial,isComputing:!1,name:d(r?.name),reducer:e,subscribes:new Set},s=function(){return p(n)};return Object.defineProperty(s,"name",{value:n.name}),s.subscribe=e=>g(n,e),s._internal=n,s},v=(r,n)=>({run:function(){return r(...[].slice.call(arguments)),e},name:d(n.name),onAction:n.onAction});export{v as action,S as computed,w as flushStates,y as startRecord,E as state,g as subscribe};
var e=void 0;let r,n=!1;const s="Unnamed state",t=new Set,o=[],i=new Set,a=e=>e.history[e.historyCursor],c=(e,r)=>{e.historyCursor=(e.historyCursor+1)%e.history.length,e.history[e.historyCursor]=r},d=e=>e&&t.has(e)?(console.error(`Name ${e} already used! Replaced to undefined`),s):e||s,u=e=>{if("reducer"in e)return e},h=e=>"function"==typeof e,l=e=>{try{const n=a(e);if(((e,r)=>!1===e.hasParentUpdates&&void 0!==r)(e,n))return r&&e.depends.forEach(e=>{r?.add(e)}),n;g(e.isComputing,`Loops dosen't allows. Name: ${e.name??"Unnamed state"}`),o.push(e),e.depends.forEach(r=>{r.childs.delete(e)}),e.depends.clear(),e.isComputing=!0;const s=e.reducer(n??e.initial);return e.isComputing=!1,e.hasParentUpdates=!1,o.pop(),c(e,s),s}catch(e){return void console.error(e.message)}},p=e=>{const n=u(e);try{const s=o.at(-1);return s&&!e.childs.has(s)&&(e.childs.add(s),s.depends.add(e)),n?l(n):a(e)}finally{r&&!n&&r.add(e)}},f=(e,r)=>{const n=h(r)?((e,r)=>r(a(e)))(e,r):r;n!==a(e)&&(c(e,n),b(e),m())},b=e=>{const r=[e];for(;r.length;){const e=r.pop();e.childs.forEach(e=>r.push(e)),e.hasParentUpdates=!0,e.subscribes.size&&i.add(e)}},m=()=>{!1===n&&(n=!0,queueMicrotask(()=>{i.forEach(e=>{try{e.subscribes.forEach(r=>r(p(e)))}catch(r){console.error("Error in subscriber function of:",e.name)}}),i.clear(),n=!1}))},y=()=>{r=new Set},w=()=>{const e=r;return r=void 0,e},C=(e,r)=>{if(e.subscribes.has(r))return()=>({});const n=u(e);return n&&(l(n),e.depends.forEach(r=>r.childs.add(e))),e.subscribes.add(r),()=>{e.subscribes.delete(r),0===e.subscribes.size&&e.depends.forEach(r=>r.childs.delete(e))}},g=(e,r)=>{if(e)throw new Error(r)};function E(e,r){g(h(e),"Function not allowed in state");const n={childs:new Set,depends:new Set,history:Array.from({length:5}),historyCursor:-1,name:d(r?.name),subscribes:new Set,hasParentUpdates:void 0};f(n,e);const s=function(){return p(n)};return Object.defineProperty(s,"name",{value:n.name}),s.subscribe=e=>C(n,e),s.set=e=>f(n,e),s._internal=n,s}const S=(e,r)=>{const n={childs:new Set,depends:new Set,hasParentUpdates:!0,history:Array.from({length:5}),historyCursor:-1,initial:r?.initial,isComputing:!1,name:d(r?.name),reducer:e,subscribes:new Set},s=function(){return p(n)};return Object.defineProperty(s,"name",{value:n.name}),s.subscribe=e=>C(n,e),s._internal=n,s},v=(r,n)=>({run:function(){return r(...[].slice.call(arguments)),e},name:d(n?.name),onAction:n?.onAction});export{v as action,S as computed,w as flushStates,y as startRecord,E as state,C as subscribe};
//# sourceMappingURL=index.module.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"index.module.js","sources":["../src/core.ts"],"sourcesContent":["import {\r\n ComputedInternal,\r\n Listner,\r\n StateType,\r\n Settings,\r\n StateVariants,\r\n Action,\r\n Options,\r\n ComputedInternalOptions,\r\n Nullable,\r\n StatlessFunc,\r\n GetStatlessFunc,\r\n HistoryInternal,\r\n State,\r\n Computed,\r\n Func,\r\n UnSubscribe,\r\n CommonInternal,\r\n StateInternal,\r\n SetterFunc,\r\n ActionOptions,\r\n} from './types.js'\r\n\r\nlet isNotifying = false\r\nlet isActionNow = false\r\nlet recording: Set<StateInternal> | undefined\r\n\r\nconst defaultName = 'Unnamed state'\r\nconst names = new Set()\r\nconst requesters: ComputedInternal[] = []\r\nconst states2notify = new Set<StateVariants>()\r\nconst settings: Settings = {\r\n historyLength: 5,\r\n}\r\n\r\nexport const getHistoryValue = (state: StateVariants): unknown => {\r\n return state.history[state.historyCursor]\r\n}\r\nconst pushHistory = <T extends HistoryInternal>(state: T, value: unknown) => {\r\n const cursorHistory = state.historyCursor\r\n state.history[cursorHistory] = value\r\n state.historyCursor = (cursorHistory + 1) % state.history.length\r\n}\r\n\r\nconst getName = (name?: string): string => {\r\n if (name && names.has(name)) {\r\n console.error(`Name ${name} already used! Replaced to undefined`)\r\n return defaultName\r\n }\r\n if (name) {\r\n return name\r\n }\r\n return defaultName\r\n}\r\n\r\nexport const setSetting = (data: Partial<Settings>) => {\r\n Object.assign(settings, data)\r\n}\r\n\r\nconst getComputed = (state: CommonInternal | ComputedInternal) => {\r\n if ('reducer' in state) {\r\n return state\r\n }\r\n}\r\n\r\nconst isFunction = (v: unknown): v is Func => {\r\n return typeof v === 'function'\r\n}\r\n\r\nconst isDontNeedRecalc = (state: CommonInternal, prevState: unknown): boolean => {\r\n return state.hasParentUpdates === false && prevState !== undefined\r\n}\r\n\r\nconst getComputedValue = (state: ComputedInternal): unknown => {\r\n try {\r\n const prevState = getHistoryValue(state)\r\n\r\n if (isDontNeedRecalc(state, prevState)) {\r\n if (recording) {\r\n state.depends.forEach((item) => {\r\n recording?.add(item)\r\n })\r\n }\r\n return prevState\r\n }\r\n\r\n assert(state.isComputing, `Loops dosen't allows. Name: ${state.name ?? 'Unnamed state'}`)\r\n\r\n requesters.push(state)\r\n state.depends.forEach((item) => {\r\n item.childs.delete(state)\r\n })\r\n state.depends.clear()\r\n state.isComputing = true\r\n const value = state.reducer(prevState ?? state.initial)\r\n state.isComputing = false\r\n state.hasParentUpdates = false\r\n\r\n requesters.pop()\r\n pushHistory(state, value)\r\n\r\n return value\r\n } catch (e) {\r\n console.error((e as Error).message)\r\n return undefined\r\n }\r\n}\r\n\r\nconst getValue = (state: CommonInternal) => {\r\n const reducer = getComputed(state)\r\n try {\r\n const lastRequester = requesters.at(-1)\r\n if (lastRequester && !state.childs.has(lastRequester)) {\r\n state.childs.add(lastRequester)\r\n lastRequester.depends.add(state)\r\n }\r\n if (reducer) {\r\n return getComputedValue(reducer)\r\n }\r\n return getHistoryValue(state)\r\n } finally {\r\n if (recording && !reducer) {\r\n recording.add(state)\r\n }\r\n }\r\n}\r\n\r\nconst getValueOfSetterFunction = (state: CommonInternal, value: SetterFunc): unknown => {\r\n const prevValue = getHistoryValue(state)\r\n return value(prevValue)\r\n}\r\n\r\nconst setValue = (state: CommonInternal, value: unknown): void => {\r\n const newValue = isFunction(value) ? getValueOfSetterFunction(state, value) : value\r\n\r\n if (newValue === getHistoryValue(state)) {\r\n return\r\n }\r\n pushHistory(state, newValue)\r\n invalidateSubtree(state)\r\n notifySubscribers()\r\n}\r\n\r\n/**\r\n * Mark all subtree is non actual.\r\n * Collect all nodes to notify subscribers im microtask queue.\r\n */\r\nconst invalidateSubtree = (state: CommonInternal) => {\r\n const stack: CommonInternal[] = [state]\r\n\r\n while (stack.length) {\r\n const st = stack.pop()\r\n st.childs.forEach((it) => stack.push(it))\r\n st.hasParentUpdates = true\r\n if (st.subscribes.size) {\r\n states2notify.add(st)\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Notify all collected subscribers once in microtask queue\r\n */\r\nconst notifySubscribers = () => {\r\n if (isNotifying === false) {\r\n isNotifying = true\r\n queueMicrotask(() => {\r\n // Нужно обновить дерево\r\n states2notify.forEach((state) => {\r\n try {\r\n state.subscribes.forEach((listner) => {\r\n return listner(getValue(state))\r\n })\r\n } catch (e) {\r\n console.error('Error in subscriber function of:', state.name)\r\n }\r\n })\r\n states2notify.clear()\r\n isNotifying = false\r\n })\r\n }\r\n}\r\n\r\n/**\r\n * Start collecting all non computed states.\r\n *\r\n * Helper for render adapters.\r\n */\r\nexport const startRecord = () => {\r\n recording = new Set()\r\n}\r\n\r\n/**\r\n * Flush all collected non computed states.\r\n */\r\nexport const flushStates = (): Set<StateInternal> => {\r\n const data = recording\r\n recording = undefined\r\n return data\r\n}\r\n\r\nexport const subscribe = (state: CommonInternal | CommonInternal, listner: Listner): UnSubscribe => {\r\n /**\r\n * Если значение стейта ниразу не расчитывалось, его нужно обновить\r\n * Если подписываемся на вычисляемый стэйт, то нужно узнать всех родителей\r\n * Родители могут меняться, поэтому после каждого вычисления нужно обновлять зависимости дерева\r\n *\r\n * При отписке нужно оповестить всех на кого были опдписанты о том что мы отписались\r\n *\r\n */\r\n\r\n if (state.subscribes.has(listner)) {\r\n return () => ({})\r\n }\r\n\r\n const computedState = getComputed(state)\r\n // Нужно актуализировать в родилеях зависимость\r\n if (computedState) {\r\n getComputedValue(computedState)\r\n state.depends.forEach((parent) => parent.childs.add(state))\r\n }\r\n\r\n state.subscribes.add(listner)\r\n\r\n return () => {\r\n state.subscribes.delete(listner)\r\n if (state.subscribes.size === 0) {\r\n state.depends.forEach((parent) => parent.childs.delete(state))\r\n }\r\n }\r\n}\r\n\r\nconst assert = (condtion: boolean, msg: string) => {\r\n if (condtion) {\r\n throw new Error(msg)\r\n }\r\n}\r\n\r\n/**\r\n *\r\n * @param value - Reducer or value\r\n * @param name - name of state. For loggin or easy debug\r\n * @returns State<T>\r\n */\r\nexport function state<T extends StateType = StateType>(value: T, options?: Options): State<T> {\r\n assert(isFunction(value), 'Function not allowed in state')\r\n\r\n const data: CommonInternal = {\r\n childs: new Set(),\r\n depends: new Set(),\r\n history: Array.from({length: settings.historyLength}),\r\n historyCursor: 0,\r\n name: getName(options?.name),\r\n subscribes: new Set(),\r\n hasParentUpdates: undefined,\r\n }\r\n\r\n setValue(data, value)\r\n\r\n const publicApi = function () {\r\n return getValue(data)\r\n }\r\n\r\n Object.defineProperty(publicApi, 'name', {value: data.name})\r\n publicApi.subscribe = (listner: Listner) => subscribe(data, listner)\r\n publicApi.set = (value: T) => setValue(data, value)\r\n publicApi._internal = data\r\n\r\n return publicApi as State<T>\r\n}\r\n\r\nexport const computed = <\r\n T extends StateType = -1,\r\n S extends StatlessFunc<T> = StatlessFunc<T>,\r\n O extends Nullable<ComputedInternalOptions> = Nullable<ComputedInternalOptions>,\r\n>(\r\n value: GetStatlessFunc<T, S, O>,\r\n options?: O,\r\n): Computed<T> => {\r\n const data: ComputedInternal = {\r\n childs: new Set(),\r\n depends: new Set(),\r\n hasParentUpdates: true,\r\n history: Array.from({length: settings.historyLength}),\r\n historyCursor: 0,\r\n initial: options?.initial as ReturnType<typeof value> | undefined,\r\n isComputing: false,\r\n name: getName(options?.name),\r\n reducer: value,\r\n subscribes: new Set(),\r\n }\r\n\r\n const publicApi = function () {\r\n return getValue(data)\r\n }\r\n\r\n Object.defineProperty(publicApi, 'name', {value: data.name})\r\n publicApi.subscribe = (listner: Listner<T>) => subscribe(data, listner as Listner)\r\n publicApi._internal = data\r\n\r\n return publicApi as Computed<T>\r\n}\r\n\r\n/**\r\n * ## Action state\r\n *\r\n * @param value - Action function\r\n * @param name\r\n */\r\nexport const action = <T extends unknown[]>(\r\n value: (...args: T) => void,\r\n options?: ActionOptions,\r\n): Action<T> => {\r\n return {\r\n run: (...args: T) => {\r\n isActionNow = true\r\n value(...args)\r\n isActionNow = false\r\n return this\r\n },\r\n name: getName(options.name),\r\n onAction: options.onAction,\r\n }\r\n}\r\n"],"names":["_this","this","recording","isNotifying","names","Set","requesters","states2notify","getHistoryValue","state","history","historyCursor","pushHistory","value","cursorHistory","length","getName","name","has","console","error","defaultName","isFunction","v","prevState","hasParentUpdates","undefined","isDontNeedRecalc","depends","forEach","item","add","assert","isComputing","push","childs","delete","clear","reducer","initial","pop","e","message","getValue","getComputed","lastRequester","at","getComputedValue","setValue","newValue","getValueOfSetterFunction","invalidateSubtree","notifySubscribers","stack","st","it","subscribes","size","queueMicrotask","listner","startRecord","flushStates","data","subscribe","computedState","parent","condtion","msg","Error","options","Array","from","publicApi","Object","defineProperty","set","_internal","computed","action","run","slice","call","arguments","onAction"],"mappings":"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"}
{"version":3,"file":"index.module.js","sources":["../src/core.ts"],"sourcesContent":["import {\r\n ComputedInternal,\r\n Listner,\r\n StateType,\r\n Settings,\r\n StateVariants,\r\n Action,\r\n Options,\r\n ComputedInternalOptions,\r\n Nullable,\r\n StatlessFunc,\r\n GetStatlessFunc,\r\n HistoryInternal,\r\n State,\r\n Computed,\r\n Func,\r\n UnSubscribe,\r\n CommonInternal,\r\n StateInternal,\r\n SetterFunc,\r\n ActionOptions,\r\n} from './types.js'\r\n\r\nlet isNotifying = false\r\nlet isActionNow = false\r\nlet recording: Set<StateInternal> | undefined\r\n\r\nconst defaultName = 'Unnamed state'\r\nconst names = new Set()\r\nconst requesters: ComputedInternal[] = []\r\nconst states2notify = new Set<StateVariants>()\r\nconst settings: Settings = {\r\n historyLength: 5,\r\n}\r\n\r\nexport const getHistoryValue = (state: StateVariants): unknown => {\r\n return state.history[state.historyCursor]\r\n}\r\nconst pushHistory = <T extends HistoryInternal>(state: T, value: unknown) => {\r\n const cursorHistory = state.historyCursor\r\n state.historyCursor = (cursorHistory + 1) % state.history.length\r\n state.history[state.historyCursor] = value\r\n}\r\n\r\nconst getName = (name?: string): string => {\r\n if (name && names.has(name)) {\r\n console.error(`Name ${name} already used! Replaced to undefined`)\r\n return defaultName\r\n }\r\n if (name) {\r\n return name\r\n }\r\n return defaultName\r\n}\r\n\r\nexport const setSetting = (data: Partial<Settings>) => {\r\n Object.assign(settings, data)\r\n}\r\n\r\nconst getComputed = (state: CommonInternal | ComputedInternal) => {\r\n if ('reducer' in state) {\r\n return state\r\n }\r\n}\r\n\r\nconst isFunction = (v: unknown): v is Func => {\r\n return typeof v === 'function'\r\n}\r\n\r\nconst isDontNeedRecalc = (state: CommonInternal, prevState: unknown): boolean => {\r\n return state.hasParentUpdates === false && prevState !== undefined\r\n}\r\n\r\nconst getComputedValue = (state: ComputedInternal): unknown => {\r\n try {\r\n const prevState = getHistoryValue(state)\r\n\r\n if (isDontNeedRecalc(state, prevState)) {\r\n if (recording) {\r\n state.depends.forEach((item) => {\r\n recording?.add(item)\r\n })\r\n }\r\n return prevState\r\n }\r\n\r\n assert(state.isComputing, `Loops dosen't allows. Name: ${state.name ?? 'Unnamed state'}`)\r\n\r\n requesters.push(state)\r\n state.depends.forEach((item) => {\r\n item.childs.delete(state)\r\n })\r\n state.depends.clear()\r\n state.isComputing = true\r\n const value = state.reducer(prevState ?? state.initial)\r\n state.isComputing = false\r\n state.hasParentUpdates = false\r\n\r\n requesters.pop()\r\n pushHistory(state, value)\r\n\r\n return value\r\n } catch (e) {\r\n console.error((e as Error).message)\r\n return undefined\r\n }\r\n}\r\n\r\nconst getValue = (state: CommonInternal) => {\r\n const reducer = getComputed(state)\r\n try {\r\n const lastRequester = requesters.at(-1)\r\n if (lastRequester && !state.childs.has(lastRequester)) {\r\n state.childs.add(lastRequester)\r\n lastRequester.depends.add(state)\r\n }\r\n if (reducer) {\r\n return getComputedValue(reducer)\r\n }\r\n return getHistoryValue(state)\r\n } finally {\r\n if (recording && !reducer) {\r\n recording.add(state)\r\n }\r\n }\r\n}\r\n\r\nconst getValueOfSetterFunction = (state: CommonInternal, value: SetterFunc): unknown => {\r\n const prevValue = getHistoryValue(state)\r\n return value(prevValue)\r\n}\r\n\r\nconst setValue = (state: CommonInternal, value: unknown): void => {\r\n const newValue = isFunction(value) ? getValueOfSetterFunction(state, value) : value\r\n\r\n if (newValue === getHistoryValue(state)) {\r\n return\r\n }\r\n pushHistory(state, newValue)\r\n invalidateSubtree(state)\r\n notifySubscribers()\r\n}\r\n\r\n/**\r\n * Mark all subtree is non actual.\r\n * Collect all nodes to notify subscribers im microtask queue.\r\n */\r\nconst invalidateSubtree = (state: CommonInternal) => {\r\n const stack: CommonInternal[] = [state]\r\n\r\n while (stack.length) {\r\n const st = stack.pop()\r\n st.childs.forEach((it) => stack.push(it))\r\n st.hasParentUpdates = true\r\n if (st.subscribes.size) {\r\n states2notify.add(st)\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Notify all collected subscribers once in microtask queue\r\n */\r\nconst notifySubscribers = () => {\r\n if (isNotifying === false) {\r\n isNotifying = true\r\n queueMicrotask(() => {\r\n // Нужно обновить дерево\r\n states2notify.forEach((state) => {\r\n try {\r\n state.subscribes.forEach((listner) => {\r\n return listner(getValue(state))\r\n })\r\n } catch (e) {\r\n console.error('Error in subscriber function of:', state.name)\r\n }\r\n })\r\n states2notify.clear()\r\n isNotifying = false\r\n })\r\n }\r\n}\r\n\r\n/**\r\n * Start collecting all non computed states.\r\n *\r\n * Helper for render adapters.\r\n */\r\nexport const startRecord = () => {\r\n recording = new Set()\r\n}\r\n\r\n/**\r\n * Flush all collected non computed states.\r\n */\r\nexport const flushStates = (): Set<StateInternal> => {\r\n const data = recording\r\n recording = undefined\r\n return data\r\n}\r\n\r\nexport const subscribe = (state: CommonInternal | CommonInternal, listner: Listner): UnSubscribe => {\r\n /**\r\n * Если значение стейта ниразу не расчитывалось, его нужно обновить\r\n * Если подписываемся на вычисляемый стэйт, то нужно узнать всех родителей\r\n * Родители могут меняться, поэтому после каждого вычисления нужно обновлять зависимости дерева\r\n *\r\n * При отписке нужно оповестить всех на кого были опдписанты о том что мы отписались\r\n *\r\n */\r\n\r\n if (state.subscribes.has(listner)) {\r\n return () => ({})\r\n }\r\n\r\n const computedState = getComputed(state)\r\n // Нужно актуализировать в родилеях зависимость\r\n if (computedState) {\r\n getComputedValue(computedState)\r\n state.depends.forEach((parent) => parent.childs.add(state))\r\n }\r\n\r\n state.subscribes.add(listner)\r\n\r\n return () => {\r\n state.subscribes.delete(listner)\r\n if (state.subscribes.size === 0) {\r\n state.depends.forEach((parent) => parent.childs.delete(state))\r\n }\r\n }\r\n}\r\n\r\nconst assert = (condtion: boolean, msg: string) => {\r\n if (condtion) {\r\n throw new Error(msg)\r\n }\r\n}\r\n\r\n/**\r\n *\r\n * @param value - Reducer or value\r\n * @param name - name of state. For loggin or easy debug\r\n * @returns State<T>\r\n */\r\nexport function state<T extends StateType = StateType>(value: T, options?: Options): State<T> {\r\n assert(isFunction(value), 'Function not allowed in state')\r\n\r\n const data: CommonInternal = {\r\n childs: new Set(),\r\n depends: new Set(),\r\n history: Array.from({length: settings.historyLength}),\r\n historyCursor: -1,\r\n name: getName(options?.name),\r\n subscribes: new Set(),\r\n hasParentUpdates: undefined,\r\n }\r\n\r\n setValue(data, value)\r\n\r\n const publicApi = function () {\r\n return getValue(data)\r\n }\r\n\r\n Object.defineProperty(publicApi, 'name', {value: data.name})\r\n publicApi.subscribe = (listner: Listner) => subscribe(data, listner)\r\n publicApi.set = (value: T) => setValue(data, value)\r\n publicApi._internal = data\r\n\r\n return publicApi as State<T>\r\n}\r\n\r\nexport const computed = <\r\n T extends StateType = -1,\r\n S extends StatlessFunc<T> = StatlessFunc<T>,\r\n O extends Nullable<ComputedInternalOptions> = Nullable<ComputedInternalOptions>,\r\n>(\r\n value: GetStatlessFunc<T, S, O>,\r\n options?: O,\r\n): Computed<T> => {\r\n const data: ComputedInternal = {\r\n childs: new Set(),\r\n depends: new Set(),\r\n hasParentUpdates: true,\r\n history: Array.from({length: settings.historyLength}),\r\n historyCursor: -1,\r\n initial: options?.initial as ReturnType<typeof value> | undefined,\r\n isComputing: false,\r\n name: getName(options?.name),\r\n reducer: value,\r\n subscribes: new Set(),\r\n }\r\n\r\n const publicApi = function () {\r\n return getValue(data)\r\n }\r\n\r\n Object.defineProperty(publicApi, 'name', {value: data.name})\r\n publicApi.subscribe = (listner: Listner<T>) => subscribe(data, listner as Listner)\r\n publicApi._internal = data\r\n\r\n return publicApi as Computed<T>\r\n}\r\n\r\n/**\r\n * ## Action state\r\n *\r\n * @param value - Action function\r\n * @param name\r\n */\r\nexport const action = <T extends unknown[]>(\r\n value: (...args: T) => void,\r\n options?: ActionOptions,\r\n): Action<T> => {\r\n return {\r\n run: (...args: T) => {\r\n isActionNow = true\r\n value(...args)\r\n isActionNow = false\r\n return this\r\n },\r\n name: getName(options?.name),\r\n onAction: options?.onAction,\r\n }\r\n}\r\n"],"names":["_this","this","recording","isNotifying","names","Set","requesters","states2notify","getHistoryValue","state","history","historyCursor","pushHistory","value","length","getName","name","has","console","error","defaultName","getComputed","isFunction","v","getComputedValue","prevState","hasParentUpdates","undefined","isDontNeedRecalc","depends","forEach","item","add","assert","isComputing","push","childs","delete","clear","reducer","initial","pop","e","message","getValue","lastRequester","at","setValue","newValue","getValueOfSetterFunction","invalidateSubtree","notifySubscribers","stack","st","it","subscribes","size","queueMicrotask","listner","startRecord","data","subscribe","computedState","parent","condtion","msg","Error","options","Array","from","publicApi","Object","defineProperty","set","_internal","computed","action","run","slice","call","arguments","onAction"],"mappings":"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"}

@@ -1,2 +0,2 @@

!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((e||self).core={})}(this,function(e){var n=void 0;let t,s=!1;const r="Unnamed state",o=new Set,i=[],a=new Set,c=e=>e.history[e.historyCursor],d=(e,n)=>{const t=e.historyCursor;e.history[t]=n,e.historyCursor=(t+1)%e.history.length},u=e=>e&&o.has(e)?(console.error(`Name ${e} already used! Replaced to undefined`),r):e||r,h=e=>{if("reducer"in e)return e},l=e=>"function"==typeof e,f=e=>{try{const n=c(e);if(((e,n)=>!1===e.hasParentUpdates&&void 0!==n)(e,n))return t&&e.depends.forEach(e=>{t?.add(e)}),n;g(e.isComputing,`Loops dosen't allows. Name: ${e.name??"Unnamed state"}`),i.push(e),e.depends.forEach(n=>{n.childs.delete(e)}),e.depends.clear(),e.isComputing=!0;const s=e.reducer(n??e.initial);return e.isComputing=!1,e.hasParentUpdates=!1,i.pop(),d(e,s),s}catch(e){return void console.error(e.message)}},p=e=>{const n=h(e);try{const s=i.at(-1);return s&&!e.childs.has(s)&&(e.childs.add(s),s.depends.add(e)),n?f(n):c(e)}finally{t&&!n&&t.add(e)}},b=(e,n)=>{const t=l(n)?((e,n)=>n(c(e)))(e,n):n;t!==c(e)&&(d(e,t),m(e),y())},m=e=>{const n=[e];for(;n.length;){const e=n.pop();e.childs.forEach(e=>n.push(e)),e.hasParentUpdates=!0,e.subscribes.size&&a.add(e)}},y=()=>{!1===s&&(s=!0,queueMicrotask(()=>{a.forEach(e=>{try{e.subscribes.forEach(n=>n(p(e)))}catch(n){console.error("Error in subscriber function of:",e.name)}}),a.clear(),s=!1}))},w=(e,n)=>{if(e.subscribes.has(n))return()=>({});const t=h(e);return t&&(f(t),e.depends.forEach(n=>n.childs.add(e))),e.subscribes.add(n),()=>{e.subscribes.delete(n),0===e.subscribes.size&&e.depends.forEach(n=>n.childs.delete(e))}},g=(e,n)=>{if(e)throw new Error(n)};e.action=(e,t)=>({run:function(){return e(...[].slice.call(arguments)),n},name:u(t.name),onAction:t.onAction}),e.computed=(e,n)=>{const t={childs:new Set,depends:new Set,hasParentUpdates:!0,history:Array.from({length:5}),historyCursor:0,initial:n?.initial,isComputing:!1,name:u(n?.name),reducer:e,subscribes:new Set},s=function(){return p(t)};return Object.defineProperty(s,"name",{value:t.name}),s.subscribe=e=>w(t,e),s._internal=t,s},e.flushStates=()=>{const e=t;return t=void 0,e},e.startRecord=()=>{t=new Set},e.state=function(e,n){g(l(e),"Function not allowed in state");const t={childs:new Set,depends:new Set,history:Array.from({length:5}),historyCursor:0,name:u(n?.name),subscribes:new Set,hasParentUpdates:void 0};b(t,e);const s=function(){return p(t)};return Object.defineProperty(s,"name",{value:t.name}),s.subscribe=e=>w(t,e),s.set=e=>b(t,e),s._internal=t,s},e.subscribe=w});
!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((e||self).core={})}(this,function(e){var n=void 0;let s,t=!1;const r="Unnamed state",o=new Set,i=[],a=new Set,d=e=>e.history[e.historyCursor],c=(e,n)=>{e.historyCursor=(e.historyCursor+1)%e.history.length,e.history[e.historyCursor]=n},u=e=>e&&o.has(e)?(console.error(`Name ${e} already used! Replaced to undefined`),r):e||r,h=e=>{if("reducer"in e)return e},l=e=>"function"==typeof e,f=e=>{try{const n=d(e);if(((e,n)=>!1===e.hasParentUpdates&&void 0!==n)(e,n))return s&&e.depends.forEach(e=>{s?.add(e)}),n;g(e.isComputing,`Loops dosen't allows. Name: ${e.name??"Unnamed state"}`),i.push(e),e.depends.forEach(n=>{n.childs.delete(e)}),e.depends.clear(),e.isComputing=!0;const t=e.reducer(n??e.initial);return e.isComputing=!1,e.hasParentUpdates=!1,i.pop(),c(e,t),t}catch(e){return void console.error(e.message)}},p=e=>{const n=h(e);try{const t=i.at(-1);return t&&!e.childs.has(t)&&(e.childs.add(t),t.depends.add(e)),n?f(n):d(e)}finally{s&&!n&&s.add(e)}},b=(e,n)=>{const s=l(n)?((e,n)=>n(d(e)))(e,n):n;s!==d(e)&&(c(e,s),m(e),y())},m=e=>{const n=[e];for(;n.length;){const e=n.pop();e.childs.forEach(e=>n.push(e)),e.hasParentUpdates=!0,e.subscribes.size&&a.add(e)}},y=()=>{!1===t&&(t=!0,queueMicrotask(()=>{a.forEach(e=>{try{e.subscribes.forEach(n=>n(p(e)))}catch(n){console.error("Error in subscriber function of:",e.name)}}),a.clear(),t=!1}))},w=(e,n)=>{if(e.subscribes.has(n))return()=>({});const s=h(e);return s&&(f(s),e.depends.forEach(n=>n.childs.add(e))),e.subscribes.add(n),()=>{e.subscribes.delete(n),0===e.subscribes.size&&e.depends.forEach(n=>n.childs.delete(e))}},g=(e,n)=>{if(e)throw new Error(n)};e.action=(e,s)=>({run:function(){return e(...[].slice.call(arguments)),n},name:u(s?.name),onAction:s?.onAction}),e.computed=(e,n)=>{const s={childs:new Set,depends:new Set,hasParentUpdates:!0,history:Array.from({length:5}),historyCursor:-1,initial:n?.initial,isComputing:!1,name:u(n?.name),reducer:e,subscribes:new Set},t=function(){return p(s)};return Object.defineProperty(t,"name",{value:s.name}),t.subscribe=e=>w(s,e),t._internal=s,t},e.flushStates=()=>{const e=s;return s=void 0,e},e.startRecord=()=>{s=new Set},e.state=function(e,n){g(l(e),"Function not allowed in state");const s={childs:new Set,depends:new Set,history:Array.from({length:5}),historyCursor:-1,name:u(n?.name),subscribes:new Set,hasParentUpdates:void 0};b(s,e);const t=function(){return p(s)};return Object.defineProperty(t,"name",{value:s.name}),t.subscribe=e=>w(s,e),t.set=e=>b(s,e),t._internal=s,t},e.subscribe=w});
//# sourceMappingURL=index.umd.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"index.umd.js","sources":["../src/core.ts"],"sourcesContent":["import {\r\n ComputedInternal,\r\n Listner,\r\n StateType,\r\n Settings,\r\n StateVariants,\r\n Action,\r\n Options,\r\n ComputedInternalOptions,\r\n Nullable,\r\n StatlessFunc,\r\n GetStatlessFunc,\r\n HistoryInternal,\r\n State,\r\n Computed,\r\n Func,\r\n UnSubscribe,\r\n CommonInternal,\r\n StateInternal,\r\n SetterFunc,\r\n ActionOptions,\r\n} from './types.js'\r\n\r\nlet isNotifying = false\r\nlet isActionNow = false\r\nlet recording: Set<StateInternal> | undefined\r\n\r\nconst defaultName = 'Unnamed state'\r\nconst names = new Set()\r\nconst requesters: ComputedInternal[] = []\r\nconst states2notify = new Set<StateVariants>()\r\nconst settings: Settings = {\r\n historyLength: 5,\r\n}\r\n\r\nexport const getHistoryValue = (state: StateVariants): unknown => {\r\n return state.history[state.historyCursor]\r\n}\r\nconst pushHistory = <T extends HistoryInternal>(state: T, value: unknown) => {\r\n const cursorHistory = state.historyCursor\r\n state.history[cursorHistory] = value\r\n state.historyCursor = (cursorHistory + 1) % state.history.length\r\n}\r\n\r\nconst getName = (name?: string): string => {\r\n if (name && names.has(name)) {\r\n console.error(`Name ${name} already used! Replaced to undefined`)\r\n return defaultName\r\n }\r\n if (name) {\r\n return name\r\n }\r\n return defaultName\r\n}\r\n\r\nexport const setSetting = (data: Partial<Settings>) => {\r\n Object.assign(settings, data)\r\n}\r\n\r\nconst getComputed = (state: CommonInternal | ComputedInternal) => {\r\n if ('reducer' in state) {\r\n return state\r\n }\r\n}\r\n\r\nconst isFunction = (v: unknown): v is Func => {\r\n return typeof v === 'function'\r\n}\r\n\r\nconst isDontNeedRecalc = (state: CommonInternal, prevState: unknown): boolean => {\r\n return state.hasParentUpdates === false && prevState !== undefined\r\n}\r\n\r\nconst getComputedValue = (state: ComputedInternal): unknown => {\r\n try {\r\n const prevState = getHistoryValue(state)\r\n\r\n if (isDontNeedRecalc(state, prevState)) {\r\n if (recording) {\r\n state.depends.forEach((item) => {\r\n recording?.add(item)\r\n })\r\n }\r\n return prevState\r\n }\r\n\r\n assert(state.isComputing, `Loops dosen't allows. Name: ${state.name ?? 'Unnamed state'}`)\r\n\r\n requesters.push(state)\r\n state.depends.forEach((item) => {\r\n item.childs.delete(state)\r\n })\r\n state.depends.clear()\r\n state.isComputing = true\r\n const value = state.reducer(prevState ?? state.initial)\r\n state.isComputing = false\r\n state.hasParentUpdates = false\r\n\r\n requesters.pop()\r\n pushHistory(state, value)\r\n\r\n return value\r\n } catch (e) {\r\n console.error((e as Error).message)\r\n return undefined\r\n }\r\n}\r\n\r\nconst getValue = (state: CommonInternal) => {\r\n const reducer = getComputed(state)\r\n try {\r\n const lastRequester = requesters.at(-1)\r\n if (lastRequester && !state.childs.has(lastRequester)) {\r\n state.childs.add(lastRequester)\r\n lastRequester.depends.add(state)\r\n }\r\n if (reducer) {\r\n return getComputedValue(reducer)\r\n }\r\n return getHistoryValue(state)\r\n } finally {\r\n if (recording && !reducer) {\r\n recording.add(state)\r\n }\r\n }\r\n}\r\n\r\nconst getValueOfSetterFunction = (state: CommonInternal, value: SetterFunc): unknown => {\r\n const prevValue = getHistoryValue(state)\r\n return value(prevValue)\r\n}\r\n\r\nconst setValue = (state: CommonInternal, value: unknown): void => {\r\n const newValue = isFunction(value) ? getValueOfSetterFunction(state, value) : value\r\n\r\n if (newValue === getHistoryValue(state)) {\r\n return\r\n }\r\n pushHistory(state, newValue)\r\n invalidateSubtree(state)\r\n notifySubscribers()\r\n}\r\n\r\n/**\r\n * Mark all subtree is non actual.\r\n * Collect all nodes to notify subscribers im microtask queue.\r\n */\r\nconst invalidateSubtree = (state: CommonInternal) => {\r\n const stack: CommonInternal[] = [state]\r\n\r\n while (stack.length) {\r\n const st = stack.pop()\r\n st.childs.forEach((it) => stack.push(it))\r\n st.hasParentUpdates = true\r\n if (st.subscribes.size) {\r\n states2notify.add(st)\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Notify all collected subscribers once in microtask queue\r\n */\r\nconst notifySubscribers = () => {\r\n if (isNotifying === false) {\r\n isNotifying = true\r\n queueMicrotask(() => {\r\n // Нужно обновить дерево\r\n states2notify.forEach((state) => {\r\n try {\r\n state.subscribes.forEach((listner) => {\r\n return listner(getValue(state))\r\n })\r\n } catch (e) {\r\n console.error('Error in subscriber function of:', state.name)\r\n }\r\n })\r\n states2notify.clear()\r\n isNotifying = false\r\n })\r\n }\r\n}\r\n\r\n/**\r\n * Start collecting all non computed states.\r\n *\r\n * Helper for render adapters.\r\n */\r\nexport const startRecord = () => {\r\n recording = new Set()\r\n}\r\n\r\n/**\r\n * Flush all collected non computed states.\r\n */\r\nexport const flushStates = (): Set<StateInternal> => {\r\n const data = recording\r\n recording = undefined\r\n return data\r\n}\r\n\r\nexport const subscribe = (state: CommonInternal | CommonInternal, listner: Listner): UnSubscribe => {\r\n /**\r\n * Если значение стейта ниразу не расчитывалось, его нужно обновить\r\n * Если подписываемся на вычисляемый стэйт, то нужно узнать всех родителей\r\n * Родители могут меняться, поэтому после каждого вычисления нужно обновлять зависимости дерева\r\n *\r\n * При отписке нужно оповестить всех на кого были опдписанты о том что мы отписались\r\n *\r\n */\r\n\r\n if (state.subscribes.has(listner)) {\r\n return () => ({})\r\n }\r\n\r\n const computedState = getComputed(state)\r\n // Нужно актуализировать в родилеях зависимость\r\n if (computedState) {\r\n getComputedValue(computedState)\r\n state.depends.forEach((parent) => parent.childs.add(state))\r\n }\r\n\r\n state.subscribes.add(listner)\r\n\r\n return () => {\r\n state.subscribes.delete(listner)\r\n if (state.subscribes.size === 0) {\r\n state.depends.forEach((parent) => parent.childs.delete(state))\r\n }\r\n }\r\n}\r\n\r\nconst assert = (condtion: boolean, msg: string) => {\r\n if (condtion) {\r\n throw new Error(msg)\r\n }\r\n}\r\n\r\n/**\r\n *\r\n * @param value - Reducer or value\r\n * @param name - name of state. For loggin or easy debug\r\n * @returns State<T>\r\n */\r\nexport function state<T extends StateType = StateType>(value: T, options?: Options): State<T> {\r\n assert(isFunction(value), 'Function not allowed in state')\r\n\r\n const data: CommonInternal = {\r\n childs: new Set(),\r\n depends: new Set(),\r\n history: Array.from({length: settings.historyLength}),\r\n historyCursor: 0,\r\n name: getName(options?.name),\r\n subscribes: new Set(),\r\n hasParentUpdates: undefined,\r\n }\r\n\r\n setValue(data, value)\r\n\r\n const publicApi = function () {\r\n return getValue(data)\r\n }\r\n\r\n Object.defineProperty(publicApi, 'name', {value: data.name})\r\n publicApi.subscribe = (listner: Listner) => subscribe(data, listner)\r\n publicApi.set = (value: T) => setValue(data, value)\r\n publicApi._internal = data\r\n\r\n return publicApi as State<T>\r\n}\r\n\r\nexport const computed = <\r\n T extends StateType = -1,\r\n S extends StatlessFunc<T> = StatlessFunc<T>,\r\n O extends Nullable<ComputedInternalOptions> = Nullable<ComputedInternalOptions>,\r\n>(\r\n value: GetStatlessFunc<T, S, O>,\r\n options?: O,\r\n): Computed<T> => {\r\n const data: ComputedInternal = {\r\n childs: new Set(),\r\n depends: new Set(),\r\n hasParentUpdates: true,\r\n history: Array.from({length: settings.historyLength}),\r\n historyCursor: 0,\r\n initial: options?.initial as ReturnType<typeof value> | undefined,\r\n isComputing: false,\r\n name: getName(options?.name),\r\n reducer: value,\r\n subscribes: new Set(),\r\n }\r\n\r\n const publicApi = function () {\r\n return getValue(data)\r\n }\r\n\r\n Object.defineProperty(publicApi, 'name', {value: data.name})\r\n publicApi.subscribe = (listner: Listner<T>) => subscribe(data, listner as Listner)\r\n publicApi._internal = data\r\n\r\n return publicApi as Computed<T>\r\n}\r\n\r\n/**\r\n * ## Action state\r\n *\r\n * @param value - Action function\r\n * @param name\r\n */\r\nexport const action = <T extends unknown[]>(\r\n value: (...args: T) => void,\r\n options?: ActionOptions,\r\n): Action<T> => {\r\n return {\r\n run: (...args: T) => {\r\n isActionNow = true\r\n value(...args)\r\n isActionNow = false\r\n return this\r\n },\r\n name: getName(options.name),\r\n onAction: options.onAction,\r\n }\r\n}\r\n"],"names":["_this","this","recording","isNotifying","names","Set","requesters","states2notify","getHistoryValue","state","history","historyCursor","pushHistory","value","cursorHistory","length","getName","name","has","console","error","defaultName","isFunction","v","prevState","hasParentUpdates","undefined","isDontNeedRecalc","depends","forEach","item","add","assert","isComputing","push","childs","delete","clear","reducer","initial","pop","e","message","getValue","getComputed","lastRequester","at","getComputedValue","setValue","newValue","getValueOfSetterFunction","invalidateSubtree","notifySubscribers","stack","st","it","subscribes","size","queueMicrotask","listner","subscribe","computedState","parent","condtion","msg","Error","options","run","slice","call","arguments","onAction","data","Array","from","publicApi","Object","defineProperty","_internal","set"],"mappings":"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"}
{"version":3,"file":"index.umd.js","sources":["../src/core.ts"],"sourcesContent":["import {\r\n ComputedInternal,\r\n Listner,\r\n StateType,\r\n Settings,\r\n StateVariants,\r\n Action,\r\n Options,\r\n ComputedInternalOptions,\r\n Nullable,\r\n StatlessFunc,\r\n GetStatlessFunc,\r\n HistoryInternal,\r\n State,\r\n Computed,\r\n Func,\r\n UnSubscribe,\r\n CommonInternal,\r\n StateInternal,\r\n SetterFunc,\r\n ActionOptions,\r\n} from './types.js'\r\n\r\nlet isNotifying = false\r\nlet isActionNow = false\r\nlet recording: Set<StateInternal> | undefined\r\n\r\nconst defaultName = 'Unnamed state'\r\nconst names = new Set()\r\nconst requesters: ComputedInternal[] = []\r\nconst states2notify = new Set<StateVariants>()\r\nconst settings: Settings = {\r\n historyLength: 5,\r\n}\r\n\r\nexport const getHistoryValue = (state: StateVariants): unknown => {\r\n return state.history[state.historyCursor]\r\n}\r\nconst pushHistory = <T extends HistoryInternal>(state: T, value: unknown) => {\r\n const cursorHistory = state.historyCursor\r\n state.historyCursor = (cursorHistory + 1) % state.history.length\r\n state.history[state.historyCursor] = value\r\n}\r\n\r\nconst getName = (name?: string): string => {\r\n if (name && names.has(name)) {\r\n console.error(`Name ${name} already used! Replaced to undefined`)\r\n return defaultName\r\n }\r\n if (name) {\r\n return name\r\n }\r\n return defaultName\r\n}\r\n\r\nexport const setSetting = (data: Partial<Settings>) => {\r\n Object.assign(settings, data)\r\n}\r\n\r\nconst getComputed = (state: CommonInternal | ComputedInternal) => {\r\n if ('reducer' in state) {\r\n return state\r\n }\r\n}\r\n\r\nconst isFunction = (v: unknown): v is Func => {\r\n return typeof v === 'function'\r\n}\r\n\r\nconst isDontNeedRecalc = (state: CommonInternal, prevState: unknown): boolean => {\r\n return state.hasParentUpdates === false && prevState !== undefined\r\n}\r\n\r\nconst getComputedValue = (state: ComputedInternal): unknown => {\r\n try {\r\n const prevState = getHistoryValue(state)\r\n\r\n if (isDontNeedRecalc(state, prevState)) {\r\n if (recording) {\r\n state.depends.forEach((item) => {\r\n recording?.add(item)\r\n })\r\n }\r\n return prevState\r\n }\r\n\r\n assert(state.isComputing, `Loops dosen't allows. Name: ${state.name ?? 'Unnamed state'}`)\r\n\r\n requesters.push(state)\r\n state.depends.forEach((item) => {\r\n item.childs.delete(state)\r\n })\r\n state.depends.clear()\r\n state.isComputing = true\r\n const value = state.reducer(prevState ?? state.initial)\r\n state.isComputing = false\r\n state.hasParentUpdates = false\r\n\r\n requesters.pop()\r\n pushHistory(state, value)\r\n\r\n return value\r\n } catch (e) {\r\n console.error((e as Error).message)\r\n return undefined\r\n }\r\n}\r\n\r\nconst getValue = (state: CommonInternal) => {\r\n const reducer = getComputed(state)\r\n try {\r\n const lastRequester = requesters.at(-1)\r\n if (lastRequester && !state.childs.has(lastRequester)) {\r\n state.childs.add(lastRequester)\r\n lastRequester.depends.add(state)\r\n }\r\n if (reducer) {\r\n return getComputedValue(reducer)\r\n }\r\n return getHistoryValue(state)\r\n } finally {\r\n if (recording && !reducer) {\r\n recording.add(state)\r\n }\r\n }\r\n}\r\n\r\nconst getValueOfSetterFunction = (state: CommonInternal, value: SetterFunc): unknown => {\r\n const prevValue = getHistoryValue(state)\r\n return value(prevValue)\r\n}\r\n\r\nconst setValue = (state: CommonInternal, value: unknown): void => {\r\n const newValue = isFunction(value) ? getValueOfSetterFunction(state, value) : value\r\n\r\n if (newValue === getHistoryValue(state)) {\r\n return\r\n }\r\n pushHistory(state, newValue)\r\n invalidateSubtree(state)\r\n notifySubscribers()\r\n}\r\n\r\n/**\r\n * Mark all subtree is non actual.\r\n * Collect all nodes to notify subscribers im microtask queue.\r\n */\r\nconst invalidateSubtree = (state: CommonInternal) => {\r\n const stack: CommonInternal[] = [state]\r\n\r\n while (stack.length) {\r\n const st = stack.pop()\r\n st.childs.forEach((it) => stack.push(it))\r\n st.hasParentUpdates = true\r\n if (st.subscribes.size) {\r\n states2notify.add(st)\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Notify all collected subscribers once in microtask queue\r\n */\r\nconst notifySubscribers = () => {\r\n if (isNotifying === false) {\r\n isNotifying = true\r\n queueMicrotask(() => {\r\n // Нужно обновить дерево\r\n states2notify.forEach((state) => {\r\n try {\r\n state.subscribes.forEach((listner) => {\r\n return listner(getValue(state))\r\n })\r\n } catch (e) {\r\n console.error('Error in subscriber function of:', state.name)\r\n }\r\n })\r\n states2notify.clear()\r\n isNotifying = false\r\n })\r\n }\r\n}\r\n\r\n/**\r\n * Start collecting all non computed states.\r\n *\r\n * Helper for render adapters.\r\n */\r\nexport const startRecord = () => {\r\n recording = new Set()\r\n}\r\n\r\n/**\r\n * Flush all collected non computed states.\r\n */\r\nexport const flushStates = (): Set<StateInternal> => {\r\n const data = recording\r\n recording = undefined\r\n return data\r\n}\r\n\r\nexport const subscribe = (state: CommonInternal | CommonInternal, listner: Listner): UnSubscribe => {\r\n /**\r\n * Если значение стейта ниразу не расчитывалось, его нужно обновить\r\n * Если подписываемся на вычисляемый стэйт, то нужно узнать всех родителей\r\n * Родители могут меняться, поэтому после каждого вычисления нужно обновлять зависимости дерева\r\n *\r\n * При отписке нужно оповестить всех на кого были опдписанты о том что мы отписались\r\n *\r\n */\r\n\r\n if (state.subscribes.has(listner)) {\r\n return () => ({})\r\n }\r\n\r\n const computedState = getComputed(state)\r\n // Нужно актуализировать в родилеях зависимость\r\n if (computedState) {\r\n getComputedValue(computedState)\r\n state.depends.forEach((parent) => parent.childs.add(state))\r\n }\r\n\r\n state.subscribes.add(listner)\r\n\r\n return () => {\r\n state.subscribes.delete(listner)\r\n if (state.subscribes.size === 0) {\r\n state.depends.forEach((parent) => parent.childs.delete(state))\r\n }\r\n }\r\n}\r\n\r\nconst assert = (condtion: boolean, msg: string) => {\r\n if (condtion) {\r\n throw new Error(msg)\r\n }\r\n}\r\n\r\n/**\r\n *\r\n * @param value - Reducer or value\r\n * @param name - name of state. For loggin or easy debug\r\n * @returns State<T>\r\n */\r\nexport function state<T extends StateType = StateType>(value: T, options?: Options): State<T> {\r\n assert(isFunction(value), 'Function not allowed in state')\r\n\r\n const data: CommonInternal = {\r\n childs: new Set(),\r\n depends: new Set(),\r\n history: Array.from({length: settings.historyLength}),\r\n historyCursor: -1,\r\n name: getName(options?.name),\r\n subscribes: new Set(),\r\n hasParentUpdates: undefined,\r\n }\r\n\r\n setValue(data, value)\r\n\r\n const publicApi = function () {\r\n return getValue(data)\r\n }\r\n\r\n Object.defineProperty(publicApi, 'name', {value: data.name})\r\n publicApi.subscribe = (listner: Listner) => subscribe(data, listner)\r\n publicApi.set = (value: T) => setValue(data, value)\r\n publicApi._internal = data\r\n\r\n return publicApi as State<T>\r\n}\r\n\r\nexport const computed = <\r\n T extends StateType = -1,\r\n S extends StatlessFunc<T> = StatlessFunc<T>,\r\n O extends Nullable<ComputedInternalOptions> = Nullable<ComputedInternalOptions>,\r\n>(\r\n value: GetStatlessFunc<T, S, O>,\r\n options?: O,\r\n): Computed<T> => {\r\n const data: ComputedInternal = {\r\n childs: new Set(),\r\n depends: new Set(),\r\n hasParentUpdates: true,\r\n history: Array.from({length: settings.historyLength}),\r\n historyCursor: -1,\r\n initial: options?.initial as ReturnType<typeof value> | undefined,\r\n isComputing: false,\r\n name: getName(options?.name),\r\n reducer: value,\r\n subscribes: new Set(),\r\n }\r\n\r\n const publicApi = function () {\r\n return getValue(data)\r\n }\r\n\r\n Object.defineProperty(publicApi, 'name', {value: data.name})\r\n publicApi.subscribe = (listner: Listner<T>) => subscribe(data, listner as Listner)\r\n publicApi._internal = data\r\n\r\n return publicApi as Computed<T>\r\n}\r\n\r\n/**\r\n * ## Action state\r\n *\r\n * @param value - Action function\r\n * @param name\r\n */\r\nexport const action = <T extends unknown[]>(\r\n value: (...args: T) => void,\r\n options?: ActionOptions,\r\n): Action<T> => {\r\n return {\r\n run: (...args: T) => {\r\n isActionNow = true\r\n value(...args)\r\n isActionNow = false\r\n return this\r\n },\r\n name: getName(options?.name),\r\n onAction: options?.onAction,\r\n }\r\n}\r\n"],"names":["_this","this","recording","isNotifying","names","Set","requesters","states2notify","getHistoryValue","state","history","historyCursor","pushHistory","value","length","getName","name","has","console","error","defaultName","getComputed","isFunction","v","getComputedValue","prevState","hasParentUpdates","undefined","isDontNeedRecalc","depends","forEach","item","add","assert","isComputing","push","childs","delete","clear","reducer","initial","pop","e","message","getValue","lastRequester","at","setValue","newValue","getValueOfSetterFunction","invalidateSubtree","notifySubscribers","stack","st","it","subscribes","size","queueMicrotask","listner","subscribe","computedState","parent","condtion","msg","Error","options","run","slice","call","arguments","onAction","data","Array","from","publicApi","Object","defineProperty","_internal","set"],"mappings":"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"}
{
"name": "@statx/core",
"version": "1.0.21",
"version": "1.0.22",
"private": false,

@@ -70,3 +70,3 @@ "description": "Extry tiny smart state manager",

},
"gitHead": "d8792ab9683c4bbd679aec3c62803f855c62d082"
"gitHead": "fcb5d6aeacb7fa771bd5075d26f3db848128cf18"
}

@@ -305,4 +305,3 @@ import {

/**
* ## Action state
*
* Action state
* @param value - Action function

@@ -309,0 +308,0 @@ * @param name