UNPKG

2.84 kBJavaScriptView Raw
1System.register(['immer', 'jotai', 'react'], (function (exports) {
2 'use strict';
3 var produce, atom, useAtom, useCallback;
4 return {
5 setters: [function (module) {
6 produce = module.produce;
7 }, function (module) {
8 atom = module.atom;
9 useAtom = module.useAtom;
10 }, function (module) {
11 useCallback = module.useCallback;
12 }],
13 execute: (function () {
14
15 exports({
16 atomWithImmer: atomWithImmer,
17 useImmerAtom: useImmerAtom,
18 withImmer: withImmer
19 });
20
21 function atomWithImmer(initialValue) {
22 const anAtom = atom(
23 initialValue,
24 (get, set, fn) => set(
25 anAtom,
26 produce(
27 get(anAtom),
28 typeof fn === "function" ? fn : () => fn
29 )
30 )
31 );
32 return anAtom;
33 }
34
35 function useImmerAtom(anAtom, scope) {
36 const [state, setState] = useAtom(anAtom, scope);
37 const setStateWithImmer = useCallback(
38 (fn) => setState(produce(fn)),
39 [setState]
40 );
41 return [state, setStateWithImmer];
42 }
43
44 const getWeakCacheItem = (cache, deps) => {
45 do {
46 const [dep, ...rest] = deps;
47 const entry = cache.get(dep);
48 if (!entry) {
49 return;
50 }
51 if (!rest.length) {
52 return entry[1];
53 }
54 cache = entry[0];
55 deps = rest;
56 } while (deps.length);
57 };
58 const setWeakCacheItem = (cache, deps, item) => {
59 do {
60 const [dep, ...rest] = deps;
61 let entry = cache.get(dep);
62 if (!entry) {
63 entry = [ new WeakMap()];
64 cache.set(dep, entry);
65 }
66 if (!rest.length) {
67 entry[1] = item;
68 return;
69 }
70 cache = entry[0];
71 deps = rest;
72 } while (deps.length);
73 };
74 const createMemoizeAtom = () => {
75 const cache = /* @__PURE__ */ new WeakMap();
76 const memoizeAtom = (createAtom, deps) => {
77 const cachedAtom = getWeakCacheItem(cache, deps);
78 if (cachedAtom) {
79 return cachedAtom;
80 }
81 const createdAtom = createAtom();
82 setWeakCacheItem(cache, deps, createdAtom);
83 return createdAtom;
84 };
85 return memoizeAtom;
86 };
87
88 const memoizeAtom = createMemoizeAtom();
89 function withImmer(anAtom) {
90 return memoizeAtom(() => {
91 const derivedAtom = atom(
92 (get) => get(anAtom),
93 (get, set, fn) => set(
94 anAtom,
95 produce(
96 get(anAtom),
97 typeof fn === "function" ? fn : () => fn
98 )
99 )
100 );
101 return derivedAtom;
102 }, [anAtom]);
103 }
104
105 })
106 };
107}));