@zajno/common 1.3.2 → 1.3.6

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 (93) hide show
  1. package/.github/workflows/CI.yml +8 -0
  2. package/coverage/clover.xml +195 -141
  3. package/coverage/coverage-final.json +40 -39
  4. package/coverage/lcov-report/index.html +39 -24
  5. package/coverage/lcov-report/src/__tests__/helpers/index.html +1 -1
  6. package/coverage/lcov-report/src/__tests__/helpers/main.ts.html +1 -1
  7. package/coverage/lcov-report/src/async/arrays.ts.html +1 -1
  8. package/coverage/lcov-report/src/async/index.html +1 -1
  9. package/coverage/lcov-report/src/dates/calc.ts.html +1 -1
  10. package/coverage/lcov-report/src/dates/convert.ts.html +1 -1
  11. package/coverage/lcov-report/src/dates/datex.ts.html +1 -1
  12. package/coverage/lcov-report/src/dates/format.ts.html +1 -1
  13. package/coverage/lcov-report/src/dates/index.html +1 -1
  14. package/coverage/lcov-report/src/dates/index.ts.html +1 -1
  15. package/coverage/lcov-report/src/dates/parse.ts.html +1 -1
  16. package/coverage/lcov-report/src/dates/period.ts.html +1 -1
  17. package/coverage/lcov-report/src/dates/shift.ts.html +1 -1
  18. package/coverage/lcov-report/src/dates/types.ts.html +1 -1
  19. package/coverage/lcov-report/src/dates/yearDate.ts.html +1 -1
  20. package/coverage/lcov-report/src/enumHelper.ts.html +1 -1
  21. package/coverage/lcov-report/src/event.ts.html +1 -1
  22. package/coverage/lcov-report/src/fields/index.html +111 -0
  23. package/coverage/lcov-report/src/{viewModels/SelectViewModel.ts.html → fields/update.ts.html} +119 -182
  24. package/coverage/lcov-report/src/index.html +1 -1
  25. package/coverage/lcov-report/src/lazy.light.ts.html +3 -3
  26. package/coverage/lcov-report/src/logger/batch.ts.html +1 -1
  27. package/coverage/lcov-report/src/logger/console.ts.html +1 -1
  28. package/coverage/lcov-report/src/logger/index.html +1 -1
  29. package/coverage/lcov-report/src/logger/index.ts.html +1 -1
  30. package/coverage/lcov-report/src/logger/named.ts.html +1 -1
  31. package/coverage/lcov-report/src/logger/proxy.ts.html +1 -1
  32. package/coverage/lcov-report/src/math/arrays.ts.html +32 -8
  33. package/coverage/lcov-report/src/math/calc.ts.html +1 -1
  34. package/coverage/lcov-report/src/math/distribution.ts.html +1 -1
  35. package/coverage/lcov-report/src/math/index.html +11 -11
  36. package/coverage/lcov-report/src/math/index.ts.html +1 -1
  37. package/coverage/lcov-report/src/transitionObserver.ts.html +1 -1
  38. package/coverage/lcov-report/src/types.ts.html +4 -4
  39. package/coverage/lcov-report/src/validation/ValidationErrors.ts.html +1 -1
  40. package/coverage/lcov-report/src/validation/creditCard.ts.html +1 -1
  41. package/coverage/lcov-report/src/validation/helpers.ts.html +1 -1
  42. package/coverage/lcov-report/src/validation/index.html +1 -1
  43. package/coverage/lcov-report/src/validation/index.ts.html +1 -1
  44. package/coverage/lcov-report/src/validation/types.ts.html +1 -1
  45. package/coverage/lcov-report/src/validation/validators.ts.html +1 -1
  46. package/coverage/lcov-report/src/validation/wrappers.ts.html +1 -1
  47. package/coverage/lcov-report/src/viewModels/FlagModel.ts.html +6 -6
  48. package/coverage/lcov-report/src/viewModels/MultiSelectModel.ts.html +104 -95
  49. package/coverage/lcov-report/src/viewModels/NumberModel.ts.html +1 -1
  50. package/coverage/lcov-report/src/viewModels/SelectModel.ts.html +1 -1
  51. package/coverage/lcov-report/src/viewModels/Validatable.ts.html +45 -21
  52. package/coverage/lcov-report/src/viewModels/index.html +30 -30
  53. package/coverage/lcov-report/src/viewModels/wrappers.ts.html +1 -1
  54. package/coverage/lcov-report/{enumHelper.ts.html → update.ts.html} +118 -193
  55. package/coverage/lcov.info +347 -207
  56. package/lib/fields/update.d.ts +17 -6
  57. package/lib/fields/update.d.ts.map +1 -1
  58. package/lib/fields/update.js +29 -13
  59. package/lib/fields/update.js.map +1 -1
  60. package/lib/ident.d.ts +6 -0
  61. package/lib/ident.d.ts.map +1 -0
  62. package/lib/ident.js +3 -0
  63. package/lib/ident.js.map +1 -0
  64. package/lib/math/arrays.d.ts +2 -1
  65. package/lib/math/arrays.d.ts.map +1 -1
  66. package/lib/math/arrays.js +9 -1
  67. package/lib/math/arrays.js.map +1 -1
  68. package/lib/viewModels/MultiSelectModel.d.ts +2 -0
  69. package/lib/viewModels/MultiSelectModel.d.ts.map +1 -1
  70. package/lib/viewModels/MultiSelectModel.js +3 -1
  71. package/lib/viewModels/MultiSelectModel.js.map +1 -1
  72. package/lib/viewModels/PromptModal.d.ts.map +1 -1
  73. package/lib/viewModels/PromptModal.js +1 -1
  74. package/lib/viewModels/PromptModal.js.map +1 -1
  75. package/lib/viewModels/Validatable.d.ts +2 -1
  76. package/lib/viewModels/Validatable.d.ts.map +1 -1
  77. package/lib/viewModels/Validatable.js +7 -0
  78. package/lib/viewModels/Validatable.js.map +1 -1
  79. package/package.json +1 -1
  80. package/src/fields/__tests__/fields.update.test.ts +73 -0
  81. package/src/fields/update.ts +54 -20
  82. package/src/ident.ts +8 -0
  83. package/src/math/arrays.ts +9 -1
  84. package/src/viewModels/MultiSelectModel.ts +4 -1
  85. package/src/viewModels/PromptModal.ts +1 -1
  86. package/src/viewModels/Validatable.ts +8 -0
  87. package/src/viewModels/__tests__/multiSelect.test.ts +127 -12
  88. package/coverage/lcov-report/NumberModel.ts.html +0 -188
  89. package/coverage/lcov-report/arrays.ts.html +0 -602
  90. package/coverage/lcov-report/calc.ts.html +0 -278
  91. package/coverage/lcov-report/src/viewModels/LabeledFlagModel.ts.html +0 -137
  92. package/coverage/lcov-report/src/viewModels/labeled.ts.html +0 -128
  93. package/coverage/lcov-report/transitionObserver.ts.html +0 -536
