UNPKG

1.96 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, '__esModule', { value: true });
4
5var immer = require('immer');
6var jotai = require('jotai');
7var react = require('react');
8
9function atomWithImmer(initialValue) {
10 var anAtom = jotai.atom(initialValue, function (get, set, fn) {
11 return set(anAtom, immer.produce(get(anAtom), function (draft) {
12 return fn(draft);
13 }));
14 });
15 return anAtom;
16}
17
18function useImmerAtom(anAtom) {
19 var _useAtom = jotai.useAtom(anAtom),
20 state = _useAtom[0],
21 setState = _useAtom[1];
22
23 var setStateWithImmer = react.useCallback(function (fn) {
24 setState(immer.produce(function (draft) {
25 return fn(draft);
26 }));
27 }, [setState]);
28 return [state, setStateWithImmer];
29}
30
31var getWeakCacheItem = function getWeakCacheItem(cache, deps) {
32 var dep = deps[0],
33 rest = deps.slice(1);
34 var entry = cache.get(dep);
35
36 if (!entry) {
37 return;
38 }
39
40 if (!rest.length) {
41 return entry[1];
42 }
43
44 return getWeakCacheItem(entry[0], rest);
45};
46var setWeakCacheItem = function setWeakCacheItem(cache, deps, item) {
47 var dep = deps[0],
48 rest = deps.slice(1);
49 var entry = cache.get(dep);
50
51 if (!entry) {
52 entry = [new WeakMap()];
53 cache.set(dep, entry);
54 }
55
56 if (!rest.length) {
57 entry[1] = item;
58 return;
59 }
60
61 setWeakCacheItem(entry[0], rest, item);
62};
63
64var withImmerCache = new WeakMap();
65function withImmer(anAtom) {
66 var deps = [anAtom];
67 var cachedAtom = getWeakCacheItem(withImmerCache, deps);
68
69 if (cachedAtom) {
70 return cachedAtom;
71 }
72
73 var derivedAtom = jotai.atom(function (get) {
74 return get(anAtom);
75 }, function (get, set, fn) {
76 return set(anAtom, immer.produce(get(anAtom), function (draft) {
77 return fn(draft);
78 }));
79 });
80 derivedAtom.scope = anAtom.scope;
81 setWeakCacheItem(withImmerCache, deps, derivedAtom);
82 return derivedAtom;
83}
84
85exports.atomWithImmer = atomWithImmer;
86exports.useImmerAtom = useImmerAtom;
87exports.withImmer = withImmer;