@zajno/common 1.3.3 → 1.3.7

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 (88) hide show
  1. package/coverage/clover.xml +80 -25
  2. package/coverage/coverage-final.json +3 -2
  3. package/coverage/lcov-report/index.html +35 -20
  4. package/coverage/lcov-report/src/__tests__/helpers/index.html +1 -1
  5. package/coverage/lcov-report/src/__tests__/helpers/main.ts.html +1 -1
  6. package/coverage/lcov-report/src/async/arrays.ts.html +1 -1
  7. package/coverage/lcov-report/src/async/index.html +1 -1
  8. package/coverage/lcov-report/src/dates/calc.ts.html +1 -1
  9. package/coverage/lcov-report/src/dates/convert.ts.html +1 -1
  10. package/coverage/lcov-report/src/dates/datex.ts.html +1 -1
  11. package/coverage/lcov-report/src/dates/format.ts.html +1 -1
  12. package/coverage/lcov-report/src/dates/index.html +1 -1
  13. package/coverage/lcov-report/src/dates/index.ts.html +1 -1
  14. package/coverage/lcov-report/src/dates/parse.ts.html +1 -1
  15. package/coverage/lcov-report/src/dates/period.ts.html +1 -1
  16. package/coverage/lcov-report/src/dates/shift.ts.html +1 -1
  17. package/coverage/lcov-report/src/dates/types.ts.html +1 -1
  18. package/coverage/lcov-report/src/dates/yearDate.ts.html +1 -1
  19. package/coverage/lcov-report/src/enumHelper.ts.html +1 -1
  20. package/coverage/lcov-report/src/event.ts.html +1 -1
  21. package/coverage/lcov-report/src/fields/index.html +111 -0
  22. package/coverage/lcov-report/src/{viewModels/SelectViewModel.ts.html → fields/update.ts.html} +118 -178
  23. package/coverage/lcov-report/src/index.html +1 -1
  24. package/coverage/lcov-report/src/lazy.light.ts.html +1 -1
  25. package/coverage/lcov-report/src/logger/batch.ts.html +1 -1
  26. package/coverage/lcov-report/src/logger/console.ts.html +1 -1
  27. package/coverage/lcov-report/src/logger/index.html +1 -1
  28. package/coverage/lcov-report/src/logger/index.ts.html +1 -1
  29. package/coverage/lcov-report/src/logger/named.ts.html +1 -1
  30. package/coverage/lcov-report/src/logger/proxy.ts.html +1 -1
  31. package/coverage/lcov-report/src/math/arrays.ts.html +1 -1
  32. package/coverage/lcov-report/src/math/calc.ts.html +1 -1
  33. package/coverage/lcov-report/src/math/distribution.ts.html +1 -1
  34. package/coverage/lcov-report/src/math/index.html +1 -1
  35. package/coverage/lcov-report/src/math/index.ts.html +1 -1
  36. package/coverage/lcov-report/src/transitionObserver.ts.html +1 -1
  37. package/coverage/lcov-report/src/types.ts.html +1 -1
  38. package/coverage/lcov-report/src/validation/ValidationErrors.ts.html +1 -1
  39. package/coverage/lcov-report/src/validation/creditCard.ts.html +1 -1
  40. package/coverage/lcov-report/src/validation/helpers.ts.html +1 -1
  41. package/coverage/lcov-report/src/validation/index.html +1 -1
  42. package/coverage/lcov-report/src/validation/index.ts.html +1 -1
  43. package/coverage/lcov-report/src/validation/types.ts.html +1 -1
  44. package/coverage/lcov-report/src/validation/validators.ts.html +1 -1
  45. package/coverage/lcov-report/src/validation/wrappers.ts.html +1 -1
  46. package/coverage/lcov-report/src/viewModels/FlagModel.ts.html +51 -9
  47. package/coverage/lcov-report/src/viewModels/MultiSelectModel.ts.html +1 -1
  48. package/coverage/lcov-report/src/viewModels/NumberModel.ts.html +1 -1
  49. package/coverage/lcov-report/src/viewModels/SelectModel.ts.html +1 -1
  50. package/coverage/lcov-report/src/viewModels/Validatable.ts.html +34 -10
  51. package/coverage/lcov-report/src/viewModels/index.html +29 -29
  52. package/coverage/lcov-report/src/viewModels/wrappers.ts.html +1 -1
  53. package/coverage/lcov-report/update.ts.html +374 -0
  54. package/coverage/lcov.info +189 -51
  55. package/lib/fields/update.d.ts +17 -6
  56. package/lib/fields/update.d.ts.map +1 -1
  57. package/lib/fields/update.js +29 -13
  58. package/lib/fields/update.js.map +1 -1
  59. package/lib/ident.d.ts +6 -0
  60. package/lib/ident.d.ts.map +1 -0
  61. package/lib/ident.js +3 -0
  62. package/lib/ident.js.map +1 -0
  63. package/lib/unsubscriber.d.ts +4 -0
  64. package/lib/unsubscriber.d.ts.map +1 -1
  65. package/lib/unsubscriber.js +8 -1
  66. package/lib/unsubscriber.js.map +1 -1
  67. package/lib/viewModels/FlagModel.d.ts +2 -0
  68. package/lib/viewModels/FlagModel.d.ts.map +1 -1
  69. package/lib/viewModels/FlagModel.js +18 -0
  70. package/lib/viewModels/FlagModel.js.map +1 -1
  71. package/lib/viewModels/PromptModal.d.ts.map +1 -1
  72. package/lib/viewModels/PromptModal.js +1 -1
  73. package/lib/viewModels/PromptModal.js.map +1 -1
  74. package/lib/viewModels/Validatable.d.ts +2 -1
  75. package/lib/viewModels/Validatable.d.ts.map +1 -1
  76. package/lib/viewModels/Validatable.js +7 -0
  77. package/lib/viewModels/Validatable.js.map +1 -1
  78. package/package.json +1 -1
  79. package/src/fields/__tests__/fields.update.test.ts +73 -0
  80. package/src/fields/update.ts +54 -20
  81. package/src/ident.ts +8 -0
  82. package/src/unsubscriber.ts +7 -0
  83. package/src/viewModels/FlagModel.ts +14 -0
  84. package/src/viewModels/PromptModal.ts +1 -1
  85. package/src/viewModels/Validatable.ts +8 -0
  86. package/coverage/lcov-report/src/viewModels/LabeledFlagModel.ts.html +0 -146
  87. package/coverage/lcov-report/transitionObserver.ts.html +0 -572
  88. package/yarn-error.log +0 -3709
