UNPKG

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