@@ -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'>60/60</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'>25/25</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,264 +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>
179
- <a name='L120'></a><a href='#L120'>120</a></td><td class="line-coverage quiet"><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>
182
- <span class="cline-any cline-yes">1x</span>
183
- <span class="cline-any cline-neutral">&nbsp;</span>
184
- <span class="cline-any cline-yes">1x</span>
185
- <span class="cline-any cline-neutral">&nbsp;</span>
186
- <span class="cline-any cline-yes">5x</span>
187
- <span class="cline-any cline-neutral">&nbsp;</span>
188
- <span class="cline-any cline-neutral">&nbsp;</span>
189
- <span class="cline-any cline-yes">5x</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>
190
159
  <span class="cline-any cline-neutral">&nbsp;</span>
191
- <span class="cline-any cline-yes">5x</span>
192
- <span class="cline-any cline-yes">5x</span>
193
160
  <span class="cline-any cline-neutral">&nbsp;</span>
194
- <span class="cline-any cline-yes">5x</span>
195
161
  <span class="cline-any cline-neutral">&nbsp;</span>
196
162
  <span class="cline-any cline-neutral">&nbsp;</span>
197
- <span class="cline-any cline-yes">5x</span>
198
- <span class="cline-any cline-yes">5x</span>
199
163
  <span class="cline-any cline-neutral">&nbsp;</span>
200
164
  <span class="cline-any cline-neutral">&nbsp;</span>
201
- <span class="cline-any cline-yes">5x</span>
202
- <span class="cline-any cline-yes">5x</span>
203
165
  <span class="cline-any cline-neutral">&nbsp;</span>
204
166
  <span class="cline-any cline-neutral">&nbsp;</span>
205
167
  <span class="cline-any cline-neutral">&nbsp;</span>
206
168
  <span class="cline-any cline-yes">1x</span>
207
- <span class="cline-any cline-yes">34x</span>
208
- <span class="cline-any cline-neutral">&nbsp;</span>
209
- <span class="cline-any cline-neutral">&nbsp;</span>
210
- <span class="cline-any cline-neutral">&nbsp;</span>
211
- <span class="cline-any cline-yes">8x</span>
212
- <span class="cline-any cline-neutral">&nbsp;</span>
169
+ <span class="cline-any cline-no">&nbsp;</span>
213
170
  <span class="cline-any cline-neutral">&nbsp;</span>
