{"version":3,"file":"index.mjs","sources":["../src/hooks.ts","../src/useObserver.ts","../src/useTransitionObserver.ts"],"sourcesContent":["import { useEffect, useMemo, useRef } from \"react\";\nimport { computed, observable, Reaction, ReactionFn } from \"onek\";\n\nconst EMPTY_ARR = [] as const;\n\nexport function useObservable<T>(value: T) {\n    return useMemo(() => observable(value), EMPTY_ARR);\n}\n\nexport function useComputed<T>(fn: () => T, deps: readonly any[] = EMPTY_ARR) {\n    const fnRef = useRef(fn);\n\n    fnRef.current = fn;\n\n    return useMemo(() => {\n        return computed(() => fnRef.current());\n    }, deps);\n}\n\nexport function useReaction(body: ReactionFn, deps: readonly any[] = EMPTY_ARR) {\n    const bodyRef = useRef(body);\n\n    bodyRef.current = body;\n\n    const r = useMemo(() => {\n        return new Reaction(() => bodyRef.current());\n    }, []);\n\n    useEffect(() => {\n        r.run();\n\n        return () => {\n            r.destroy();\n        };\n    }, deps);\n}\n","import { useMemo, useSyncExternalStore } from \"react\";\nimport { Reaction, Revision, setSubscriber, SubscriberBase } from \"onek\";\n\ntype NotifyFn = () => void;\ntype UnsubscribeFn = () => void;\n\nexport interface IObserver extends SubscriberBase {\n    <T>(callback: () => T): T;\n}\n\nconst isInBrowser = typeof window !== \"undefined\";\n\nconst EMPTY_ARRAY = [] as const;\nconst NOOP = (value?: any) => value;\n\nconst NOOP_OBSERVER: IObserver = (callback) => callback();\nNOOP_OBSERVER.addSubscription = NOOP;\n\nexport function useObserver(): IObserver {\n    if (!isInBrowser) {\n        return NOOP_OBSERVER;\n    }\n\n    const store = useMemo(() => {\n        let revision = new Revision();\n        let subscribers = new Set<NotifyFn>();\n\n        const reaction = new Reaction(NOOP, () => {\n            revision = new Revision();\n\n            subscribers.forEach((notify) => {\n                notify();\n            });\n        });\n\n        reaction.shouldSubscribe = false;\n\n        const observer: IObserver = (callback) => {\n            const oldSubscriber = setSubscriber(reaction);\n\n            try {\n                return callback();\n            } finally {\n                setSubscriber(oldSubscriber);\n            }\n        };\n\n        observer.addSubscription = reaction.addSubscription.bind(reaction);\n\n        return {\n            _subscribe(notify: NotifyFn): UnsubscribeFn {\n                if (!subscribers.size) {\n                    reaction.shouldSubscribe = true;\n\n                    reaction.subscribe();\n                }\n\n                subscribers.add(notify);\n\n                return () => {\n                    subscribers.delete(notify);\n\n                    if (!subscribers.size) {\n                        reaction.unsubscribe();\n\n                        reaction.shouldSubscribe = false;\n                    }\n                };\n            },\n            _getRevision() {\n                if (!subscribers.size && reaction.missedRun()) {\n                    reaction.updateRevisions();\n\n                    revision = new Revision();\n                }\n                return revision;\n            },\n            _onBeforeRender() {\n                reaction.unsubscribeAndCleanup();\n            },\n            _observer: observer,\n        };\n    }, EMPTY_ARRAY);\n\n    useSyncExternalStore(store._subscribe, store._getRevision);\n\n    store._onBeforeRender();\n\n    return store._observer;\n}\n","import { useEffect, useMemo, useRef, useState, useTransition } from \"react\";\nimport { Reaction } from \"onek\";\n\nexport function useTransitionObserver<T>(fn: () => T) {\n    const [isPending, startTransition] = useTransition();\n\n    const fnRef = useRef(fn);\n\n    fnRef.current = fn;\n\n    let value: T;\n\n    const r = useMemo(() => {\n        const reaction = new Reaction(\n            () => {\n                value = fnRef.current();\n            },\n            () => {\n                reaction.run();\n\n                startTransition(() => {\n                    setTransitionValue(value!);\n                });\n            }\n        );\n\n        reaction.shouldSubscribe = false;\n\n        return reaction;\n    }, []);\n\n    useEffect(() => {\n        r.shouldSubscribe = true;\n\n        if (r.missedRun()) {\n            r.runManager();\n        } else {\n            r.subscribe();\n        }\n\n        return () => {\n            r.destroy();\n            r.shouldSubscribe = false;\n        };\n    }, [r]);\n\n    const [transitionValue, setTransitionValue] = useState<T>(() => {\n        r.run();\n\n        return value;\n    });\n\n    return [isPending, transitionValue] as const;\n}\n"],"names":["EMPTY_ARR","useObservable","value","useMemo","observable","useComputed","fn","deps","fnRef","useRef","current","computed","useReaction","body","bodyRef","r","Reaction","useEffect","run","destroy","isInBrowser","window","EMPTY_ARRAY","NOOP","NOOP_OBSERVER","callback","useObserver","store","revision","Revision","subscribers","Set","reaction","forEach","notify","shouldSubscribe","observer","oldSubscriber","setSubscriber","addSubscription","bind","_subscribe","size","subscribe","add","delete","unsubscribe","_getRevision","missedRun","updateRevisions","_onBeforeRender","unsubscribeAndCleanup","_observer","useSyncExternalStore","useTransitionObserver","isPending","startTransition","useTransition","setTransitionValue","runManager","transitionValue","useState"],"mappings":"qNAGA,MAAMA,EAAY,GAEF,SAAAC,EAAiBC,GAC7B,OAAOC,EAAQ,IAAMC,EAAWF,GAAQF,EAC5C,CAEgB,SAAAK,EAAeC,EAAaC,EAAuBP,GAC/D,MAAMQ,EAAQC,EAAOH,GAIrB,OAFAE,EAAME,QAAUJ,EAETH,EAAQ,IACJQ,EAAS,IAAMH,EAAME,WAC7BH,EACP,UAEgBK,EAAYC,EAAkBN,EAAuBP,GACjE,MAAMc,EAAUL,EAAOI,GAEvBC,EAAQJ,QAAUG,EAElB,MAAME,EAAIZ,EAAQ,IACH,IAAAa,EAAS,IAAMF,EAAQJ,WACnC,IAEHO,EAAU,KACNF,EAAEG,MAEK,KACHH,EAAEI,SACN,GACDZ,EACP,CCzBA,MAAMa,EAAgC,oBAAXC,OAErBC,EAAc,GACdC,EAAQrB,GAAgBA,EAExBsB,EAA4BC,GAAaA,IAG/B,SAAAC,IACZ,IAAKN,EACD,OAAOI,EAGX,MAAMG,EAAQxB,EAAQ,KAClB,IAAIyB,EAAW,IAAIC,EACfC,EAAc,IAAIC,IAEtB,MAAMC,EAAW,IAAIhB,EAASO,EAAM,KAChCK,EAAW,IAAIC,EAEfC,EAAYG,QAASC,IACjBA,GACJ,EACJ,GAEAF,EAASG,iBAAkB,EAE3B,MAAMC,EAAuBX,IACzB,MAAMY,EAAgBC,EAAcN,GAEpC,IACI,OAAOP,GACX,CAAC,QACGa,EAAcD,EAClB,GAKJ,OAFAD,EAASG,gBAAkBP,EAASO,gBAAgBC,KAAKR,GAElD,CACHS,EAAWP,IACFJ,EAAYY,OACbV,EAASG,iBAAkB,EAE3BH,EAASW,aAGbb,EAAYc,IAAIV,GAET,KACHJ,EAAYe,OAAOX,GAEdJ,EAAYY,OACbV,EAASc,cAETd,EAASG,iBAAkB,EAC/B,GAGRY,EAAYA,MACHjB,EAAYY,MAAQV,EAASgB,cAC9BhB,EAASiB,kBAETrB,EAAW,IAAIC,GAEZD,GAEXsB,CAAAA,GACIlB,EAASmB,uBACb,EACAC,EAAWhB,IAEhBd,GAMH,OAJA+B,EAAqB1B,EAAMc,EAAYd,EAAMoB,GAE7CpB,EAAMuB,IAECvB,EAAMyB,CACjB,CCtFM,SAAUE,EAAyBhD,GACrC,MAAOiD,EAAWC,GAAmBC,IAE/BjD,EAAQC,EAAOH,GAIrB,IAAIJ,EAFJM,EAAME,QAAUJ,EAIhB,MAAMS,EAAIZ,EAAQ,KACd,MAAM6B,EAAW,IAAIhB,EACjB,KACId,EAAQM,EAAME,WAElB,KACIsB,EAASd,MAETsC,EAAgB,KACZE,EAAmBxD,EACvB,EACJ,GAKJ,OAFA8B,EAASG,iBAAkB,EAEpBH,GACR,IAEHf,EAAU,KACNF,EAAEoB,iBAAkB,EAEhBpB,EAAEiC,YACFjC,EAAE4C,aAEF5C,EAAE4B,YAGC,KACH5B,EAAEI,UACFJ,EAAEoB,iBAAkB,CACxB,GACD,CAACpB,IAEJ,MAAO6C,EAAiBF,GAAsBG,EAAY,KACtD9C,EAAEG,MAEKhB,IAGX,MAAO,CAACqD,EAAWK,EACvB,CDrCApC,EAAce,gBAAkBhB"}