atomirx 0.0.1

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 (121) hide show
  1. package/README.md +1666 -0
  2. package/coverage/base.css +224 -0
  3. package/coverage/block-navigation.js +87 -0
  4. package/coverage/clover.xml +1440 -0
  5. package/coverage/coverage-final.json +14 -0
  6. package/coverage/favicon.png +0 -0
  7. package/coverage/index.html +131 -0
  8. package/coverage/prettify.css +1 -0
  9. package/coverage/prettify.js +2 -0
  10. package/coverage/sort-arrow-sprite.png +0 -0
  11. package/coverage/sorter.js +210 -0
  12. package/coverage/src/core/atom.ts.html +889 -0
  13. package/coverage/src/core/batch.ts.html +223 -0
  14. package/coverage/src/core/define.ts.html +805 -0
  15. package/coverage/src/core/emitter.ts.html +919 -0
  16. package/coverage/src/core/equality.ts.html +631 -0
  17. package/coverage/src/core/hook.ts.html +460 -0
  18. package/coverage/src/core/index.html +281 -0
  19. package/coverage/src/core/isAtom.ts.html +100 -0
  20. package/coverage/src/core/isPromiseLike.ts.html +133 -0
  21. package/coverage/src/core/onCreateHook.ts.html +136 -0
  22. package/coverage/src/core/scheduleNotifyHook.ts.html +94 -0
  23. package/coverage/src/core/types.ts.html +523 -0
  24. package/coverage/src/core/withUse.ts.html +253 -0
  25. package/coverage/src/index.html +116 -0
  26. package/coverage/src/index.ts.html +106 -0
  27. package/dist/core/atom.d.ts +63 -0
  28. package/dist/core/atom.test.d.ts +1 -0
  29. package/dist/core/atomState.d.ts +104 -0
  30. package/dist/core/atomState.test.d.ts +1 -0
  31. package/dist/core/batch.d.ts +126 -0
  32. package/dist/core/batch.test.d.ts +1 -0
  33. package/dist/core/define.d.ts +173 -0
  34. package/dist/core/define.test.d.ts +1 -0
  35. package/dist/core/derived.d.ts +102 -0
  36. package/dist/core/derived.test.d.ts +1 -0
  37. package/dist/core/effect.d.ts +120 -0
  38. package/dist/core/effect.test.d.ts +1 -0
  39. package/dist/core/emitter.d.ts +237 -0
  40. package/dist/core/emitter.test.d.ts +1 -0
  41. package/dist/core/equality.d.ts +62 -0
  42. package/dist/core/equality.test.d.ts +1 -0
  43. package/dist/core/hook.d.ts +134 -0
  44. package/dist/core/hook.test.d.ts +1 -0
  45. package/dist/core/isAtom.d.ts +9 -0
  46. package/dist/core/isPromiseLike.d.ts +9 -0
  47. package/dist/core/isPromiseLike.test.d.ts +1 -0
  48. package/dist/core/onCreateHook.d.ts +79 -0
  49. package/dist/core/promiseCache.d.ts +134 -0
  50. package/dist/core/promiseCache.test.d.ts +1 -0
  51. package/dist/core/scheduleNotifyHook.d.ts +51 -0
  52. package/dist/core/select.d.ts +151 -0
  53. package/dist/core/selector.test.d.ts +1 -0
  54. package/dist/core/types.d.ts +279 -0
  55. package/dist/core/withUse.d.ts +38 -0
  56. package/dist/core/withUse.test.d.ts +1 -0
  57. package/dist/index-2ok7ilik.js +1217 -0
  58. package/dist/index-B_5SFzfl.cjs +1 -0
  59. package/dist/index.cjs +1 -0
  60. package/dist/index.d.ts +14 -0
  61. package/dist/index.js +20 -0
  62. package/dist/index.test.d.ts +1 -0
  63. package/dist/react/index.cjs +30 -0
  64. package/dist/react/index.d.ts +7 -0
  65. package/dist/react/index.js +823 -0
  66. package/dist/react/rx.d.ts +250 -0
  67. package/dist/react/rx.test.d.ts +1 -0
  68. package/dist/react/strictModeTest.d.ts +10 -0
  69. package/dist/react/useAction.d.ts +381 -0
  70. package/dist/react/useAction.test.d.ts +1 -0
  71. package/dist/react/useStable.d.ts +183 -0
  72. package/dist/react/useStable.test.d.ts +1 -0
  73. package/dist/react/useValue.d.ts +134 -0
  74. package/dist/react/useValue.test.d.ts +1 -0
  75. package/package.json +57 -0
  76. package/scripts/publish.js +198 -0
  77. package/src/core/atom.test.ts +369 -0
  78. package/src/core/atom.ts +189 -0
  79. package/src/core/atomState.test.ts +342 -0
  80. package/src/core/atomState.ts +256 -0
  81. package/src/core/batch.test.ts +257 -0
  82. package/src/core/batch.ts +172 -0
  83. package/src/core/define.test.ts +342 -0
  84. package/src/core/define.ts +243 -0
  85. package/src/core/derived.test.ts +381 -0
  86. package/src/core/derived.ts +339 -0
  87. package/src/core/effect.test.ts +196 -0
  88. package/src/core/effect.ts +184 -0
  89. package/src/core/emitter.test.ts +364 -0
  90. package/src/core/emitter.ts +392 -0
  91. package/src/core/equality.test.ts +392 -0
  92. package/src/core/equality.ts +182 -0
  93. package/src/core/hook.test.ts +227 -0
  94. package/src/core/hook.ts +177 -0
  95. package/src/core/isAtom.ts +27 -0
  96. package/src/core/isPromiseLike.test.ts +72 -0
  97. package/src/core/isPromiseLike.ts +16 -0
  98. package/src/core/onCreateHook.ts +92 -0
  99. package/src/core/promiseCache.test.ts +239 -0
  100. package/src/core/promiseCache.ts +279 -0
  101. package/src/core/scheduleNotifyHook.ts +53 -0
  102. package/src/core/select.ts +454 -0
  103. package/src/core/selector.test.ts +257 -0
  104. package/src/core/types.ts +311 -0
  105. package/src/core/withUse.test.ts +249 -0
  106. package/src/core/withUse.ts +56 -0
  107. package/src/index.test.ts +80 -0
  108. package/src/index.ts +51 -0
  109. package/src/react/index.ts +20 -0
  110. package/src/react/rx.test.tsx +416 -0
  111. package/src/react/rx.tsx +300 -0
  112. package/src/react/strictModeTest.tsx +71 -0
  113. package/src/react/useAction.test.ts +989 -0
  114. package/src/react/useAction.ts +605 -0
  115. package/src/react/useStable.test.ts +553 -0
  116. package/src/react/useStable.ts +288 -0
  117. package/src/react/useValue.test.ts +182 -0
  118. package/src/react/useValue.ts +261 -0
  119. package/tsconfig.json +9 -0
  120. package/v2.md +725 -0
  121. package/vite.config.ts +39 -0
@@ -0,0 +1,889 @@
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
+