214
171
  <span class="cline-any cline-neutral">&nbsp;</span>
215
172
  <span class="cline-any cline-yes">1x</span>
216
173
  <span class="cline-any cline-neutral">&nbsp;</span>
217
174
  <span class="cline-any cline-neutral">&nbsp;</span>
218
175
  <span class="cline-any cline-neutral">&nbsp;</span>
219
- <span class="cline-any cline-yes">1x</span>
220
- <span class="cline-any cline-neutral">&nbsp;</span>
221
176
  <span class="cline-any cline-neutral">&nbsp;</span>
222
177
  <span class="cline-any cline-neutral">&nbsp;</span>
223
- <span class="cline-any cline-yes">1x</span>
224
- <span class="cline-any cline-neutral">&nbsp;</span>
225
178
  <span class="cline-any cline-neutral">&nbsp;</span>
226
179
  <span class="cline-any cline-neutral">&nbsp;</span>
227
- <span class="cline-any cline-yes">6x</span>
228
- <span class="cline-any cline-yes">6x</span>
229
180
  <span class="cline-any cline-neutral">&nbsp;</span>
181
+ <span class="cline-any cline-no">&nbsp;</span>
230
182
  <span class="cline-any cline-neutral">&nbsp;</span>
183
+ <span class="cline-any cline-no">&nbsp;</span>
231
184
  <span class="cline-any cline-neutral">&nbsp;</span>
232
- <span class="cline-any cline-yes">4x</span>
233
- <span class="cline-any cline-yes">4x</span>
234
- <span class="cline-any cline-yes">3x</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>
235
189
  <span class="cline-any cline-neutral">&nbsp;</span>
236
190
  <span class="cline-any cline-neutral">&nbsp;</span>
191
+ <span class="cline-any cline-no">&nbsp;</span>
237
192
  <span class="cline-any cline-neutral">&nbsp;</span>
238
193
  <span class="cline-any cline-neutral">&nbsp;</span>
239
- <span class="cline-any cline-yes">4x</span>
240
194
  <span class="cline-any cline-neutral">&nbsp;</span>
195
+ <span class="cline-any cline-yes">38x</span>
196
+ <span class="cline-any cline-yes">1x</span>
241
197
  <span class="cline-any cline-neutral">&nbsp;</span>
242
198
  <span class="cline-any cline-neutral">&nbsp;</span>
243
- <span class="cline-any cline-yes">5x</span>
244
- <span class="cline-any cline-yes">5x</span>
245
- <span class="cline-any cline-yes">4x</span>
246
199
  <span class="cline-any cline-neutral">&nbsp;</span>
247
200
  <span class="cline-any cline-neutral">&nbsp;</span>
248
201
  <span class="cline-any cline-neutral">&nbsp;</span>
249
202
  <span class="cline-any cline-neutral">&nbsp;</span>
250
- <span class="cline-any cline-yes">11x</span>
251
203
  <span class="cline-any cline-neutral">&nbsp;</span>
252
204
  <span class="cline-any cline-neutral">&nbsp;</span>
253
205
  <span class="cline-any cline-neutral">&nbsp;</span>
254
- <span class="cline-any cline-yes">17x</span>
255
- <span class="cline-any cline-yes">4x</span>
206
+ <span class="cline-any cline-yes">1x</span>
256
207
  <span class="cline-any cline-neutral">&nbsp;</span>
257
208
  <span class="cline-any cline-neutral">&nbsp;</span>
258
- <span class="cline-any cline-yes">13x</span>
259
209
  <span class="cline-any cline-neutral">&nbsp;</span>
260
210
  <span class="cline-any cline-neutral">&nbsp;</span>
261
- <span class="cline-any cline-yes">13x</span>
262
- <span class="cline-any cline-yes">13x</span>
211
+ <span class="cline-any cline-yes">6x</span>
212
+ <span class="cline-any cline-yes">1x</span>
263
213
  <span class="cline-any cline-neutral">&nbsp;</span>
264
- <span class="cline-any cline-yes">13x</span>
265
- <span class="cline-any cline-yes">36x</span>
266
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>
267
217
  <span class="cline-any cline-neutral">&nbsp;</span>
268
- <span class="cline-any cline-yes">13x</span>
269
218
  <span class="cline-any cline-neutral">&nbsp;</span>
270
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>
271
222
  <span class="cline-any cline-neutral">&nbsp;</span>
272
223
  <span class="cline-any cline-neutral">&nbsp;</span>
