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.
- package/README.md +1666 -0
- package/coverage/base.css +224 -0
- package/coverage/block-navigation.js +87 -0
- package/coverage/clover.xml +1440 -0
- package/coverage/coverage-final.json +14 -0
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +131 -0
- package/coverage/prettify.css +1 -0
- package/coverage/prettify.js +2 -0
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +210 -0
- package/coverage/src/core/atom.ts.html +889 -0
- package/coverage/src/core/batch.ts.html +223 -0
- package/coverage/src/core/define.ts.html +805 -0
- package/coverage/src/core/emitter.ts.html +919 -0
- package/coverage/src/core/equality.ts.html +631 -0
- package/coverage/src/core/hook.ts.html +460 -0
- package/coverage/src/core/index.html +281 -0
- package/coverage/src/core/isAtom.ts.html +100 -0
- package/coverage/src/core/isPromiseLike.ts.html +133 -0
- package/coverage/src/core/onCreateHook.ts.html +136 -0
- package/coverage/src/core/scheduleNotifyHook.ts.html +94 -0
- package/coverage/src/core/types.ts.html +523 -0
- package/coverage/src/core/withUse.ts.html +253 -0
- package/coverage/src/index.html +116 -0
- package/coverage/src/index.ts.html +106 -0
- package/dist/core/atom.d.ts +63 -0
- package/dist/core/atom.test.d.ts +1 -0
- package/dist/core/atomState.d.ts +104 -0
- package/dist/core/atomState.test.d.ts +1 -0
- package/dist/core/batch.d.ts +126 -0
- package/dist/core/batch.test.d.ts +1 -0
- package/dist/core/define.d.ts +173 -0
- package/dist/core/define.test.d.ts +1 -0
- package/dist/core/derived.d.ts +102 -0
- package/dist/core/derived.test.d.ts +1 -0
- package/dist/core/effect.d.ts +120 -0
- package/dist/core/effect.test.d.ts +1 -0
- package/dist/core/emitter.d.ts +237 -0
- package/dist/core/emitter.test.d.ts +1 -0
- package/dist/core/equality.d.ts +62 -0
- package/dist/core/equality.test.d.ts +1 -0
- package/dist/core/hook.d.ts +134 -0
- package/dist/core/hook.test.d.ts +1 -0
- package/dist/core/isAtom.d.ts +9 -0
- package/dist/core/isPromiseLike.d.ts +9 -0
- package/dist/core/isPromiseLike.test.d.ts +1 -0
- package/dist/core/onCreateHook.d.ts +79 -0
- package/dist/core/promiseCache.d.ts +134 -0
- package/dist/core/promiseCache.test.d.ts +1 -0
- package/dist/core/scheduleNotifyHook.d.ts +51 -0
- package/dist/core/select.d.ts +151 -0
- package/dist/core/selector.test.d.ts +1 -0
- package/dist/core/types.d.ts +279 -0
- package/dist/core/withUse.d.ts +38 -0
- package/dist/core/withUse.test.d.ts +1 -0
- package/dist/index-2ok7ilik.js +1217 -0
- package/dist/index-B_5SFzfl.cjs +1 -0
- package/dist/index.cjs +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.js +20 -0
- package/dist/index.test.d.ts +1 -0
- package/dist/react/index.cjs +30 -0
- package/dist/react/index.d.ts +7 -0
- package/dist/react/index.js +823 -0
- package/dist/react/rx.d.ts +250 -0
- package/dist/react/rx.test.d.ts +1 -0
- package/dist/react/strictModeTest.d.ts +10 -0
- package/dist/react/useAction.d.ts +381 -0
- package/dist/react/useAction.test.d.ts +1 -0
- package/dist/react/useStable.d.ts +183 -0
- package/dist/react/useStable.test.d.ts +1 -0
- package/dist/react/useValue.d.ts +134 -0
- package/dist/react/useValue.test.d.ts +1 -0
- package/package.json +57 -0
- package/scripts/publish.js +198 -0
- package/src/core/atom.test.ts +369 -0
- package/src/core/atom.ts +189 -0
- package/src/core/atomState.test.ts +342 -0
- package/src/core/atomState.ts +256 -0
- package/src/core/batch.test.ts +257 -0
- package/src/core/batch.ts +172 -0
- package/src/core/define.test.ts +342 -0
- package/src/core/define.ts +243 -0
- package/src/core/derived.test.ts +381 -0
- package/src/core/derived.ts +339 -0
- package/src/core/effect.test.ts +196 -0
- package/src/core/effect.ts +184 -0
- package/src/core/emitter.test.ts +364 -0
- package/src/core/emitter.ts +392 -0
- package/src/core/equality.test.ts +392 -0
- package/src/core/equality.ts +182 -0
- package/src/core/hook.test.ts +227 -0
- package/src/core/hook.ts +177 -0
- package/src/core/isAtom.ts +27 -0
- package/src/core/isPromiseLike.test.ts +72 -0
- package/src/core/isPromiseLike.ts +16 -0
- package/src/core/onCreateHook.ts +92 -0
- package/src/core/promiseCache.test.ts +239 -0
- package/src/core/promiseCache.ts +279 -0
- package/src/core/scheduleNotifyHook.ts +53 -0
- package/src/core/select.ts +454 -0
- package/src/core/selector.test.ts +257 -0
- package/src/core/types.ts +311 -0
- package/src/core/withUse.test.ts +249 -0
- package/src/core/withUse.ts +56 -0
- package/src/index.test.ts +80 -0
- package/src/index.ts +51 -0
- package/src/react/index.ts +20 -0
- package/src/react/rx.test.tsx +416 -0
- package/src/react/rx.tsx +300 -0
- package/src/react/strictModeTest.tsx +71 -0
- package/src/react/useAction.test.ts +989 -0
- package/src/react/useAction.ts +605 -0
- package/src/react/useStable.test.ts +553 -0
- package/src/react/useStable.ts +288 -0
- package/src/react/useValue.test.ts +182 -0
- package/src/react/useValue.ts +261 -0
- package/tsconfig.json +9 -0
- package/v2.md +725 -0
- 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"> </span>
|
|
520
|
+
<span class="cline-any cline-no"> </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"> </span>
|
|
530
|
+
<span class="cline-any cline-no"> </span>
|
|
531
|
+
<span class="cline-any cline-no"> </span>
|
|
532
|
+
<span class="cline-any cline-no"> </span>
|
|
533
|
+
<span class="cline-any cline-no"> </span>
|
|
534
|
+
<span class="cline-any cline-no"> </span>
|
|
535
|
+
<span class="cline-any cline-no"> </span>
|
|
536
|
+
<span class="cline-any cline-no"> </span>
|
|
537
|
+
<span class="cline-any cline-no"> </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"> </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
|
+
|
|
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 => 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 => ({ ...prev })); // No notification (shallow equal)
|
|
651
|
+
* ```
|
|
652
|
+
*/
|
|
653
|
+
export function atom<T>(
|
|
654
|
+
value: T | PromiseLike<T>,
|
|
655
|
+
options: AtomOptions<Awaited<T>> = {}
|
|
656
|
+
): MutableAtom<T> {
|
|
657
|
+
// Event emitter for notifying subscribers of state changes
|
|
658
|
+
const changeEmitter = emitter();
|
|
659
|
+
|
|
660
|
+
// Resolve equality strategy (strict, shallow, deep, or custom function)
|
|
661
|
+
const eq = resolveEquality(options.equality as Equality<unknown>);
|
|
662
|
+
|
|
663
|
+
// Internal state - undefined until first access (lazy initialization)
|
|
664
|
+
let state:
|
|
665
|
+
| {
|
|
666
|
+
loading: boolean;
|
|
667
|
+
value: Awaited<T> | undefined;
|
|
668
|
+
error: any;
|
|
669
|
+
promise: PromiseLike<Awaited<T>>;
|
|
670
|
+
}
|
|
671
|
+
| undefined;
|
|
672
|
+
|
|
673
|
+
/**
|
|
674
|
+
* Schedules notification to all subscribers.
|
|
675
|
+
* Uses scheduleNotifyHook to allow batching of notifications.
|
|
676
|
+
*/
|
|
677
|
+
const notify = () => {
|
|
678
|
+
scheduleNotifyHook.current(changeEmitter.emit);
|
|
679
|
+
};
|
|
680
|
+
|
|
681
|
+
const setLoading = (
|
|
682
|
+
promise: PromiseLike<Awaited<T>>,
|
|
683
|
+
shouldNotify: boolean
|
|
684
|
+
) => {
|
|
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
|
+
|
|
696
|
+
const setValue = (value: Awaited<T>, shouldNotify: boolean) => {
|
|
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
|
+
|
|
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 = () => {
|
|
713
|
+
if (state) return state;
|
|
714
|
+
|
|
715
|
+
// Handle Promise/PromiseLike initial values
|
|
716
|
+
if (isPromiseLike(value)) {
|
|
717
|
+
return setLoading(value as PromiseLike<Awaited<T>>, false);
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
// Handle synchronous initial values
|
|
721
|
+
return setValue(value as Awaited<T>, false);
|
|
722
|
+
};
|
|
723
|
+
|
|
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 = () => {
|
|
730
|
+
if (!state || !state.loading) <span class="branch-0 cbranch-no" title="branch not covered" >return;</span>
|
|
731
|
+
|
|
732
|
+
// Capture current state to detect if it becomes stale
|
|
733
|
+
const prevState = state;
|
|
734
|
+
|
|
735
|
+
const onDone = (status: "fulfilled" | "rejected", value: any) => {
|
|
736
|
+
// Ignore if state has changed (e.g., set() was called while loading)
|
|
737
|
+
if (state !== prevState) return;
|
|
738
|
+
|
|
739
|
+
if (status === "fulfilled") {
|
|
740
|
+
return setValue(value as Awaited<T>, true);
|
|
741
|
+
}
|
|
742
|
+
|
|
743
|
+
// Handle rejection
|
|
744
|
+
state = {
|
|
745
|
+
loading: false,
|
|
746
|
+
value: undefined,
|
|
747
|
+
error: value,
|
|
748
|
+
promise: prevState.promise,
|
|
749
|
+
};
|
|
750
|
+
notify();
|
|
751
|
+
};
|
|
752
|
+
|
|
753
|
+
prevState.promise.then(
|
|
754
|
+
(value) => onDone("fulfilled", value),
|
|
755
|
+
(error) => onDone("rejected", error)
|
|
756
|
+
);
|
|
757
|
+
};
|
|
758
|
+
|
|
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) => newValue
|
|
771
|
+
*/
|
|
772
|
+
const set = (value: Awaited<T> | ((prev: Awaited<T>) => Awaited<T>)) => {
|
|
773
|
+
const { value: currentValue, promise, loading, error } = tryInit();
|
|
774
|
+
|
|
775
|
+
if (typeof value === "function") {
|
|
776
|
+
try {
|
|
777
|
+
const reducer = value as (prev: Awaited<T>) => Awaited<T>;
|
|
778
|
+
|
|
779
|
+
// If still loading, chain the reducer onto the pending promise
|
|
780
|
+
if (loading) {
|
|
781
|
+
setLoading(promise.then(reducer), true);
|
|
782
|
+
return;
|
|
783
|
+
}
|
|
784
|
+
|
|
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
|
+
|
|
790
|
+
// Apply reducer and check equality
|
|
791
|
+
const nextValue = reducer(currentValue as Awaited<T>);
|
|
792
|
+
if (eq(nextValue, currentValue)) return;
|
|
793
|
+
|
|
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
|
+
|
|
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<T>, true);
|
|
811
|
+
};
|
|
812
|
+
|
|
813
|
+
// Create the atom object with getters for lazy initialization
|
|
814
|
+
const a = withUse({
|
|
815
|
+
[SYMBOL_ATOM]: true,
|
|
816
|
+
key: options.key,
|
|
817
|
+
|
|
818
|
+
/** Current value (undefined while loading or on error) */
|
|
819
|
+
get value() {
|
|
820
|
+
tryInit();
|
|
821
|
+
return state?.value;
|
|
822
|
+
},
|
|
823
|
+
|
|
824
|
+
/** Whether the atom is waiting for a Promise to resolve */
|
|
825
|
+
get loading() {
|
|
826
|
+
tryInit();
|
|
827
|
+
return state?.loading || false;
|
|
828
|
+
},
|
|
829
|
+
|
|
830
|
+
/** Error from rejected Promise (undefined if no error) */
|
|
831
|
+
get error() {
|
|
832
|
+
tryInit();
|
|
833
|
+
return state?.error;
|
|
834
|
+
},
|
|
835
|
+
|
|
836
|
+
/**
|
|
837
|
+
* Makes the atom thenable (awaitable).
|
|
838
|
+
* Allows: `const value = await atom;`
|
|
839
|
+
*/
|
|
840
|
+
then() {
|
|
841
|
+
return tryInit().promise.then(...arguments);
|
|
842
|
+
},
|
|
843
|
+
|
|
844
|
+
set,
|
|
845
|
+
|
|
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
|
+
|
|
857
|
+
/** Subscribe to value changes */
|
|
858
|
+
on: changeEmitter.on,
|
|
859
|
+
} as MutableAtom<T>);
|
|
860
|
+
|
|
861
|
+
// Notify devtools/plugins of atom creation
|
|
862
|
+
onCreateHook.current?.({
|
|
863
|
+
type: "atom",
|
|
864
|
+
key: options.key,
|
|
865
|
+
atom: a,
|
|
866
|
+
});
|
|
867
|
+
|
|
868
|
+
return a;
|
|
869
|
+
}
|
|
870
|
+
</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
|
+
|