atomirx 0.0.7 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/README.md +198 -2234
  2. package/bin/cli.js +90 -0
  3. package/dist/core/derived.d.ts +2 -2
  4. package/dist/core/effect.d.ts +3 -2
  5. package/dist/core/onCreateHook.d.ts +15 -2
  6. package/dist/core/onErrorHook.d.ts +4 -1
  7. package/dist/core/pool.d.ts +78 -0
  8. package/dist/core/pool.test.d.ts +1 -0
  9. package/dist/core/select-boolean.test.d.ts +1 -0
  10. package/dist/core/select-pool.test.d.ts +1 -0
  11. package/dist/core/select.d.ts +278 -86
  12. package/dist/core/types.d.ts +233 -1
  13. package/dist/core/withAbort.d.ts +95 -0
  14. package/dist/core/withReady.d.ts +3 -3
  15. package/dist/devtools/constants.d.ts +41 -0
  16. package/dist/devtools/index.cjs +1 -0
  17. package/dist/devtools/index.d.ts +29 -0
  18. package/dist/devtools/index.js +429 -0
  19. package/dist/devtools/registry.d.ts +98 -0
  20. package/dist/devtools/registry.test.d.ts +1 -0
  21. package/dist/devtools/setup.d.ts +61 -0
  22. package/dist/devtools/types.d.ts +311 -0
  23. package/dist/index-BZEnfIcB.cjs +1 -0
  24. package/dist/index-BbPZhsDl.js +1653 -0
  25. package/dist/index.cjs +1 -1
  26. package/dist/index.d.ts +4 -3
  27. package/dist/index.js +18 -14
  28. package/dist/onDispatchHook-C8yLzr-o.cjs +1 -0
  29. package/dist/onDispatchHook-SKbiIUaJ.js +5 -0
  30. package/dist/onErrorHook-BGGy3tqK.js +38 -0
  31. package/dist/onErrorHook-DHBASmYw.cjs +1 -0
  32. package/dist/react/index.cjs +1 -30
  33. package/dist/react/index.js +206 -791
  34. package/dist/react/onDispatchHook.d.ts +106 -0
  35. package/dist/react/useAction.d.ts +4 -1
  36. package/dist/react-devtools/DevToolsPanel.d.ts +93 -0
  37. package/dist/react-devtools/EntityDetails.d.ts +10 -0
  38. package/dist/react-devtools/EntityList.d.ts +15 -0
  39. package/dist/react-devtools/LogList.d.ts +12 -0
  40. package/dist/react-devtools/hooks.d.ts +50 -0
  41. package/dist/react-devtools/index.cjs +1 -0
  42. package/dist/react-devtools/index.d.ts +31 -0
  43. package/dist/react-devtools/index.js +1589 -0
  44. package/dist/react-devtools/styles.d.ts +148 -0
  45. package/package.json +26 -2
  46. package/skills/atomirx/SKILL.md +456 -0
  47. package/skills/atomirx/references/async-patterns.md +188 -0
  48. package/skills/atomirx/references/atom-patterns.md +238 -0
  49. package/skills/atomirx/references/deferred-loading.md +191 -0
  50. package/skills/atomirx/references/derived-patterns.md +428 -0
  51. package/skills/atomirx/references/effect-patterns.md +426 -0
  52. package/skills/atomirx/references/error-handling.md +140 -0
  53. package/skills/atomirx/references/hooks.md +322 -0
  54. package/skills/atomirx/references/pool-patterns.md +229 -0
  55. package/skills/atomirx/references/react-integration.md +411 -0
  56. package/skills/atomirx/references/rules.md +407 -0
  57. package/skills/atomirx/references/select-context.md +309 -0
  58. package/skills/atomirx/references/service-template.md +172 -0
  59. package/skills/atomirx/references/store-template.md +205 -0
  60. package/skills/atomirx/references/testing-patterns.md +431 -0
  61. package/coverage/base.css +0 -224
  62. package/coverage/block-navigation.js +0 -87
  63. package/coverage/clover.xml +0 -1440
  64. package/coverage/coverage-final.json +0 -14
  65. package/coverage/favicon.png +0 -0
  66. package/coverage/index.html +0 -131
  67. package/coverage/prettify.css +0 -1
  68. package/coverage/prettify.js +0 -2
  69. package/coverage/sort-arrow-sprite.png +0 -0
  70. package/coverage/sorter.js +0 -210
  71. package/coverage/src/core/atom.ts.html +0 -889
  72. package/coverage/src/core/batch.ts.html +0 -223
  73. package/coverage/src/core/define.ts.html +0 -805
  74. package/coverage/src/core/emitter.ts.html +0 -919
  75. package/coverage/src/core/equality.ts.html +0 -631
  76. package/coverage/src/core/hook.ts.html +0 -460
  77. package/coverage/src/core/index.html +0 -281
  78. package/coverage/src/core/isAtom.ts.html +0 -100
  79. package/coverage/src/core/isPromiseLike.ts.html +0 -133
  80. package/coverage/src/core/onCreateHook.ts.html +0 -138
  81. package/coverage/src/core/scheduleNotifyHook.ts.html +0 -94
  82. package/coverage/src/core/types.ts.html +0 -523
  83. package/coverage/src/core/withUse.ts.html +0 -253
  84. package/coverage/src/index.html +0 -116
  85. package/coverage/src/index.ts.html +0 -106
  86. package/dist/index-CBVj1kSj.js +0 -1350
  87. package/dist/index-Cxk9v0um.cjs +0 -1
  88. package/scripts/publish.js +0 -198
  89. package/src/core/atom.test.ts +0 -633
  90. package/src/core/atom.ts +0 -311
  91. package/src/core/atomState.test.ts +0 -342
  92. package/src/core/atomState.ts +0 -256
  93. package/src/core/batch.test.ts +0 -257
  94. package/src/core/batch.ts +0 -172
  95. package/src/core/define.test.ts +0 -343
  96. package/src/core/define.ts +0 -243
  97. package/src/core/derived.test.ts +0 -1215
  98. package/src/core/derived.ts +0 -450
  99. package/src/core/effect.test.ts +0 -802
  100. package/src/core/effect.ts +0 -188
  101. package/src/core/emitter.test.ts +0 -364
  102. package/src/core/emitter.ts +0 -392
  103. package/src/core/equality.test.ts +0 -392
  104. package/src/core/equality.ts +0 -182
  105. package/src/core/getAtomState.ts +0 -69
  106. package/src/core/hook.test.ts +0 -227
  107. package/src/core/hook.ts +0 -177
  108. package/src/core/isAtom.ts +0 -27
  109. package/src/core/isPromiseLike.test.ts +0 -72
  110. package/src/core/isPromiseLike.ts +0 -16
  111. package/src/core/onCreateHook.ts +0 -107
  112. package/src/core/onErrorHook.test.ts +0 -350
  113. package/src/core/onErrorHook.ts +0 -52
  114. package/src/core/promiseCache.test.ts +0 -241
  115. package/src/core/promiseCache.ts +0 -284
  116. package/src/core/scheduleNotifyHook.ts +0 -53
  117. package/src/core/select.ts +0 -729
  118. package/src/core/selector.test.ts +0 -799
  119. package/src/core/types.ts +0 -389
  120. package/src/core/withReady.test.ts +0 -534
  121. package/src/core/withReady.ts +0 -191
  122. package/src/core/withUse.test.ts +0 -249
  123. package/src/core/withUse.ts +0 -56
  124. package/src/index.test.ts +0 -80
  125. package/src/index.ts +0 -65
  126. package/src/react/index.ts +0 -21
  127. package/src/react/rx.test.tsx +0 -571
  128. package/src/react/rx.tsx +0 -531
  129. package/src/react/strictModeTest.tsx +0 -71
  130. package/src/react/useAction.test.ts +0 -987
  131. package/src/react/useAction.ts +0 -607
  132. package/src/react/useSelector.test.ts +0 -182
  133. package/src/react/useSelector.ts +0 -292
  134. package/src/react/useStable.test.ts +0 -553
  135. package/src/react/useStable.ts +0 -288
  136. package/tsconfig.json +0 -9
  137. package/v2.md +0 -725
  138. package/vite.config.ts +0 -39