273
224
  <span class="cline-any cline-yes">5x</span>
274
- <span class="cline-any cline-yes">1x</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>
275
230
  <span class="cline-any cline-neutral">&nbsp;</span>
276
231
  <span class="cline-any cline-neutral">&nbsp;</span>
277
232
  <span class="cline-any cline-neutral">&nbsp;</span>
278
- <span class="cline-any cline-yes">9x</span>
279
- <span class="cline-any cline-yes">3x</span>
280
233
  <span class="cline-any cline-neutral">&nbsp;</span>
281
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>
237
+ <span class="cline-any cline-yes">12x</span>
238
+ <span class="cline-any cline-yes">12x</span>
239
+ <span class="cline-any cline-yes">7x</span>
240
+ <span class="cline-any cline-yes">7x</span>
241
+ <span class="cline-any cline-yes">5x</span>
282
242
  <span class="cline-any cline-yes">1x</span>
283
- <span class="cline-any cline-yes">19x</span>
284
- <span class="cline-any cline-yes">16x</span>
285
- <span class="cline-any cline-yes">8x</span>
286
243
  <span class="cline-any cline-neutral">&nbsp;</span>
287
244
  <span class="cline-any cline-neutral">&nbsp;</span>
288
245
  <span class="cline-any cline-neutral">&nbsp;</span>
289
- <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>
290
249
  <span class="cline-any cline-neutral">&nbsp;</span>
291
250
  <span class="cline-any cline-neutral">&nbsp;</span>
251
+ <span class="cline-any cline-yes">5x</span>
292
252
  <span class="cline-any cline-neutral">&nbsp;</span>
293
- <span class="cline-any cline-yes">1x</span>
294
253
  <span class="cline-any cline-neutral">&nbsp;</span>
295
- <span class="cline-any cline-yes">3x</span>
296
254
  <span class="cline-any cline-neutral">&nbsp;</span>
297
255
  <span class="cline-any cline-neutral">&nbsp;</span>
298
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { createLazy } from '../lazy.light';
299
- import { observable, computed, makeObservable, reaction, action } from 'mobx';
300
- import { FlagModel } from './FlagModel';
301
- import { ILabeledFlagModel, LabeledFlagModel } from './LabeledFlagModel';
302
- &nbsp;
303
- export class Select&lt;T = any&gt; {
304
- @observable
305
- private _index: number = undefined;
306
- &nbsp;
307
- @observable
308
- public error: boolean = undefined;
256
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { Comparator } from '../types';
309
257
  &nbsp;
310
- private readonly _opened = new FlagModel();
311
- private _indexLocked = false;
312
- &nbsp;
313
- 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
+ }
314
264
  &nbsp;
315
- constructor(
316
- private readonly _items: readonly T[],
317
- private readonly _accessor: (item: T) =&gt; string,
318
- initialIndex: number = undefined,
319
- ) {
320
- makeObservable(this);
321
- this._index = initialIndex;
322
- }
323
265
  &nbsp;
324
- @computed
325
- get values(): readonly string[] {
326
- return this._items.map(i =&gt; this._accessor(i));
327
- }
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
+ }
328
269
  &nbsp;
329
- get flags(): ReadonlyArray&lt;ILabeledFlagModel&gt; {
330
- return this._flags.value;
331
- }
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 {
332
278
  &nbsp;
333
- get open() {
334
- return this._opened.value;
335
- }
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>
336
280
  &nbsp;
337
- set open(value: boolean) {
338
- this._opened.value = value;
339
- }
281
+ let changed = <span class="cstat-no" title="statement not covered" >true;</span>
340
282
  &nbsp;
341
- get items() {
342
- 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>
343
287
  }
344
288
  &nbsp;
345
- get selectedValue() {
346
- const vs = this.values;
347
- return vs.length ? vs[this._index] : null;
348
- }
289
+ <span class="cstat-no" title="statement not covered" > return changed;</span>
349
290
  &nbsp;
350
- set selectedValue(value: string) {
351
- const index = this.values.indexOf(value);
352
- if (index &gt;= 0) {
353
- this.index = index;
354
- }
355
- }
291
+ }
356
292
  &nbsp;
357
- get selectedItem(): T {
358
- return this._items[this._index];
359
- }
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>
360
295
  &nbsp;
361
- set selectedItem(item: T) {
362
- const index = this._items.indexOf(item);
363
- if (index &gt;= 0) {
364
- this.index = index;
365
- }
366
- }
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
+ };
367
303
  &nbsp;
368
- get index() {
369
- 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 };
370
311
  }
371
312
  &nbsp;
