{"version":3,"file":"index.umd.cjs","sources":["../../lib/store/comparator.ts","../../lib/store/store.ts"],"sourcesContent":["\nexport function lengthEqual(a: any[], b: any[]): boolean {\n    return a.length === b.length;\n}\n\nexport function deepEqual(a: any, b: any): boolean {\n    return JSON.stringify(a) === JSON.stringify(b);\n}\n\nexport function shallowEqual(a: any, b: any): boolean {\n    return a === b;\n}","import logger from \"@/common/logger/logger\";\nimport { Signal, createSignal } from \"@/core/signal\";\nimport { shallowEqual } from \"./comparator\";\nimport type { Middleware, Selector, StoreOptions, Comparator, IStore, StoreWithFunctions } from \"./types\";\n\nconst defaultComparator = shallowEqual;\n\n/**\n * Store is a class that holds the state of the application and notifies subscribers when the state changes.\n * \n * @example\n * const store = new Store({ count: 0 });\n * store.subscribe(state => console.log(state.count));\n * store.setState({ count: 1 });\n * // console logs:\n * // > 1\n * @example\n * const store = new Store({ count: 0 });\n * const count$ = store.select(state => state.count);\n * count$.subscribe(count => console.log(count));\n * count$.setValue((prevCount) => prevCount + 1);\n * // console logs:\n * // > 1\n */\nexport class Store<T> implements IStore<T> {\n    private state: T;\n    private signals: Map<Selector<T, unknown>, {\n        signal: Signal<unknown>,\n        comparator: Comparator<unknown>,\n    }> = new Map();\n    private middlewares: Middleware<T>[] = [];\n\n    constructor(\n        initialStateOrFactory: (T | ((store: Store<T>) => T)), \n        middlewares: Middleware<T>[] = [],\n        _options: StoreOptions = { }\n    ) {\n\n        this.state = initialStateOrFactory instanceof Function ? \n            initialStateOrFactory(this) : initialStateOrFactory;\n        this.middlewares = middlewares;\n    }\n\n    getState(): T {\n        return this.state;\n    }\n\n    setState(newStateOrSetter: Partial<T> | ((state: T) => Partial<T>)){\n        const newState = \n            typeof newStateOrSetter === 'function' ? newStateOrSetter(this.state) : newStateOrSetter;\n        this.middlewares.forEach(middleware => middleware(this.state, newState, this));\n        const updatedState = { ...this.state, ...newState };\n        this.state = updatedState;\n        this.notify();\n    }\n\n    select<U>(selector: Selector<T, U>, comparator?: Comparator<U>): Signal<U> {\n        if (!this.signals.has(selector)) {\n            const [signal, ] = createSignal<unknown>(selector(this.state), { id: `store-${this.signals.size}` });\n            this.signals.set(selector, { \n                signal, \n                comparator: comparator as Comparator<unknown> || defaultComparator\n            });\n        }\n        const { signal } = this.signals.get(selector) || {};\n        if(!signal) {\n            throw new Error('Signal not found');\n        }\n        return signal as Signal<U>;\n    }\n\n    subscribe<U>(selector: Selector<T, U>, listener: (value: U) => void, comparator: Comparator<U> = defaultComparator) {\n        const signal = this.select(selector, comparator);\n        signal.subscribe(listener);\n    }\n\n    notify() {\n        const newState = this.state;\n        this.signals.forEach(({signal, comparator}, selector) => {\n            if (comparator(selector(newState), signal.value)) return;\n            signal.setValue(selector(newState));\n        });\n    }\n\n    accessStateFunctionsWithStore(): StoreWithFunctions<T> {\n        this.#embedStateFunctions();\n        return this as unknown as StoreWithFunctions<T>;\n    }\n\n    #embedStateFunctions() {\n        const initialState = this.state;\n        const self: any = this;\n        for (const key in initialState) {\n            const value = initialState[key];\n            if (typeof value === 'function') {\n                if(!(key in this)) {\n                    self[key] = value.bind(initialState);\n                } else {\n                    logger.warn(`Store already has a property named ${key}, skipping embedding function`);\n                }\n            }\n        }\n    }\n}"],"names":["lengthEqual","a","b","deepEqual","shallowEqual","defaultComparator","Store","initialStateOrFactory","middlewares","_options","__privateAdd","_Store_instances","__publicField","newStateOrSetter","newState","middleware","updatedState","selector","comparator","signal","createSignal","listener","__privateMethod","embedStateFunctions_fn","initialState","self","key","value","logger"],"mappings":"8iBACgB,SAAAA,EAAYC,EAAUC,EAAmB,CAC9C,OAAAD,EAAE,SAAWC,EAAE,MAC1B,CAEgB,SAAAC,EAAUF,EAAQC,EAAiB,CAC/C,OAAO,KAAK,UAAUD,CAAC,IAAM,KAAK,UAAUC,CAAC,CACjD,CAEgB,SAAAE,EAAaH,EAAQC,EAAiB,CAClD,OAAOD,IAAMC,CACjB,CCNA,MAAMG,EAAoBD,UAmBnB,MAAME,CAA8B,CAQvC,YACIC,EACAC,EAA+B,CAAA,EAC/BC,EAAyB,CAAA,EAC3B,CAZCC,EAAA,KAAAC,GACKC,EAAA,cACAA,EAAA,mBAGC,KACDA,EAAA,mBAA+B,CAAC,GAQpC,KAAK,MAAQL,aAAiC,SAC1CA,EAAsB,IAAI,EAAIA,EAClC,KAAK,YAAcC,CAAA,CAGvB,UAAc,CACV,OAAO,KAAK,KAAA,CAGhB,SAASK,EAA0D,CAC/D,MAAMC,EACF,OAAOD,GAAqB,WAAaA,EAAiB,KAAK,KAAK,EAAIA,EACvE,KAAA,YAAY,QAAsBE,GAAAA,EAAW,KAAK,MAAOD,EAAU,IAAI,CAAC,EAC7E,MAAME,EAAe,CAAE,GAAG,KAAK,MAAO,GAAGF,CAAS,EAClD,KAAK,MAAQE,EACb,KAAK,OAAO,CAAA,CAGhB,OAAUC,EAA0BC,EAAuC,CACvE,GAAI,CAAC,KAAK,QAAQ,IAAID,CAAQ,EAAG,CAC7B,KAAM,CAACE,CAAQ,EAAIC,EAAAA,aAAsBH,EAAS,KAAK,KAAK,EAAG,CAAE,GAAI,SAAS,KAAK,QAAQ,IAAI,GAAI,EAC9F,KAAA,QAAQ,IAAIA,EAAU,CACvB,OAAAE,EACA,WAAYD,GAAqCb,CAAA,CACpD,CAAA,CAEC,KAAA,CAAA,OAAEc,GAAW,KAAK,QAAQ,IAAIF,CAAQ,GAAK,CAAC,EAClD,GAAG,CAACE,EACM,MAAA,IAAI,MAAM,kBAAkB,EAE/B,OAAAA,CAAA,CAGX,UAAaF,EAA0BI,EAA8BH,EAA4Bb,EAAmB,CACjG,KAAK,OAAOY,EAAUC,CAAU,EACxC,UAAUG,CAAQ,CAAA,CAG7B,QAAS,CACL,MAAMP,EAAW,KAAK,MACtB,KAAK,QAAQ,QAAQ,CAAC,CAAC,OAAAK,EAAQ,WAAAD,GAAaD,IAAa,CACjDC,EAAWD,EAASH,CAAQ,EAAGK,EAAO,KAAK,GACxCA,EAAA,SAASF,EAASH,CAAQ,CAAC,CAAA,CACrC,CAAA,CAGL,+BAAuD,CACnD,OAAAQ,EAAA,KAAKX,EAAAY,GAAL,WACO,IAAA,CAiBf,CA/EOZ,EAAA,YAiEHY,EAAuB,UAAA,CACnB,MAAMC,EAAe,KAAK,MACpBC,EAAY,KAClB,UAAWC,KAAOF,EAAc,CACtB,MAAAG,EAAQH,EAAaE,CAAG,EAC1B,OAAOC,GAAU,aACZD,KAAO,KAGDE,EAAAA,OAAA,KAAK,sCAAsCF,CAAG,+BAA+B,EAFpFD,EAAKC,CAAG,EAAIC,EAAM,KAAKH,CAAY,EAI3C,CACJ"}