UNPKG

2.44 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, '__esModule', { value: true });
4
5var jotai = require('jotai');
6var O = require('optics-ts');
7
8function _interopNamespace(e) {
9 if (e && e.__esModule) return e;
10 var n = Object.create(null);
11 if (e) {
12 Object.keys(e).forEach(function (k) {
13 if (k !== 'default') {
14 var d = Object.getOwnPropertyDescriptor(e, k);
15 Object.defineProperty(n, k, d.get ? d : {
16 enumerable: true,
17 get: function () {
18 return e[k];
19 }
20 });
21 }
22 });
23 }
24 n['default'] = e;
25 return Object.freeze(n);
26}
27
28var O__namespace = /*#__PURE__*/_interopNamespace(O);
29
30var getWeakCacheItem = function getWeakCacheItem(cache, deps) {
31 var dep = deps[0],
32 rest = deps.slice(1);
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 return getWeakCacheItem(entry[0], rest);
44};
45var setWeakCacheItem = function setWeakCacheItem(cache, deps, item) {
46 var dep = deps[0],
47 rest = deps.slice(1);
48 var entry = cache.get(dep);
49
50 if (!entry) {
51 entry = [new WeakMap()];
52 cache.set(dep, entry);
53 }
54
55 if (!rest.length) {
56 entry[1] = item;
57 return;
58 }
59
60 setWeakCacheItem(entry[0], rest, item);
61};
62
63var focusAtomCache = new WeakMap();
64
65var isFunction = function isFunction(x) {
66 return typeof x === 'function';
67};
68
69function focusAtom(baseAtom, callback) {
70 var deps = [baseAtom, callback];
71 var cachedAtom = getWeakCacheItem(focusAtomCache, deps);
72
73 if (cachedAtom) {
74 return cachedAtom;
75 }
76
77 var focus = callback(O__namespace.optic());
78 var derivedAtom = jotai.atom(function (get) {
79 return getValueUsingOptic(focus, get(baseAtom));
80 }, function (get, set, update) {
81 var newValueProducer = isFunction(update) ? O__namespace.modify(focus)(update) : O__namespace.set(focus)(update);
82 set(baseAtom, newValueProducer(get(baseAtom)));
83 });
84 derivedAtom.scope = baseAtom.scope;
85 setWeakCacheItem(focusAtomCache, deps, derivedAtom);
86 return derivedAtom;
87}
88
89var getValueUsingOptic = function getValueUsingOptic(focus, bigValue) {
90 if (focus._tag === 'Traversal') {
91 var values = O__namespace.collect(focus)(bigValue);
92 return values;
93 }
94
95 if (focus._tag === 'Prism') {
96 var _value = O__namespace.preview(focus)(bigValue);
97
98 return _value;
99 }
100
101 var value = O__namespace.get(focus)(bigValue);
102 return value;
103};
104
105exports.focusAtom = focusAtom;