@@ -3,7 +3,7 @@
3
3
  <html lang="en">
4
4
 
5
5
  <head>
6
- <title>Code coverage report for src/viewModels/SelectViewModel.ts</title>
6
+ <title>Code coverage report for src/fields/update.ts</title>
7
7
  <meta charset="utf-8" />
8
8
  <link rel="stylesheet" href="../../prettify.css" />
9
9
  <link rel="stylesheet" href="../../base.css" />
@@ -19,34 +19,34 @@
19
19
  <body>
20
20
  <div class='wrapper'>
21
21
  <div class='pad1'>
22
- <h1><a href="../../index.html">All files</a> / <a href="index.html">src/viewModels</a> SelectViewModel.ts</h1>
22
+ <h1><a href="../../index.html">All files</a> / <a href="index.html">src/fields</a> update.ts</h1>
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">100% </span>
26
+ <span class="strong">73.33% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>58/58</span>
28
+ <span class='fraction'>33/45</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">100% </span>
33
+ <span class="strong">80% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>14/14</span>
35
+ <span class='fraction'>40/50</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">100% </span>
40
+ <span class="strong">45.45% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>24/24</span>
42
+ <span class='fraction'>5/11</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">100% </span>
47
+ <span class="strong">78.38% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>49/49</span>
49
+ <span class='fraction'>29/37</span>
50
50
  </div>
51
51
 
52
52
 
@@ -55,7 +55,7 @@
55
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
56
  </p>
57
57
  </div>
58
- <div class='status-line high'></div>
58
+ <div class='status-line medium'></div>
59
59
  <pre><table class="coverage">
60
60
  <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
61
61
  <a name='L2'></a><a href='#L2'>2</a>
@@ -155,261 +155,201 @@
155
155
  <a name='L96'></a><a href='#L96'>96</a>
156
156
  <a name='L97'></a><a href='#L97'>97</a>
157
157
  <a name='L98'></a><a href='#L98'>98</a>
158
- <a name='L99'></a><a href='#L99'>99</a>
159
- <a name='L100'></a><a href='#L100'>100</a>
160
- <a name='L101'></a><a href='#L101'>101</a>
161
- <a name='L102'></a><a href='#L102'>102</a>
162
- <a name='L103'></a><a href='#L103'>103</a>
163
- <a name='L104'></a><a href='#L104'>104</a>
164
- <a name='L105'></a><a href='#L105'>105</a>
165
- <a name='L106'></a><a href='#L106'>106</a>
166
- <a name='L107'></a><a href='#L107'>107</a>
167
- <a name='L108'></a><a href='#L108'>108</a>
168
- <a name='L109'></a><a href='#L109'>109</a>
169
- <a name='L110'></a><a href='#L110'>110</a>
170
- <a name='L111'></a><a href='#L111'>111</a>
171
- <a name='L112'></a><a href='#L112'>112</a>
172
- <a name='L113'></a><a href='#L113'>113</a>
173
- <a name='L114'></a><a href='#L114'>114</a>
174
- <a name='L115'></a><a href='#L115'>115</a>
175
- <a name='L116'></a><a href='#L116'>116</a>
176
- <a name='L117'></a><a href='#L117'>117</a>
177
- <a name='L118'></a><a href='#L118'>118</a>
178
- <a name='L119'></a><a href='#L119'>119</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
179
- <span class="cline-any cline-yes">1x</span>
180
- <span class="cline-any cline-yes">1x</span>
181
- <span class="cline-any cline-yes">1x</span>
158
+ <a name='L99'></a><a href='#L99'>99</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
182
159
  <span class="cline-any cline-neutral">&nbsp;</span>