372
- set index(val: number) {
373
- if (this._indexLocked) {
374
- return;
375
- }
376
- &nbsp;
377
- this._index = val;
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>
378
317
  &nbsp;
379
- // update all flags to be properly selected
380
- try {
381
- this._indexLocked = true;
318
+ const comparator = options?.comparator || DefaultComparator;
319
+ const updater = options?.updater || DefaultUpdater;
382
320
  &nbsp;
383
- if (this._flags.hasValue) {
384
- 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;
385
328
  }
386
- } finally {
387
- this._indexLocked = false;
388
329
  }
389
330
  }
390
331
  &nbsp;
391
- @action
392
- reset = () =&gt; {
393
- this.index = 0;
394
- };
395
- &nbsp;
396
- private createFlags() {
397
- const flags = this._items.map(i =&gt; new LabeledFlagModel(() =&gt; this._accessor(i)));
398
- 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
+ });
399
343
  &nbsp;
400
- // react on every flag is changed directly
401
- flags.forEach((f, index) =&gt; {
402
- reaction(() =&gt; f.value, isSelected =&gt; {
403
- if (isSelected) {
404
- this.index = index;
405
- }
406
- });
407
- });
408
- return flags;
344
+ const sorter = options?.sorter;
345
+ if (sorter !== null) {
346
+ result.sort(sorter || undefined);
409
347
  }
410
- }
411
348
  &nbsp;
412
- export class SelectString&lt;T extends string = string&gt; extends Select&lt;T&gt; {
413
- constructor(items: readonly T[], initialIndex: number = 0) {
414
- super(items, v =&gt; v, initialIndex);
415
- }
349
+ return {
350
+ result,
351
+ changed,
352
+ };
416
353
  }
417
354
  &nbsp;</pre></td></tr></table></pre>
418
355
 
@@ -421,7 +358,7 @@ export class SelectString&lt;T extends string = string&gt; extends Select&lt;T&g
421
358
  <div class='footer quiet pad2 space-top1 center small'>
422
359
  Code coverage generated by
423
360
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
424
- at Sat Nov 20 2021 11:35:53 GMT+0000 (Coordinated Universal Time)
361
+ at Mon Jan 03 2022 18:23:02 GMT+0000 (Coordinated Universal Time)
425
362
  </div>
426
363
  </div>
427
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 07:49:53 GMT+0000 (Coordinated Universal Time)
158
+ at Mon Jan 03 2022 18:23:02 GMT+0000 (Coordinated Universal Time)
159
159
  </div>
160
160
  </div>
161
161
  <script src="../prettify.js"></script>
@@ -91,7 +91,7 @@
91
91
  <span class="cline-any cline-neutral">&nbsp;</span>
92
92
  <span class="cline-any cline-neutral">&nbsp;</span>
93
93
  <span class="cline-any cline-yes">2x</span>
94
- <span class="cline-any cline-yes">8x</span>
94
+ <span class="cline-any cline-yes">11x</span>
95
95
  <span class="cline-any cline-neutral">&nbsp;</span>
96
96
  <span class="cline-any cline-neutral">&nbsp;</span>
97
97
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -100,7 +100,7 @@
100
100
  <span class="cline-any cline-neutral">&nbsp;</span>
101
101
  <span class="cline-any cline-yes">19x</span>
102
102
  <span class="cline-any cline-neutral">&nbsp;</span>
103
- <span class="cline-any cline-yes">15x</span>
103
+ <span class="cline-any cline-yes">27x</span>
104
104
  <span class="cline-any cline-neutral">&nbsp;</span>
105
105
  <span class="cline-any cline-no">&nbsp;</span>
106
106
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -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 07:49:53 GMT+0000 (Coordinated Universal Time)
142
+ at Mon Jan 03 2022 18:23:02 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 07:49:53 GMT+0000 (Coordinated Universal Time)
94
+ at Mon Jan 03 2022 18:23:02 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 07:49:53 GMT+0000 (Coordinated Universal Time)
223
+ at Mon Jan 03 2022 18:23:02 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 07:49:53 GMT+0000 (Coordinated Universal Time)
158
+ at Mon Jan 03 2022 18:23:02 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 07:49:53 GMT+0000 (Coordinated Universal Time)
280
+ at Mon Jan 03 2022 18:23:02 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 07:49:53 GMT+0000 (Coordinated Universal Time)
208
+ at Mon Jan 03 2022 18:23:02 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 07:49:53 GMT+0000 (Coordinated Universal Time)
154
+ at Mon Jan 03 2022 18:23:02 GMT+0000 (Coordinated Universal Time)
155
155
  </div>
156
156
  </div>
157
157
  <script src="../../prettify.js"></script>