@@ -1,889 +0,0 @@
1
-
2
- <!doctype html>
3
- <html lang="en">
4
-
5
- <head>
6
- <title>Code coverage report for src/core/atom.ts</title>
7
- <meta charset="utf-8" />
8
- <link rel="stylesheet" href="../../prettify.css" />
9
- <link rel="stylesheet" href="../../base.css" />
10
- <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
11
- <meta name="viewport" content="width=device-width, initial-scale=1" />
12
- <style type='text/css'>
13
- .coverage-summary .sorter {
14
- background-image: url(../../sort-arrow-sprite.png);
15
- }
16
- </style>
17
- </head>
18
-
19
- <body>
20
- <div class='wrapper'>
21
- <div class='pad1'>
22
- <h1><a href="../../index.html">All files</a> / <a href="index.html">src/core</a> atom.ts</h1>
23
- <div class='clearfix'>
24
-
25
- <div class='fl pad1y space-right2'>
26
- <span class="strong">95.89% </span>
27
- <span class="quiet">Statements</span>
28
- <span class='fraction'>257/268</span>
29
- </div>
30
-
31
-
32
- <div class='fl pad1y space-right2'>
33
- <span class="strong">90% </span>
34
- <span class="quiet">Branches</span>
35
- <span class='fraction'>36/40</span>
36
- </div>
37
-
38
-
39
- <div class='fl pad1y space-right2'>
40
- <span class="strong">100% </span>
41
- <span class="quiet">Functions</span>
42
- <span class='fraction'>13/13</span>
43
- </div>
44
-
45
-
46
- <div class='fl pad1y space-right2'>
47
- <span class="strong">95.89% </span>
48
- <span class="quiet">Lines</span>
49
- <span class='fraction'>257/268</span>
50
- </div>
51
-
52
-
53
- </div>
54
- <p class="quiet">
55
- Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
- </p>
57
- <template id="filterTemplate">
58
- <div class="quiet">
59
- Filter:
60
- <input type="search" id="fileSearch">
61
- </div>
62
- </template>
63
- </div>
64
- <div class='status-line high'></div>
65
- <pre><table class="coverage">
66
- <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
- <a name='L2'></a><a href='#L2'>2</a>
68
- <a name='L3'></a><a href='#L3'>3</a>
69
- <a name='L4'></a><a href='#L4'>4</a>
70
- <a name='L5'></a><a href='#L5'>5</a>
71
- <a name='L6'></a><a href='#L6'>6</a>
72
- <a name='L7'></a><a href='#L7'>7</a>
73
- <a name='L8'></a><a href='#L8'>8</a>
74
- <a name='L9'></a><a href='#L9'>9</a>
75
- <a name='L10'></a><a href='#L10'>10</a>
76
- <a name='L11'></a><a href='#L11'>11</a>
77
- <a name='L12'></a><a href='#L12'>12</a>
78
- <a name='L13'></a><a href='#L13'>13</a>
79
- <a name='L14'></a><a href='#L14'>14</a>
80
- <a name='L15'></a><a href='#L15'>15</a>
81
- <a name='L16'></a><a href='#L16'>16</a>
82
- <a name='L17'></a><a href='#L17'>17</a>
83
- <a name='L18'></a><a href='#L18'>18</a>
84
- <a name='L19'></a><a href='#L19'>19</a>
85
- <a name='L20'></a><a href='#L20'>20</a>
86
- <a name='L21'></a><a href='#L21'>21</a>
87
- <a name='L22'></a><a href='#L22'>22</a>
88
- <a name='L23'></a><a href='#L23'>23</a>
89
- <a name='L24'></a><a href='#L24'>24</a>
90
- <a name='L25'></a><a href='#L25'>25</a>
91
- <a name='L26'></a><a href='#L26'>26</a>
92
- <a name='L27'></a><a href='#L27'>27</a>
93
- <a name='L28'></a><a href='#L28'>28</a>
94
- <a name='L29'></a><a href='#L29'>29</a>
95
- <a name='L30'></a><a href='#L30'>30</a>
96
- <a name='L31'></a><a href='#L31'>31</a>
97
- <a name='L32'></a><a href='#L32'>32</a>
98
- <a name='L33'></a><a href='#L33'>33</a>
99
- <a name='L34'></a><a href='#L34'>34</a>
100
- <a name='L35'></a><a href='#L35'>35</a>
101
- <a name='L36'></a><a href='#L36'>36</a>
102
- <a name='L37'></a><a href='#L37'>37</a>
103
- <a name='L38'></a><a href='#L38'>38</a>
104
- <a name='L39'></a><a href='#L39'>39</a>
105
- <a name='L40'></a><a href='#L40'>40</a>
106
- <a name='L41'></a><a href='#L41'>41</a>
107
- <a name='L42'></a><a href='#L42'>42</a>
108
- <a name='L43'></a><a href='#L43'>43</a>
109
- <a name='L44'></a><a href='#L44'>44</a>
110
- <a name='L45'></a><a href='#L45'>45</a>
111
- <a name='L46'></a><a href='#L46'>46</a>
112
- <a name='L47'></a><a href='#L47'>47</a>
113
- <a name='L48'></a><a href='#L48'>48</a>
114
- <a name='L49'></a><a href='#L49'>49</a>
115
- <a name='L50'></a><a href='#L50'>50</a>
116
- <a name='L51'></a><a href='#L51'>51</a>
117
- <a name='L52'></a><a href='#L52'>52</a>
118
- <a name='L53'></a><a href='#L53'>53</a>
119
- <a name='L54'></a><a href='#L54'>54</a>
120
- <a name='L55'></a><a href='#L55'>55</a>
121
- <a name='L56'></a><a href='#L56'>56</a>
122
- <a name='L57'></a><a href='#L57'>57</a>
123
- <a name='L58'></a><a href='#L58'>58</a>
124
- <a name='L59'></a><a href='#L59'>59</a>
125
- <a name='L60'></a><a href='#L60'>60</a>
126
- <a name='L61'></a><a href='#L61'>61</a>
127
- <a name='L62'></a><a href='#L62'>62</a>
128
- <a name='L63'></a><a href='#L63'>63</a>
129
- <a name='L64'></a><a href='#L64'>64</a>
130
- <a name='L65'></a><a href='#L65'>65</a>
131
- <a name='L66'></a><a href='#L66'>66</a>
132
- <a name='L67'></a><a href='#L67'>67</a>
133
- <a name='L68'></a><a href='#L68'>68</a>
134
- <a name='L69'></a><a href='#L69'>69</a>
135
- <a name='L70'></a><a href='#L70'>70</a>
136
- <a name='L71'></a><a href='#L71'>71</a>
137
- <a name='L72'></a><a href='#L72'>72</a>
138
- <a name='L73'></a><a href='#L73'>73</a>
139
- <a name='L74'></a><a href='#L74'>74</a>
140
- <a name='L75'></a><a href='#L75'>75</a>
141
- <a name='L76'></a><a href='#L76'>76</a>
142
- <a name='L77'></a><a href='#L77'>77</a>
143
- <a name='L78'></a><a href='#L78'>78</a>
144
- <a name='L79'></a><a href='#L79'>79</a>
145
- <a name='L80'></a><a href='#L80'>80</a>
146
- <a name='L81'></a><a href='#L81'>81</a>
147
- <a name='L82'></a><a href='#L82'>82</a>
148
- <a name='L83'></a><a href='#L83'>83</a>
149
- <a name='L84'></a><a href='#L84'>84</a>
150
- <a name='L85'></a><a href='#L85'>85</a>
151
- <a name='L86'></a><a href='#L86'>86</a>
152
- <a name='L87'></a><a href='#L87'>87</a>
153
- <a name='L88'></a><a href='#L88'>88</a>
154
- <a name='L89'></a><a href='#L89'>89</a>
155
- <a name='L90'></a><a href='#L90'>90</a>
156
- <a name='L91'></a><a href='#L91'>91</a>
157
- <a name='L92'></a><a href='#L92'>92</a>
158
- <a name='L93'></a><a href='#L93'>93</a>
159
- <a name='L94'></a><a href='#L94'>94</a>
160
- <a name='L95'></a><a href='#L95'>95</a>
161
- <a name='L96'></a><a href='#L96'>96</a>
162
- <a name='L97'></a><a href='#L97'>97</a>
163
- <a name='L98'></a><a href='#L98'>98</a>
164
- <a name='L99'></a><a href='#L99'>99</a>
165
- <a name='L100'></a><a href='#L100'>100</a>
166
- <a name='L101'></a><a href='#L101'>101</a>
167
- <a name='L102'></a><a href='#L102'>102</a>
168
- <a name='L103'></a><a href='#L103'>103</a>
169
- <a name='L104'></a><a href='#L104'>104</a>
170
- <a name='L105'></a><a href='#L105'>105</a>
171
- <a name='L106'></a><a href='#L106'>106</a>
172
- <a name='L107'></a><a href='#L107'>107</a>
173
- <a name='L108'></a><a href='#L108'>108</a>
174
- <a name='L109'></a><a href='#L109'>109</a>
175
- <a name='L110'></a><a href='#L110'>110</a>
176
- <a name='L111'></a><a href='#L111'>111</a>
177
- <a name='L112'></a><a href='#L112'>112</a>
178
- <a name='L113'></a><a href='#L113'>113</a>
179
- <a name='L114'></a><a href='#L114'>114</a>
180
- <a name='L115'></a><a href='#L115'>115</a>
181
- <a name='L116'></a><a href='#L116'>116</a>
182
- <a name='L117'></a><a href='#L117'>117</a>
183
- <a name='L118'></a><a href='#L118'>118</a>
184
- <a name='L119'></a><a href='#L119'>119</a>
185
- <a name='L120'></a><a href='#L120'>120</a>
186
- <a name='L121'></a><a href='#L121'>121</a>
187
- <a name='L122'></a><a href='#L122'>122</a>
188
- <a name='L123'></a><a href='#L123'>123</a>
189
- <a name='L124'></a><a href='#L124'>124</a>
190
- <a name='L125'></a><a href='#L125'>125</a>
191
- <a name='L126'></a><a href='#L126'>126</a>
192
- <a name='L127'></a><a href='#L127'>127</a>
193
- <a name='L128'></a><a href='#L128'>128</a>
194
- <a name='L129'></a><a href='#L129'>129</a>
195
- <a name='L130'></a><a href='#L130'>130</a>
196
- <a name='L131'></a><a href='#L131'>131</a>
197
- <a name='L132'></a><a href='#L132'>132</a>
198
- <a name='L133'></a><a href='#L133'>133</a>
199
- <a name='L134'></a><a href='#L134'>134</a>
200
- <a name='L135'></a><a href='#L135'>135</a>
201
- <a name='L136'></a><a href='#L136'>136</a>
202
- <a name='L137'></a><a href='#L137'>137</a>
203
- <a name='L138'></a><a href='#L138'>138</a>
204
- <a name='L139'></a><a href='#L139'>139</a>
205
- <a name='L140'></a><a href='#L140'>140</a>
206
- <a name='L141'></a><a href='#L141'>141</a>
207
- <a name='L142'></a><a href='#L142'>142</a>
208
- <a name='L143'></a><a href='#L143'>143</a>
209
- <a name='L144'></a><a href='#L144'>144</a>
210
- <a name='L145'></a><a href='#L145'>145</a>
211
- <a name='L146'></a><a href='#L146'>146</a>
212
- <a name='L147'></a><a href='#L147'>147</a>
213
- <a name='L148'></a><a href='#L148'>148</a>
214
- <a name='L149'></a><a href='#L149'>149</a>
215
- <a name='L150'></a><a href='#L150'>150</a>
216
- <a name='L151'></a><a href='#L151'>151</a>
217
- <a name='L152'></a><a href='#L152'>152</a>
218
- <a name='L153'></a><a href='#L153'>153</a>
219
- <a name='L154'></a><a href='#L154'>154</a>
220
- <a name='L155'></a><a href='#L155'>155</a>
221
- <a name='L156'></a><a href='#L156'>156</a>
222
- <a name='L157'></a><a href='#L157'>157</a>
223
- <a name='L158'></a><a href='#L158'>158</a>
224
- <a name='L159'></a><a href='#L159'>159</a>
225
- <a name='L160'></a><a href='#L160'>160</a>
226
- <a name='L161'></a><a href='#L161'>161</a>
227
- <a name='L162'></a><a href='#L162'>162</a>
228
- <a name='L163'></a><a href='#L163'>163</a>
229
- <a name='L164'></a><a href='#L164'>164</a>
230
- <a name='L165'></a><a href='#L165'>165</a>
231
- <a name='L166'></a><a href='#L166'>166</a>
232
- <a name='L167'></a><a href='#L167'>167</a>
233
- <a name='L168'></a><a href='#L168'>168</a>
234
- <a name='L169'></a><a href='#L169'>169</a>
235
- <a name='L170'></a><a href='#L170'>170</a>
236
- <a name='L171'></a><a href='#L171'>171</a>
237
- <a name='L172'></a><a href='#L172'>172</a>
238
- <a name='L173'></a><a href='#L173'>173</a>
239
- <a name='L174'></a><a href='#L174'>174</a>
240
- <a name='L175'></a><a href='#L175'>175</a>
241
- <a name='L176'></a><a href='#L176'>176</a>
242
- <a name='L177'></a><a href='#L177'>177</a>
243
- <a name='L178'></a><a href='#L178'>178</a>
244
- <a name='L179'></a><a href='#L179'>179</a>
245
- <a name='L180'></a><a href='#L180'>180</a>
246
- <a name='L181'></a><a href='#L181'>181</a>
247
- <a name='L182'></a><a href='#L182'>182</a>
248
- <a name='L183'></a><a href='#L183'>183</a>
249
- <a name='L184'></a><a href='#L184'>184</a>
250
- <a name='L185'></a><a href='#L185'>185</a>
251
- <a name='L186'></a><a href='#L186'>186</a>
252
- <a name='L187'></a><a href='#L187'>187</a>
253
- <a name='L188'></a><a href='#L188'>188</a>
254
- <a name='L189'></a><a href='#L189'>189</a>
255
- <a name='L190'></a><a href='#L190'>190</a>
256
- <a name='L191'></a><a href='#L191'>191</a>
257
- <a name='L192'></a><a href='#L192'>192</a>
258
- <a name='L193'></a><a href='#L193'>193</a>
259
- <a name='L194'></a><a href='#L194'>194</a>
260
- <a name='L195'></a><a href='#L195'>195</a>
261
- <a name='L196'></a><a href='#L196'>196</a>
262
- <a name='L197'></a><a href='#L197'>197</a>
263
- <a name='L198'></a><a href='#L198'>198</a>
264
- <a name='L199'></a><a href='#L199'>199</a>
265
- <a name='L200'></a><a href='#L200'>200</a>
266
- <a name='L201'></a><a href='#L201'>201</a>
267
- <a name='L202'></a><a href='#L202'>202</a>
268
- <a name='L203'></a><a href='#L203'>203</a>
269
- <a name='L204'></a><a href='#L204'>204</a>
270
- <a name='L205'></a><a href='#L205'>205</a>
271
- <a name='L206'></a><a href='#L206'>206</a>
272
- <a name='L207'></a><a href='#L207'>207</a>
273
- <a name='L208'></a><a href='#L208'>208</a>
274
- <a name='L209'></a><a href='#L209'>209</a>
275
- <a name='L210'></a><a href='#L210'>210</a>
276
- <a name='L211'></a><a href='#L211'>211</a>
277
- <a name='L212'></a><a href='#L212'>212</a>
278
- <a name='L213'></a><a href='#L213'>213</a>
279
- <a name='L214'></a><a href='#L214'>214</a>
280
- <a name='L215'></a><a href='#L215'>215</a>
281
- <a name='L216'></a><a href='#L216'>216</a>
282
- <a name='L217'></a><a href='#L217'>217</a>
283
- <a name='L218'></a><a href='#L218'>218</a>
284
- <a name='L219'></a><a href='#L219'>219</a>
285
- <a name='L220'></a><a href='#L220'>220</a>
286
- <a name='L221'></a><a href='#L221'>221</a>
287
- <a name='L222'></a><a href='#L222'>222</a>
288
- <a name='L223'></a><a href='#L223'>223</a>
289
- <a name='L224'></a><a href='#L224'>224</a>
290
- <a name='L225'></a><a href='#L225'>225</a>
291
- <a name='L226'></a><a href='#L226'>226</a>
292
- <a name='L227'></a><a href='#L227'>227</a>
293
- <a name='L228'></a><a href='#L228'>228</a>
294
- <a name='L229'></a><a href='#L229'>229</a>
295
- <a name='L230'></a><a href='#L230'>230</a>
296
- <a name='L231'></a><a href='#L231'>231</a>
297
- <a name='L232'></a><a href='#L232'>232</a>
298
- <a name='L233'></a><a href='#L233'>233</a>
299
- <a name='L234'></a><a href='#L234'>234</a>
300
- <a name='L235'></a><a href='#L235'>235</a>
301
- <a name='L236'></a><a href='#L236'>236</a>
302
- <a name='L237'></a><a href='#L237'>237</a>
303
- <a name='L238'></a><a href='#L238'>238</a>
304
- <a name='L239'></a><a href='#L239'>239</a>
305
- <a name='L240'></a><a href='#L240'>240</a>
306
- <a name='L241'></a><a href='#L241'>241</a>
307
- <a name='L242'></a><a href='#L242'>242</a>
308
- <a name='L243'></a><a href='#L243'>243</a>
309
- <a name='L244'></a><a href='#L244'>244</a>
310
- <a name='L245'></a><a href='#L245'>245</a>
311
- <a name='L246'></a><a href='#L246'>246</a>
312
- <a name='L247'></a><a href='#L247'>247</a>
313
- <a name='L248'></a><a href='#L248'>248</a>
314
- <a name='L249'></a><a href='#L249'>249</a>
315
- <a name='L250'></a><a href='#L250'>250</a>
316
- <a name='L251'></a><a href='#L251'>251</a>
317
- <a name='L252'></a><a href='#L252'>252</a>
318
- <a name='L253'></a><a href='#L253'>253</a>
319
- <a name='L254'></a><a href='#L254'>254</a>
320
- <a name='L255'></a><a href='#L255'>255</a>
321
- <a name='L256'></a><a href='#L256'>256</a>
322
- <a name='L257'></a><a href='#L257'>257</a>
323
- <a name='L258'></a><a href='#L258'>258</a>
324
- <a name='L259'></a><a href='#L259'>259</a>
325
- <a name='L260'></a><a href='#L260'>260</a>
326
- <a name='L261'></a><a href='#L261'>261</a>
327
- <a name='L262'></a><a href='#L262'>262</a>
328
- <a name='L263'></a><a href='#L263'>263</a>
329
- <a name='L264'></a><a href='#L264'>264</a>
330
- <a name='L265'></a><a href='#L265'>265</a>
331
- <a name='L266'></a><a href='#L266'>266</a>
332
- <a name='L267'></a><a href='#L267'>267</a>
333
- <a name='L268'></a><a href='#L268'>268</a>
334
- <a name='L269'></a><a href='#L269'>269</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
335
- <span class="cline-any cline-yes">1x</span>
336
- <span class="cline-any cline-yes">1x</span>
337
- <span class="cline-any cline-yes">1x</span>
338
- <span class="cline-any cline-yes">1x</span>
339
- <span class="cline-any cline-yes">1x</span>
340
- <span class="cline-any cline-yes">1x</span>
341
- <span class="cline-any cline-yes">1x</span>
342
- <span class="cline-any cline-yes">1x</span>
343
- <span class="cline-any cline-yes">1x</span>
344
- <span class="cline-any cline-yes">1x</span>
345
- <span class="cline-any cline-yes">1x</span>
346
- <span class="cline-any cline-yes">1x</span>
347
- <span class="cline-any cline-yes">1x</span>
348
- <span class="cline-any cline-yes">1x</span>
349
- <span class="cline-any cline-yes">1x</span>
350
- <span class="cline-any cline-yes">1x</span>
351
- <span class="cline-any cline-yes">1x</span>
352
- <span class="cline-any cline-yes">1x</span>
353
- <span class="cline-any cline-yes">1x</span>
354
- <span class="cline-any cline-yes">1x</span>
355
- <span class="cline-any cline-yes">1x</span>
356
- <span class="cline-any cline-yes">1x</span>
357
- <span class="cline-any cline-yes">1x</span>
358
- <span class="cline-any cline-yes">1x</span>
359
- <span class="cline-any cline-yes">1x</span>
360
- <span class="cline-any cline-yes">1x</span>
361
- <span class="cline-any cline-yes">1x</span>
362
- <span class="cline-any cline-yes">1x</span>
363
- <span class="cline-any cline-yes">1x</span>
364
- <span class="cline-any cline-yes">1x</span>
365
- <span class="cline-any cline-yes">1x</span>
366
- <span class="cline-any cline-yes">1x</span>
367
- <span class="cline-any cline-yes">1x</span>
368
- <span class="cline-any cline-yes">1x</span>
369
- <span class="cline-any cline-yes">1x</span>
370
- <span class="cline-any cline-yes">1x</span>
371
- <span class="cline-any cline-yes">1x</span>
372
- <span class="cline-any cline-yes">1x</span>
373
- <span class="cline-any cline-yes">1x</span>
374
- <span class="cline-any cline-yes">1x</span>
375
- <span class="cline-any cline-yes">1x</span>
376
- <span class="cline-any cline-yes">1x</span>
377
- <span class="cline-any cline-yes">1x</span>
378
- <span class="cline-any cline-yes">1x</span>
379
- <span class="cline-any cline-yes">1x</span>
380
- <span class="cline-any cline-yes">1x</span>
381
- <span class="cline-any cline-yes">1x</span>
382
- <span class="cline-any cline-yes">1x</span>
383
- <span class="cline-any cline-yes">1x</span>
384
- <span class="cline-any cline-yes">1x</span>
385
- <span class="cline-any cline-yes">1x</span>
386
- <span class="cline-any cline-yes">55x</span>
387
- <span class="cline-any cline-yes">55x</span>
388
- <span class="cline-any cline-yes">55x</span>
389
- <span class="cline-any cline-yes">55x</span>
390
- <span class="cline-any cline-yes">55x</span>
391
- <span class="cline-any cline-yes">55x</span>
392
- <span class="cline-any cline-yes">55x</span>
393
- <span class="cline-any cline-yes">55x</span>
394
- <span class="cline-any cline-yes">55x</span>
395
- <span class="cline-any cline-yes">55x</span>
396
- <span class="cline-any cline-yes">55x</span>
397
- <span class="cline-any cline-yes">55x</span>
398
- <span class="cline-any cline-yes">55x</span>
399
- <span class="cline-any cline-yes">55x</span>
400
- <span class="cline-any cline-yes">55x</span>
401
- <span class="cline-any cline-yes">55x</span>
402
- <span class="cline-any cline-yes">55x</span>
403
- <span class="cline-any cline-yes">55x</span>
404
- <span class="cline-any cline-yes">55x</span>
405
- <span class="cline-any cline-yes">55x</span>
406
- <span class="cline-any cline-yes">55x</span>
407
- <span class="cline-any cline-yes">55x</span>
408
- <span class="cline-any cline-yes">55x</span>
409
- <span class="cline-any cline-yes">55x</span>
410
- <span class="cline-any cline-yes">55x</span>
411
- <span class="cline-any cline-yes">55x</span>
412
- <span class="cline-any cline-yes">55x</span>
413
- <span class="cline-any cline-yes">55x</span>
414
- <span class="cline-any cline-yes">12x</span>
415
- <span class="cline-any cline-yes">12x</span>
416
- <span class="cline-any cline-yes">12x</span>
417
- <span class="cline-any cline-yes">12x</span>
418
- <span class="cline-any cline-yes">12x</span>
419
- <span class="cline-any cline-yes">12x</span>
420
- <span class="cline-any cline-yes">12x</span>
421
- <span class="cline-any cline-yes">12x</span>
422
- <span class="cline-any cline-yes">12x</span>
423
- <span class="cline-any cline-yes">12x</span>
424
- <span class="cline-any cline-yes">12x</span>
425
- <span class="cline-any cline-yes">12x</span>
426
- <span class="cline-any cline-yes">12x</span>
427
- <span class="cline-any cline-yes">55x</span>
428
- <span class="cline-any cline-yes">55x</span>
429
- <span class="cline-any cline-yes">92x</span>
430
- <span class="cline-any cline-yes">92x</span>
431
- <span class="cline-any cline-yes">92x</span>
432
- <span class="cline-any cline-yes">92x</span>
433
- <span class="cline-any cline-yes">92x</span>
434
- <span class="cline-any cline-yes">92x</span>
435
- <span class="cline-any cline-yes">92x</span>
436
- <span class="cline-any cline-yes">92x</span>
437
- <span class="cline-any cline-yes">92x</span>
438
- <span class="cline-any cline-yes">55x</span>
439
- <span class="cline-any cline-yes">55x</span>
440
- <span class="cline-any cline-yes">55x</span>
441
- <span class="cline-any cline-yes">55x</span>
442
- <span class="cline-any cline-yes">55x</span>
443
- <span class="cline-any cline-yes">55x</span>
444
- <span class="cline-any cline-yes">55x</span>
445
- <span class="cline-any cline-yes">131x</span>
446
- <span class="cline-any cline-yes">51x</span>
447
- <span class="cline-any cline-yes">51x</span>
448
- <span class="cline-any cline-yes">131x</span>
449
- <span class="cline-any cline-yes">9x</span>
450
- <span class="cline-any cline-yes">9x</span>
451
- <span class="cline-any cline-yes">42x</span>
452
- <span class="cline-any cline-yes">42x</span>
453
- <span class="cline-any cline-yes">42x</span>
454
- <span class="cline-any cline-yes">131x</span>
455
- <span class="cline-any cline-yes">55x</span>
456
- <span class="cline-any cline-yes">55x</span>
457
- <span class="cline-any cline-yes">55x</span>
458
- <span class="cline-any cline-yes">55x</span>
459
- <span class="cline-any cline-yes">55x</span>
460
- <span class="cline-any cline-yes">55x</span>
461
- <span class="cline-any cline-yes">55x</span>
462
- <span class="cline-any cline-yes">12x</span>
463
- <span class="cline-any cline-yes">12x</span>
464
- <span class="cline-any cline-yes">12x</span>
465
- <span class="cline-any cline-yes">12x</span>
466
- <span class="cline-any cline-yes">12x</span>
467
- <span class="cline-any cline-yes">12x</span>
468
- <span class="cline-any cline-yes">12x</span>
469
- <span class="cline-any cline-yes">12x</span>
470
- <span class="cline-any cline-yes">7x</span>
471
- <span class="cline-any cline-yes">12x</span>
472
- <span class="cline-any cline-yes">5x</span>
473
- <span class="cline-any cline-yes">5x</span>
474
- <span class="cline-any cline-yes">2x</span>
475
- <span class="cline-any cline-yes">2x</span>
476
- <span class="cline-any cline-yes">2x</span>
477
- <span class="cline-any cline-yes">2x</span>
478
- <span class="cline-any cline-yes">2x</span>
479
- <span class="cline-any cline-yes">2x</span>
480
- <span class="cline-any cline-yes">2x</span>
481
- <span class="cline-any cline-yes">2x</span>
482
- <span class="cline-any cline-yes">2x</span>
483
- <span class="cline-any cline-yes">12x</span>
484
- <span class="cline-any cline-yes">12x</span>
485
- <span class="cline-any cline-yes">12x</span>
486
- <span class="cline-any cline-yes">12x</span>
487
- <span class="cline-any cline-yes">12x</span>
488
- <span class="cline-any cline-yes">12x</span>
489
- <span class="cline-any cline-yes">12x</span>
490
- <span class="cline-any cline-yes">55x</span>
491
- <span class="cline-any cline-yes">55x</span>
492
- <span class="cline-any cline-yes">55x</span>
493
- <span class="cline-any cline-yes">55x</span>
494
- <span class="cline-any cline-yes">55x</span>
495
- <span class="cline-any cline-yes">55x</span>
496
- <span class="cline-any cline-yes">55x</span>
497
- <span class="cline-any cline-yes">55x</span>
498
- <span class="cline-any cline-yes">55x</span>
499
- <span class="cline-any cline-yes">55x</span>
500
- <span class="cline-any cline-yes">55x</span>
501
- <span class="cline-any cline-yes">55x</span>
502
- <span class="cline-any cline-yes">55x</span>
503
- <span class="cline-any cline-yes">55x</span>
504
- <span class="cline-any cline-yes">55x</span>
505
- <span class="cline-any cline-yes">53x</span>
506
- <span class="cline-any cline-yes">53x</span>
507
- <span class="cline-any cline-yes">53x</span>
508
- <span class="cline-any cline-yes">16x</span>
509
- <span class="cline-any cline-yes">16x</span>
510
- <span class="cline-any cline-yes">16x</span>
511
- <span class="cline-any cline-yes">16x</span>
512
- <span class="cline-any cline-yes">16x</span>
513
- <span class="cline-any cline-yes">3x</span>
514
- <span class="cline-any cline-yes">3x</span>
515
- <span class="cline-any cline-yes">3x</span>
516
- <span class="cline-any cline-yes">13x</span>
517
- <span class="cline-any cline-yes">13x</span>
518
- <span class="cline-any cline-yes">16x</span>
519
- <span class="cline-any cline-no">&nbsp;</span>
520
- <span class="cline-any cline-no">&nbsp;</span>
521
- <span class="cline-any cline-yes">13x</span>
522
- <span class="cline-any cline-yes">13x</span>
523
- <span class="cline-any cline-yes">13x</span>
524
- <span class="cline-any cline-yes">13x</span>
525
- <span class="cline-any cline-yes">8x</span>
526
- <span class="cline-any cline-yes">8x</span>
527
- <span class="cline-any cline-yes">8x</span>
528
- <span class="cline-any cline-yes">16x</span>
529
- <span class="cline-any cline-no">&nbsp;</span>
530
- <span class="cline-any cline-no">&nbsp;</span>
531
- <span class="cline-any cline-no">&nbsp;</span>
532
- <span class="cline-any cline-no">&nbsp;</span>
533
- <span class="cline-any cline-no">&nbsp;</span>
534
- <span class="cline-any cline-no">&nbsp;</span>
535
- <span class="cline-any cline-no">&nbsp;</span>
536
- <span class="cline-any cline-no">&nbsp;</span>
537
- <span class="cline-any cline-no">&nbsp;</span>
538
- <span class="cline-any cline-yes">16x</span>
539
- <span class="cline-any cline-yes">37x</span>
540
- <span class="cline-any cline-yes">37x</span>
541
- <span class="cline-any cline-yes">37x</span>
542
- <span class="cline-any cline-yes">37x</span>
543
- <span class="cline-any cline-yes">53x</span>
544
- <span class="cline-any cline-yes">55x</span>
545
- <span class="cline-any cline-yes">55x</span>
546
- <span class="cline-any cline-yes">55x</span>
547
- <span class="cline-any cline-yes">55x</span>
548
- <span class="cline-any cline-yes">55x</span>
549
- <span class="cline-any cline-yes">55x</span>
550
- <span class="cline-any cline-yes">55x</span>
551
- <span class="cline-any cline-yes">55x</span>
552
- <span class="cline-any cline-yes">45x</span>
553
- <span class="cline-any cline-yes">45x</span>
554
- <span class="cline-any cline-yes">45x</span>
555
- <span class="cline-any cline-yes">55x</span>
556
- <span class="cline-any cline-yes">55x</span>
557
- <span class="cline-any cline-yes">55x</span>
558
- <span class="cline-any cline-yes">22x</span>
559
- <span class="cline-any cline-yes">22x</span>
560
- <span class="cline-any cline-yes">22x</span>
561
- <span class="cline-any cline-yes">55x</span>
562
- <span class="cline-any cline-yes">55x</span>
563
- <span class="cline-any cline-yes">55x</span>
564
- <span class="cline-any cline-yes">7x</span>
565
- <span class="cline-any cline-yes">7x</span>
566
- <span class="cline-any cline-yes">7x</span>
567
- <span class="cline-any cline-yes">55x</span>
568
- <span class="cline-any cline-yes">55x</span>
569
- <span class="cline-any cline-yes">55x</span>
570
- <span class="cline-any cline-yes">55x</span>
571
- <span class="cline-any cline-yes">55x</span>
572
- <span class="cline-any cline-yes">55x</span>
573
- <span class="cline-any cline-yes">4x</span>
574
- <span class="cline-any cline-yes">4x</span>
575
- <span class="cline-any cline-yes">55x</span>
576
- <span class="cline-any cline-yes">55x</span>
577
- <span class="cline-any cline-yes">55x</span>
578
- <span class="cline-any cline-yes">55x</span>
579
- <span class="cline-any cline-yes">55x</span>
580
- <span class="cline-any cline-yes">55x</span>
581
- <span class="cline-any cline-yes">55x</span>
582
- <span class="cline-any cline-yes">55x</span>
583
- <span class="cline-any cline-yes">4x</span>
584
- <span class="cline-any cline-yes">2x</span>
585
- <span class="cline-any cline-yes">2x</span>
586
- <span class="cline-any cline-yes">2x</span>
587
- <span class="cline-any cline-yes">4x</span>
588
- <span class="cline-any cline-yes">55x</span>
589
- <span class="cline-any cline-yes">55x</span>
590
- <span class="cline-any cline-yes">55x</span>
591
- <span class="cline-any cline-yes">55x</span>
592
- <span class="cline-any cline-yes">55x</span>
593
- <span class="cline-any cline-yes">55x</span>
594
- <span class="cline-any cline-yes">55x</span>
595
- <span class="cline-any cline-yes">2x</span>
596
- <span class="cline-any cline-yes">2x</span>
597
- <span class="cline-any cline-yes">2x</span>
598
- <span class="cline-any cline-yes">2x</span>
599
- <span class="cline-any cline-yes">55x</span>
600
- <span class="cline-any cline-yes">55x</span>
601
- <span class="cline-any cline-yes">55x</span>
602
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { emitter } from "./emitter";
603
- import { resolveEquality } from "./equality";
604
- import { isPromiseLike } from "./isPromiseLike";
605
- import { onCreateHook } from "./onCreateHook";
606
- import { scheduleNotifyHook } from "./scheduleNotifyHook";
607
- import { AtomOptions, Equality, MutableAtom, SYMBOL_ATOM } from "./types";
608
- import { withUse } from "./withUse";
609
- &nbsp;
610
- /**
611
- * Creates a mutable atom - a reactive state container that holds a single value.
612
- *
613
- * Atoms support both synchronous and asynchronous (Promise) initial values.
614
- * When initialized with a Promise, the atom starts in a loading state and
615
- * automatically updates when the Promise resolves or rejects.
616
- *
617
- * Features:
618
- * - Lazy initialization: state is not created until first access
619
- * - Async support: accepts Promise values with loading/error states
620
- * - Equality checking: configurable equality for reducer-based updates
621
- * - Plugin system: chainable `.use()` method for extensions
622
- * - Subscriptions: `.on()` for change notifications
623
- *
624
- * @template T - The type of value stored in the atom
625
- * @param value - Initial value or Promise that resolves to the value
626
- * @param options - Configuration options
627
- * @param options.key - Optional identifier for debugging/devtools
628
- * @param options.equality - Equality strategy for change detection (default: strict)
629
- * @returns A mutable atom with value, loading, error states and set/reset methods
630
- *
631
- * @example Synchronous value
632
- * ```ts
633
- * const count = atom(0);
634
- * count.set(1);
635
- * count.set(prev =&gt; prev + 1);
636
- * console.log(count.value); // 2
637
- * ```
638
- *
639
- * @example Async value
640
- * ```ts
641
- * const user = atom(fetchUser(id));
642
- * console.log(user.loading); // true
643
- * await user;
644
- * console.log(user.value); // { name: "John", ... }
645
- * ```
646
- *
647
- * @example With equality option
648
- * ```ts
649
- * const state = atom({ count: 0 }, { equality: "shallow" });
650
- * state.set(prev =&gt; ({ ...prev })); // No notification (shallow equal)
651
- * ```
652
- */
653
- export function atom&lt;T&gt;(
654
- value: T | PromiseLike&lt;T&gt;,
655
- options: AtomOptions&lt;Awaited&lt;T&gt;&gt; = {}
656
- ): MutableAtom&lt;T&gt; {
657
- // Event emitter for notifying subscribers of state changes
658
- const changeEmitter = emitter();
659
- &nbsp;
660
- // Resolve equality strategy (strict, shallow, deep, or custom function)
661
- const eq = resolveEquality(options.equality as Equality&lt;unknown&gt;);
662
- &nbsp;
663
- // Internal state - undefined until first access (lazy initialization)
664
- let state:
665
- | {
666
- loading: boolean;
667
- value: Awaited&lt;T&gt; | undefined;
668
- error: any;
669
- promise: PromiseLike&lt;Awaited&lt;T&gt;&gt;;
670
- }
671
- | undefined;
672
- &nbsp;
673
- /**
674
- * Schedules notification to all subscribers.
675
- * Uses scheduleNotifyHook to allow batching of notifications.
676
- */
677
- const notify = () =&gt; {
678
- scheduleNotifyHook.current(changeEmitter.emit);
679
- };
680
- &nbsp;
681
- const setLoading = (
682
- promise: PromiseLike&lt;Awaited&lt;T&gt;&gt;,
683
- shouldNotify: boolean
684
- ) =&gt; {
685
- state = {
686
- loading: true,
687
- value: undefined,
688
- error: undefined,
689
- promise,
690
- };
691
- updateAsync();
692
- if (shouldNotify) notify();
693
- return state;
694
- };
695
- &nbsp;
696
- const setValue = (value: Awaited&lt;T&gt;, shouldNotify: boolean) =&gt; {
697
- state = {
698
- loading: false,
699
- value,
700
- error: undefined,
701
- promise: Promise.resolve(value),
702
- };
703
- if (shouldNotify) notify();
704
- return state;
705
- };
706
- &nbsp;
707
- /**
708
- * Lazily initializes the atom state on first access.
709
- * For sync values: creates resolved state immediately.
710
- * For async values: creates loading state and starts async resolution.
711
- */
712
- const tryInit = () =&gt; {
713
- if (state) return state;
714
- &nbsp;
715
- // Handle Promise/PromiseLike initial values
716
- if (isPromiseLike(value)) {
717
- return setLoading(value as PromiseLike&lt;Awaited&lt;T&gt;&gt;, false);
718
- }
719
- &nbsp;
720
- // Handle synchronous initial values
721
- return setValue(value as Awaited&lt;T&gt;, false);
722
- };
723
- &nbsp;
724
- /**
725
- * Handles async promise resolution/rejection.
726
- * Attaches then/catch handlers to the current promise and updates state
727
- * when it settles. Ignores stale results if state has changed.
728
- */
729
- const updateAsync = () =&gt; {
730
- if (!state || !state.loading) <span class="branch-0 cbranch-no" title="branch not covered" >return;</span>
731
- &nbsp;
732
- // Capture current state to detect if it becomes stale
733
- const prevState = state;
734
- &nbsp;
735
- const onDone = (status: "fulfilled" | "rejected", value: any) =&gt; {
736
- // Ignore if state has changed (e.g., set() was called while loading)
737
- if (state !== prevState) return;
738
- &nbsp;
739
- if (status === "fulfilled") {
740
- return setValue(value as Awaited&lt;T&gt;, true);
741
- }
742
- &nbsp;
743
- // Handle rejection
744
- state = {
745
- loading: false,
746
- value: undefined,
747
- error: value,
748
- promise: prevState.promise,
749
- };
750
- notify();
751
- };
752
- &nbsp;
753
- prevState.promise.then(
754
- (value) =&gt; onDone("fulfilled", value),
755
- (error) =&gt; onDone("rejected", error)
756
- );
757
- };
758
- &nbsp;
759
- /**
760
- * Updates the atom's value.
761
- *
762
- * Accepts either a direct value or a reducer function.
763
- * - Direct value: always updates and notifies (no equality check)
764
- * - Reducer function: computes new value from previous, only notifies if changed
765
- *
766
- * Special handling for loading state:
767
- * - Direct value: immediately resolves to the new value
768
- * - Reducer: chains onto the pending promise
769
- *
770
- * @param value - New value or reducer function (prev) =&gt; newValue
771
- */
772
- const set = (value: Awaited&lt;T&gt; | ((prev: Awaited&lt;T&gt;) =&gt; Awaited&lt;T&gt;)) =&gt; {
773
- const { value: currentValue, promise, loading, error } = tryInit();
774
- &nbsp;
775
- if (typeof value === "function") {
776
- try {
777
- const reducer = value as (prev: Awaited&lt;T&gt;) =&gt; Awaited&lt;T&gt;;
778
- &nbsp;
779
- // If still loading, chain the reducer onto the pending promise
780
- if (loading) {
781
- setLoading(promise.then(reducer), true);
782
- return;
783
- }
784
- &nbsp;
785
- // If there was an error, don't try to call reducer
786
- if (error) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
787
- <span class="cstat-no" title="statement not covered" > return;</span>
788
- <span class="cstat-no" title="statement not covered" > }</span>
789
- &nbsp;
790
- // Apply reducer and check equality
791
- const nextValue = reducer(currentValue as Awaited&lt;T&gt;);
792
- if (eq(nextValue, currentValue)) return;
793
- &nbsp;
794
- setValue(nextValue, true);
795
- return;
796
- <span class="branch-0 cbranch-no" title="branch not covered" > } catch (error) {</span>
797
- <span class="cstat-no" title="statement not covered" > state = {</span>
798
- <span class="cstat-no" title="statement not covered" > loading: false,</span>
799
- <span class="cstat-no" title="statement not covered" > value: undefined,</span>
800
- <span class="cstat-no" title="statement not covered" > error: error as any,</span>
801
- <span class="cstat-no" title="statement not covered" > promise: Promise.reject(error as any),</span>
802
- <span class="cstat-no" title="statement not covered" > };</span>
803
- <span class="cstat-no" title="statement not covered" > notify();</span>
804
- <span class="cstat-no" title="statement not covered" > return;</span>
805
- <span class="cstat-no" title="statement not covered" > }</span>
806
- }
807
- &nbsp;
808
- if (eq(value, currentValue)) <span class="branch-0 cbranch-no" title="branch not covered" >return;</span>
809
- // Direct value assignment - always updates and notifies
810
- setValue(value as Awaited&lt;T&gt;, true);
811
- };
812
- &nbsp;
813
- // Create the atom object with getters for lazy initialization
814
- const a = withUse({
815
- [SYMBOL_ATOM]: true,
816
- key: options.key,
817
- &nbsp;
818
- /** Current value (undefined while loading or on error) */
819
- get value() {
820
- tryInit();
821
- return state?.value;
822
- },
823
- &nbsp;
824
- /** Whether the atom is waiting for a Promise to resolve */
825
- get loading() {
826
- tryInit();
827
- return state?.loading || false;
828
- },
829
- &nbsp;
830
- /** Error from rejected Promise (undefined if no error) */
831
- get error() {
832
- tryInit();
833
- return state?.error;
834
- },
835
- &nbsp;
836
- /**
837
- * Makes the atom thenable (awaitable).
838
- * Allows: `const value = await atom;`
839
- */
840
- then() {
841
- return tryInit().promise.then(...arguments);
842
- },
843
- &nbsp;
844
- set,
845
- &nbsp;
846
- /**
847
- * Resets the atom to its initial state.
848
- * Re-evaluates the initial value on next access.
849
- */
850
- reset() {
851
- if (state) {
852
- state = undefined;
853
- changeEmitter.emit();
854
- }
855
- },
856
- &nbsp;
857
- /** Subscribe to value changes */
858
- on: changeEmitter.on,
859
- } as MutableAtom&lt;T&gt;);
860
- &nbsp;
861
- // Notify devtools/plugins of atom creation
862
- onCreateHook.current?.({
863
- type: "atom",
864
- key: options.key,
865
- atom: a,
866
- });
867
- &nbsp;
868
- return a;
869
- }
870
- &nbsp;</pre></td></tr></table></pre>
871
-
872
- <div class='push'></div><!-- for sticky footer -->
873
- </div><!-- /wrapper -->
874
- <div class='footer quiet pad2 space-top1 center small'>
875
- Code coverage generated by
876
- <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
877
- at 2026-01-16T14:35:38.788Z
878
- </div>
879
- <script src="../../prettify.js"></script>
880
- <script>
881
- window.onload = function () {
882
- prettyPrint();
883
- };
884
- </script>
885
- <script src="../../sorter.js"></script>
886
- <script src="../../block-navigation.js"></script>
887
- </body>
888
- </html>
889
-