183
- <span class="cline-any cline-yes">1x</span>
184
160
  <span class="cline-any cline-neutral">&nbsp;</span>
185
- <span class="cline-any cline-yes">5x</span>
186
161
  <span class="cline-any cline-neutral">&nbsp;</span>
187
162
  <span class="cline-any cline-neutral">&nbsp;</span>
188
- <span class="cline-any cline-yes">5x</span>
189
163
  <span class="cline-any cline-neutral">&nbsp;</span>
190
- <span class="cline-any cline-yes">5x</span>
191
- <span class="cline-any cline-yes">5x</span>
192
164
  <span class="cline-any cline-neutral">&nbsp;</span>
193
- <span class="cline-any cline-yes">5x</span>
194
165
  <span class="cline-any cline-neutral">&nbsp;</span>
195
166
  <span class="cline-any cline-neutral">&nbsp;</span>
196
- <span class="cline-any cline-yes">5x</span>
197
- <span class="cline-any cline-yes">5x</span>
198
167
  <span class="cline-any cline-neutral">&nbsp;</span>
168
+ <span class="cline-any cline-yes">1x</span>
169
+ <span class="cline-any cline-no">&nbsp;</span>
199
170
  <span class="cline-any cline-neutral">&nbsp;</span>
200
- <span class="cline-any cline-yes">5x</span>
201
- <span class="cline-any cline-yes">5x</span>
202
171
  <span class="cline-any cline-neutral">&nbsp;</span>
172
+ <span class="cline-any cline-yes">1x</span>
203
173
  <span class="cline-any cline-neutral">&nbsp;</span>
204
174
  <span class="cline-any cline-neutral">&nbsp;</span>
205
- <span class="cline-any cline-yes">1x</span>
206
- <span class="cline-any cline-yes">34x</span>
207
175
  <span class="cline-any cline-neutral">&nbsp;</span>
208
176
  <span class="cline-any cline-neutral">&nbsp;</span>
209
177
  <span class="cline-any cline-neutral">&nbsp;</span>
210
- <span class="cline-any cline-yes">8x</span>
211
178
  <span class="cline-any cline-neutral">&nbsp;</span>
212
179
  <span class="cline-any cline-neutral">&nbsp;</span>
213
180
  <span class="cline-any cline-neutral">&nbsp;</span>
214
- <span class="cline-any cline-yes">1x</span>
181
+ <span class="cline-any cline-no">&nbsp;</span>
215
182
  <span class="cline-any cline-neutral">&nbsp;</span>
183
+ <span class="cline-any cline-no">&nbsp;</span>
216
184
  <span class="cline-any cline-neutral">&nbsp;</span>
185
+ <span class="cline-any cline-no">&nbsp;</span>
186
+ <span class="cline-any cline-no">&nbsp;</span>
187
+ <span class="cline-any cline-no">&nbsp;</span>
188
+ <span class="cline-any cline-no">&nbsp;</span>
217
189
  <span class="cline-any cline-neutral">&nbsp;</span>
218
- <span class="cline-any cline-yes">1x</span>
190
+ <span class="cline-any cline-neutral">&nbsp;</span>
191
+ <span class="cline-any cline-no">&nbsp;</span>
219
192
  <span class="cline-any cline-neutral">&nbsp;</span>
220
193
  <span class="cline-any cline-neutral">&nbsp;</span>
221
194
  <span class="cline-any cline-neutral">&nbsp;</span>
195
+ <span class="cline-any cline-yes">38x</span>
222
196
  <span class="cline-any cline-yes">1x</span>
223
197
  <span class="cline-any cline-neutral">&nbsp;</span>
224
198
  <span class="cline-any cline-neutral">&nbsp;</span>
225
199
  <span class="cline-any cline-neutral">&nbsp;</span>
226
- <span class="cline-any cline-yes">6x</span>
227
- <span class="cline-any cline-yes">6x</span>
228
200
  <span class="cline-any cline-neutral">&nbsp;</span>
229
201
  <span class="cline-any cline-neutral">&nbsp;</span>
230
202
  <span class="cline-any cline-neutral">&nbsp;</span>
231
- <span class="cline-any cline-yes">4x</span>
232
- <span class="cline-any cline-yes">4x</span>
233
- <span class="cline-any cline-yes">3x</span>
234
203
  <span class="cline-any cline-neutral">&nbsp;</span>
235
204
  <span class="cline-any cline-neutral">&nbsp;</span>
236
205
  <span class="cline-any cline-neutral">&nbsp;</span>
206
+ <span class="cline-any cline-yes">1x</span>
237
207
  <span class="cline-any cline-neutral">&nbsp;</span>
238
- <span class="cline-any cline-yes">4x</span>
239
208
  <span class="cline-any cline-neutral">&nbsp;</span>
240
209
  <span class="cline-any cline-neutral">&nbsp;</span>
241
210
  <span class="cline-any cline-neutral">&nbsp;</span>
242
- <span class="cline-any cline-yes">5x</span>
243
- <span class="cline-any cline-yes">5x</span>
244
- <span class="cline-any cline-yes">4x</span>
211
+ <span class="cline-any cline-yes">6x</span>
212
+ <span class="cline-any cline-yes">1x</span>
245
213
  <span class="cline-any cline-neutral">&nbsp;</span>
246
214
  <span class="cline-any cline-neutral">&nbsp;</span>
215
+ <span class="cline-any cline-yes">5x</span>
216
+ <span class="cline-any cline-yes">5x</span>
247
217
  <span class="cline-any cline-neutral">&nbsp;</span>
248
218
  <span class="cline-any cline-neutral">&nbsp;</span>
249
- <span class="cline-any cline-yes">11x</span>
250
219
  <span class="cline-any cline-neutral">&nbsp;</span>
220
+ <span class="cline-any cline-yes">5x</span>
221
+ <span class="cline-any cline-yes">5x</span>
251
222
  <span class="cline-any cline-neutral">&nbsp;</span>
252
223
  <span class="cline-any cline-neutral">&nbsp;</span>
253
- <span class="cline-any cline-yes">17x</span>
254
224
  <span class="cline-any cline-yes">5x</span>
225
+ <span class="cline-any cline-yes">5x</span>
226
+ <span class="cline-any cline-yes">31x</span>
227
+ <span class="cline-any cline-yes">10x</span>
228
+ <span class="cline-any cline-yes">10x</span>
229
+ <span class="cline-any cline-yes">10x</span>
255
230
  <span class="cline-any cline-neutral">&nbsp;</span>
256
231
  <span class="cline-any cline-neutral">&nbsp;</span>
257
- <span class="cline-any cline-yes">12x</span>
258
232
  <span class="cline-any cline-neutral">&nbsp;</span>
259
233
  <span class="cline-any cline-neutral">&nbsp;</span>
260
- <span class="cline-any cline-yes">12x</span>
261
- <span class="cline-any cline-yes">12x</span>
262
234
  <span class="cline-any cline-neutral">&nbsp;</span>
235
+ <span class="cline-any cline-yes">5x</span>
236
+ <span class="cline-any cline-yes">15x</span>
263
237
  <span class="cline-any cline-yes">12x</span>
264
- <span class="cline-any cline-yes">33x</span>
265
- <span class="cline-any cline-neutral">&nbsp;</span>
266
- <span class="cline-any cline-neutral">&nbsp;</span>
267
238
  <span class="cline-any cline-yes">12x</span>
268
- <span class="cline-any cline-neutral">&nbsp;</span>
269
- <span class="cline-any cline-neutral">&nbsp;</span>
270
- <span class="cline-any cline-neutral">&nbsp;</span>
239
+ <span class="cline-any cline-yes">7x</span>
240
+ <span class="cline-any cline-yes">7x</span>
271
241
  <span class="cline-any cline-yes">5x</span>
272
242
  <span class="cline-any cline-yes">1x</span>
273
243
  <span class="cline-any cline-neutral">&nbsp;</span>
274
244
  <span class="cline-any cline-neutral">&nbsp;</span>
275
245
  <span class="cline-any cline-neutral">&nbsp;</span>
276
- <span class="cline-any cline-yes">3x</span>
277
- <span class="cline-any cline-yes">3x</span>
278
- <span class="cline-any cline-neutral">&nbsp;</span>
279
- <span class="cline-any cline-neutral">&nbsp;</span>
280
- <span class="cline-any cline-yes">1x</span>
281
- <span class="cline-any cline-yes">19x</span>
282
- <span class="cline-any cline-yes">16x</span>
283
- <span class="cline-any cline-yes">8x</span>
284
- <span class="cline-any cline-neutral">&nbsp;</span>
285
- <span class="cline-any cline-neutral">&nbsp;</span>
286
- <span class="cline-any cline-neutral">&nbsp;</span>
287
- <span class="cline-any cline-yes">1x</span>
246
+ <span class="cline-any cline-yes">5x</span>
247
+ <span class="cline-any cline-yes">5x</span>
248
+ <span class="cline-any cline-yes">4x</span>
288
249
  <span class="cline-any cline-neutral">&nbsp;</span>
289
250
  <span class="cline-any cline-neutral">&nbsp;</span>
251
+ <span class="cline-any cline-yes">5x</span>
290
252
  <span class="cline-any cline-neutral">&nbsp;</span>
291
- <span class="cline-any cline-yes">1x</span>
292
253
  <span class="cline-any cline-neutral">&nbsp;</span>
293
- <span class="cline-any cline-yes">3x</span>
294
254
  <span class="cline-any cline-neutral">&nbsp;</span>
295
255
  <span class="cline-any cline-neutral">&nbsp;</span>
296
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { createLazy } from '../lazy.light';
297
- import { observable, computed, makeObservable, reaction } from 'mobx';
298
- import { FlagModel } from './FlagModel';
299
- import { ILabeledFlagModel, LabeledFlagModel } from './LabeledFlagModel';
256
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { Comparator } from '../types';
300
257
  &nbsp;
301
- export class Select&lt;T = any&gt; {
302
- @observable
303
- private _index: number = undefined;
304
- &nbsp;
305
- @observable
306
- public error: boolean = undefined;
307
- &nbsp;
308
- private readonly _opened = new FlagModel();
309
- private _indexLocked = false;
310
- &nbsp;
311
- private readonly _flags = createLazy(() =&gt; this.createFlags());
258
+ export namespace Fields {
259
+ export type Getter&lt;T&gt; = (obj: Partial&lt;T&gt;) =&gt; T[keyof T];
260
+ export type Setter&lt;T&gt; = (obj: Partial&lt;T&gt;, val: T[keyof T]) =&gt; void;
261
+ export type Comparer&lt;T&gt; = (source: Partial&lt;T&gt;, target: Partial&lt;T&gt;) =&gt; boolean;
262
+ export type Updater&lt;T&gt; = (target: T, source: T) =&gt; T;
263
+ }
312
264
  &nbsp;
313
- constructor(
314
- private readonly _items: readonly T[],
315
- private readonly _accessor: (item: T) =&gt; string,
316
- initialIndex: number = undefined,
317
- ) {
318
- makeObservable(this);
319
- this._index = initialIndex;
320
- }
321
265
  &nbsp;
322
- @computed
323
- get values(): readonly string[] {
324
- return this._items.map(i =&gt; this._accessor(i));
325
- }
266
+ export function <span class="fstat-no" title="function not covered" >updateField&lt;</span>T&gt;(target: T, source: Partial&lt;T&gt;, diff: Partial&lt;T&gt;, key: keyof T, hasChanged: Fields.Comparer&lt;T&gt; = <span class="branch-0 cbranch-no" title="branch not covered" >null)</span>: boolean {
267
+ <span class="cstat-no" title="statement not covered" > return updateFieldExtended(target, source, diff, <span class="fstat-no" title="function not covered" >t </span>=&gt; <span class="cstat-no" title="statement not covered" >t[key],</span> <span class="fstat-no" title="function not covered" >(t</span>, v) =&gt; <span class="cstat-no" title="statement not covered" >t[key] = v,</span> hasChanged);</span>
268
+ }
326
269
  &nbsp;
327
- get flags(): ReadonlyArray&lt;ILabeledFlagModel&gt; {
328
- return this._flags.value;
329
- }
270
+ export function <span class="fstat-no" title="function not covered" >updateFieldExtended&lt;</span>T&gt;(
271
+ target: T,
272
+ source: Partial&lt;T&gt;,
273
+ diff: Partial&lt;T&gt;,
274
+ get: Fields.Getter&lt;T&gt;,
275
+ set: Fields.Setter&lt;T&gt;,
276
+ hasChanged: Fields.Comparer&lt;T&gt; = <span class="branch-0 cbranch-no" title="branch not covered" >null,</span>
277
+ ): boolean {
330
278
  &nbsp;
331
- get open() {
332
- return this._opened.value;
333
- }
279
+ <span class="cstat-no" title="statement not covered" > hasChanged = hasChanged || (<span class="fstat-no" title="function not covered" >(v</span>1: T, v2: T) =&gt; (<span class="cstat-no" title="statement not covered" >get(v1) !== get(v2))</span>);</span>
334
280
  &nbsp;
335
- set open(value: boolean) {
336
- this._opened.value = value;
337
- }
281
+ let changed = <span class="cstat-no" title="statement not covered" >true;</span>
338
282
  &nbsp;
339
- get items() {
340
- return this._items;
283
+ <span class="cstat-no" title="statement not covered" > if (get(source) !== undefined &amp;&amp; hasChanged(source, target)) {</span>
284
+ <span class="cstat-no" title="statement not covered" > changed = true;</span>
285
+ <span class="cstat-no" title="statement not covered" > set(diff, get(target));</span>
286
+ <span class="cstat-no" title="statement not covered" > set(target, get(source));</span>
341
287
  }
342
288
  &nbsp;
343
- get selectedValue() {
344
- const vs = this.values;
345
- return vs.length ? vs[this._index] : null;
346
- }
289
+ <span class="cstat-no" title="statement not covered" > return changed;</span>
347
290
  &nbsp;
348
- set selectedValue(value: string) {
349
- const index = this.values.indexOf(value);
350
- if (index &gt;= 0) {
351
- this.index = index;
352
- }
353
- }
291
+ }
354
292
  &nbsp;
355
- get selectedItem(): T {
356
- return this._items[this._index];
357
- }
293
+ const DefaultComparator: Comparator&lt;any&gt; = (v1, v2) =&gt; v1 === v2;
294
+ const DefaultUpdater: Fields.Updater&lt;any&gt; = <span class="fstat-no" title="function not covered" >(v</span>1, v2) =&gt; <span class="cstat-no" title="statement not covered" >Object.assign(v1, v2);</span>
358
295
  &nbsp;
359
- set selectedItem(item: T) {
360
- const index = this._items.indexOf(item);
361
- if (index &gt;= 0) {
362
- this.index = index;
363
- }
364
- }
296
+ export type UpdateArrayOptions&lt;T&gt; = {
297
+ additive?: boolean,
298
+ clone?: boolean,
299
+ comparator?: Comparator&lt;T&gt;,
300
+ updater?: Fields.Updater&lt;T&gt;,
301
+ sorter?: Comparator&lt;T, number&gt; | null | undefined,
302
+ };
365
303
  &nbsp;
366
- get index() {
367
- return this._index;
304
+ export function updateArray&lt;T&gt;(
305
+ target: T[] | null,
306
+ source: T[],
307
+ options?: UpdateArrayOptions&lt;T&gt;,
308
+ ): { changed: number, result: T[] } {
309
+ if (!source) {
310
+ return { changed: 0, result: target };
368
311
  }
369
312
  &nbsp;
370
- set index(val: number) {
371
- if (this._indexLocked) {
372
- return;
373
- }
313
+ let changed = 0;
314
+ const result = Array.isArray(target)
315
+ ? (options?.clone ? target.slice() : target)
316
+ : <span class="branch-1 cbranch-no" title="branch not covered" >[];</span>
374
317
  &nbsp;
375
- this._index = val;
318
+ const comparator = options?.comparator || DefaultComparator;
319
+ const updater = options?.updater || DefaultUpdater;
376
320
  &nbsp;
377
- // update all flags to be properly selected
378
- try {
379
- this._indexLocked = true;
380
- &nbsp;
381
- if (this._flags.hasValue) {
382
- this._flags.value.forEach((f, i) =&gt; f.value = (i === this._index));
321
+ // remove all missing elements
322
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (!options?.additive) {
323
+ for (let i = 0; i &lt; result.length; ++i) {
324
+ if (source.find(item =&gt; comparator(item, result[i])) == null) {
325
+ result.splice(i, 1);
326
+ ++changed;
327
+ --i;
383
328
  }
384
- } finally {
385
- this._indexLocked = false;
386
329
  }
387
330
  }
388
331
  &nbsp;
389
- reset = () =&gt; {
390
- this.index = 0;
391
- };
392
- &nbsp;
393
- private createFlags() {
394
- const flags = this._items.map(i =&gt; new LabeledFlagModel(this._accessor(i)));
395
- flags.forEach((f, i) =&gt; f.value = i === this.index);
332
+ // add all new elements and update existing
333
+ source.forEach(i =&gt; {
334
+ const existingIndex = result.findIndex(item =&gt; comparator(i, item));
335
+ const existingItem = result[existingIndex];
336
+ if (existingIndex &lt; 0) {
337
+ result.push(i);
338
+ ++changed;
339
+ } else if (typeof existingItem === 'object') {
340
+ result[existingIndex] = updater(existingItem, i);
341
+ }
342
+ });
396
343
  &nbsp;
397
- // react on every flag is changed directly
398
- flags.forEach((f, index) =&gt; {
399
- reaction(() =&gt; f.value, isSelected =&gt; {
400
- if (isSelected) {
401
- this.index = index;
402
- }
403
- });
404
- });
405
- return flags;
344
+ const sorter = options?.sorter;
345
+ if (sorter !== null) {
346
+ result.sort(sorter || undefined);
406
347
  }
407
- }
408
348
  &nbsp;
409
- export class SelectString&lt;T extends string = string&gt; extends Select&lt;T&gt; {
410
- constructor(items: readonly T[], initialIndex: number = 0) {
411
- super(items, v =&gt; v, initialIndex);
412
- }
349
+ return {
350
+ result,
351
+ changed,
352
+ };
413
353
  }
414
354
  &nbsp;</pre></td></tr></table></pre>
415
355
 
@@ -418,7 +358,7 @@ export class SelectString&lt;T extends string = string&gt; extends Select&lt;T&g
418
358
  <div class='footer quiet pad2 space-top1 center small'>
419
359
  Code coverage generated by
420
360
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
421
- at Fri Nov 19 2021 19:36:26 GMT+0000 (Coordinated Universal Time)
361
+ at Fri Jan 07 2022 14:12:28 GMT+0000 (Coordinated Universal Time)
422
362
  </div>
423
363
  </div>
424
364
  <script src="../../prettify.js"></script>
@@ -155,7 +155,7 @@
155
155
  <div class='footer quiet pad2 space-top1 center small'>
156
156
  Code coverage generated by
157
157
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
158
- at Mon Nov 29 2021 14:39:58 GMT+0000 (Coordinated Universal Time)
158
+ at Fri Jan 07 2022 14:12:28 GMT+0000 (Coordinated Universal Time)
159
159
  </div>
160
160
  </div>
161
161
  <script src="../prettify.js"></script>
@@ -139,7 +139,7 @@ export function createLazy&lt;T&gt;(factory: () =&gt; T) {
139
139
  <div class='footer quiet pad2 space-top1 center small'>
140
140
  Code coverage generated by
141
141
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
142
- at Mon Nov 29 2021 14:39:58 GMT+0000 (Coordinated Universal Time)
142
+ at Fri Jan 07 2022 14:12:28 GMT+0000 (Coordinated Universal Time)
143
143
  </div>
144
144
  </div>
145
145
  <script src="../prettify.js"></script>
@@ -91,7 +91,7 @@ export function batchLoggers(...loggers: ILogger[]): ILogger {
91
91
  <div class='footer quiet pad2 space-top1 center small'>
92
92
  Code coverage generated by
93
93
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
94
- at Mon Nov 29 2021 14:39:58 GMT+0000 (Coordinated Universal Time)
94
+ at Fri Jan 07 2022 14:12:28 GMT+0000 (Coordinated Universal Time)
95
95
  </div>
96
96
  </div>
97
97
  <script src="../../prettify.js"></script>
@@ -220,7 +220,7 @@ export class BufferedConsoleLogger implements ILogger {
220
220
  <div class='footer quiet pad2 space-top1 center small'>
221
221
  Code coverage generated by
222
222
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
223
- at Mon Nov 29 2021 14:39:58 GMT+0000 (Coordinated Universal Time)
223
+ at Fri Jan 07 2022 14:12:28 GMT+0000 (Coordinated Universal Time)
224
224
  </div>
225
225
  </div>
226
226
  <script src="../../prettify.js"></script>
@@ -155,7 +155,7 @@
155
155
  <div class='footer quiet pad2 space-top1 center small'>
156
156
  Code coverage generated by
157
157
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
158
- at Mon Nov 29 2021 14:39:58 GMT+0000 (Coordinated Universal Time)
158
+ at Fri Jan 07 2022 14:12:28 GMT+0000 (Coordinated Universal Time)
159
159
  </div>
160
160
  </div>
161
161
  <script src="../../prettify.js"></script>
@@ -277,7 +277,7 @@ function _createImplementation(overrideMode: typeof Mode = undefined): ILogger {
277
277
  <div class='footer quiet pad2 space-top1 center small'>
278
278
  Code coverage generated by
279
279
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
280
- at Mon Nov 29 2021 14:39:58 GMT+0000 (Coordinated Universal Time)
280
+ at Fri Jan 07 2022 14:12:28 GMT+0000 (Coordinated Universal Time)
281
281
  </div>
282
282
  </div>
283
283
  <script src="../../prettify.js"></script>
@@ -205,7 +205,7 @@ export abstract class NamedLogger implements ILogger, ILoggerSwitchable {
205
205
  <div class='footer quiet pad2 space-top1 center small'>
206
206
  Code coverage generated by
207
207
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
208
- at Mon Nov 29 2021 14:39:58 GMT+0000 (Coordinated Universal Time)
208
+ at Fri Jan 07 2022 14:12:28 GMT+0000 (Coordinated Universal Time)
209
209
  </div>
210
210
  </div>
211
211
  <script src="../../prettify.js"></script>
@@ -151,7 +151,7 @@ export class ProxyLogger extends NamedLogger {
151
151
  <div class='footer quiet pad2 space-top1 center small'>
152
152
  Code coverage generated by
153
153
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
154
- at Mon Nov 29 2021 14:39:58 GMT+0000 (Coordinated Universal Time)
154
+ at Fri Jan 07 2022 14:12:28 GMT+0000 (Coordinated Universal Time)
155
155
  </div>
156
156
  </div>
157
157
  <script src="../../prettify.js"></script>
@@ -847,7 +847,7 @@ export function arrayRepeat&lt;T&gt;(factory: Getter&lt;T&gt;, count = <span cla
847
847
  <div class='footer quiet pad2 space-top1 center small'>
848
848
  Code coverage generated by
849
849
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
850
- at Mon Nov 29 2021 14:39:58 GMT+0000 (Coordinated Universal Time)
850
+ at Fri Jan 07 2022 14:12:28 GMT+0000 (Coordinated Universal Time)
851
851
  </div>
852
852
  </div>
853
853
  <script src="../../prettify.js"></script>
@@ -262,7 +262,7 @@ export function random(min: number = <span class="branch-0 cbranch-no" title="br
262
262
  <div class='footer quiet pad2 space-top1 center small'>
263
263
  Code coverage generated by
264
264
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
265
- at Mon Nov 29 2021 14:39:58 GMT+0000 (Coordinated Universal Time)
265
+ at Fri Jan 07 2022 14:12:28 GMT+0000 (Coordinated Universal Time)
266
266
  </div>
267
267
  </div>
268
268
  <script src="../../prettify.js"></script>
@@ -124,7 +124,7 @@ export function extendDistribution&lt;T extends keyof any&gt;(count: number, typ
124
124
  <div class='footer quiet pad2 space-top1 center small'>
125
125
  Code coverage generated by
126
126
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
127
- at Mon Nov 29 2021 14:39:58 GMT+0000 (Coordinated Universal Time)
127
+ at Fri Jan 07 2022 14:12:28 GMT+0000 (Coordinated Universal Time)
128
128
  </div>
129
129
  </div>
130
130
  <script src="../../prettify.js"></script>
@@ -140,7 +140,7 @@
140
140
  <div class='footer quiet pad2 space-top1 center small'>
141
141
  Code coverage generated by
142
142
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
143
- at Mon Nov 29 2021 14:39:58 GMT+0000 (Coordinated Universal Time)
143
+ at Fri Jan 07 2022 14:12:28 GMT+0000 (Coordinated Universal Time)
144
144
  </div>
145
145
  </div>
146
146
  <script src="../../prettify.js"></script>
@@ -145,7 +145,7 @@ export function format(n: number, digits?: number) {
145
145
  <div class='footer quiet pad2 space-top1 center small'>
146
146
  Code coverage generated by
147
147
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
148
- at Mon Nov 29 2021 14:39:58 GMT+0000 (Coordinated Universal Time)
148
+ at Fri Jan 07 2022 14:12:28 GMT+0000 (Coordinated Universal Time)
149
149
  </div>
150
150
  </div>
151
151
  <script src="../../prettify.js"></script>
@@ -592,7 +592,7 @@ export class TransitionObserver&lt;T&gt; implements IDisposable {
592
592
  <div class='footer quiet pad2 space-top1 center small'>
593
593
  Code coverage generated by
594
594
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
595
- at Mon Nov 29 2021 14:39:58 GMT+0000 (Coordinated Universal Time)
595
+ at Fri Jan 07 2022 14:12:28 GMT+0000 (Coordinated Universal Time)
596
596
  </div>
597
597
  </div>
598
598
  <script src="../prettify.js"></script>
@@ -142,7 +142,7 @@ export namespace Comparator {
142
142
  <div class='footer quiet pad2 space-top1 center small'>
143
143
  Code coverage generated by
144
144
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
145
- at Mon Nov 29 2021 14:39:58 GMT+0000 (Coordinated Universal Time)
145
+ at Fri Jan 07 2022 14:12:28 GMT+0000 (Coordinated Universal Time)
146
146
  </div>
147
147
  </div>
148
148
  <script src="../prettify.js"></script>
@@ -142,7 +142,7 @@ export namespace <span class="branch-1 cbranch-no" title="branch not covered" >V
142
142
  <div class='footer quiet pad2 space-top1 center small'>
143
143
  Code coverage generated by
144
144
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
145
- at Mon Nov 29 2021 14:39:58 GMT+0000 (Coordinated Universal Time)
145
+ at Fri Jan 07 2022 14:12:28 GMT+0000 (Coordinated Universal Time)
146
146
  </div>
147
147
  </div>
148
148
  <script src="../../prettify.js"></script>
@@ -139,7 +139,7 @@ export default {
139
139
  <div class='footer quiet pad2 space-top1 center small'>
140
140
  Code coverage generated by
141
141
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
142
- at Mon Nov 29 2021 14:39:58 GMT+0000 (Coordinated Universal Time)
142
+ at Fri Jan 07 2022 14:12:28 GMT+0000 (Coordinated Universal Time)
143
143
  </div>
144
144
  </div>
145
145
  <script src="../../prettify.js"></script>