@wizhut_tech/wizjs 0.1.4 → 0.1.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.
@@ -1,4 +1,5 @@
1
1
  const { toInteger } = require('../math/numbers.js');
2
+ const { isNil, isObject, isFunction } = require('./checks.js');
2
3
 
3
4
 
4
5
  function* count(start=0, step=1) {
@@ -17,21 +18,523 @@ function *repeat(arg, times=0) {
17
18
  iTimes = 0;
18
19
  }
19
20
 
20
- let iTimesLeft = iTimes;
21
+ if (iTimes === 0) {
22
+ while (true) {
23
+ yield arg;
24
+ }
25
+ }
26
+
27
+ for (let i = 0; i < iTimes; i++) {
28
+ yield arg;
29
+ }
30
+ }
31
+
32
+
33
+ function* cycle(iterable) {
34
+ if (isNil(iterable)) {
35
+ return;
36
+ }
37
+
38
+ const saved = [];
39
+
40
+ for (const item of iterable) {
41
+ yield item;
42
+ saved.push(item);
43
+ }
44
+
45
+ if (saved.length === 0) {
46
+ return;
47
+ }
48
+
49
+ let i = 0;
21
50
 
22
51
  while (true) {
23
- if (iTimes === 0) {
24
- yield arg;
52
+ yield saved[i];
53
+ i += 1;
54
+
55
+ if (i === saved.length) {
56
+ i = 0;
25
57
  }
58
+ }
59
+ }
26
60
 
27
- if (iTimesLeft > 0) {
28
- iTimesLeft -= 1;
29
- yield arg;
61
+
62
+ function* chain(...iterables) {
63
+ for (let i = 0; i < iterables.length; i++) {
64
+ const iterable = iterables[i];
65
+
66
+ if (isNil(iterable)) {
67
+ continue;
68
+ }
69
+
70
+ yield* iterable;
71
+ }
72
+ }
73
+
74
+
75
+ function take(n, iterable) {
76
+ const countN = toInteger(n);
77
+ const result = [];
78
+
79
+ if (countN <= 0 || isNil(iterable)) {
80
+ return result;
81
+ }
82
+
83
+ let taken = 0;
84
+
85
+ for (const item of iterable) {
86
+ result.push(item);
87
+ taken += 1;
88
+
89
+ if (taken >= countN) {
90
+ break;
30
91
  }
31
92
  }
93
+
94
+ return result;
32
95
  }
33
96
 
97
+
98
+ function* zip(...iterables) {
99
+ if (iterables.length === 0) {
100
+ return;
101
+ }
102
+
103
+ const iterators = [];
104
+
105
+ for (let i = 0; i < iterables.length; i++) {
106
+ const iterable = iterables[i];
107
+
108
+ if (isNil(iterable) || typeof iterable[Symbol.iterator] !== 'function') {
109
+ return;
110
+ }
111
+
112
+ iterators.push(iterable[Symbol.iterator]());
113
+ }
114
+
115
+ while (true) {
116
+ const row = [];
117
+
118
+ for (let i = 0; i < iterators.length; i++) {
119
+ const next = iterators[i].next();
120
+
121
+ if (next.done) {
122
+ return;
123
+ }
124
+
125
+ row.push(next.value);
126
+ }
127
+
128
+ yield row;
129
+ }
130
+ }
131
+
132
+
133
+ function* range(start, stop, step) {
134
+ let begin;
135
+ let end;
136
+ let stride;
137
+
138
+ if (stop === undefined) {
139
+ begin = 0;
140
+ end = Number(start);
141
+ stride = 1;
142
+ } else {
143
+ begin = Number(start);
144
+ end = Number(stop);
145
+ stride = step === undefined ? 1 : Number(step);
146
+ }
147
+
148
+ if (!Number.isFinite(begin) || !Number.isFinite(end) || !Number.isFinite(stride) || stride === 0) {
149
+ return;
150
+ }
151
+
152
+ if (stride > 0) {
153
+ for (let i = 0; begin + i * stride < end; i++) {
154
+ yield begin + i * stride;
155
+ }
156
+ } else {
157
+ for (let i = 0; begin + i * stride > end; i++) {
158
+ yield begin + i * stride;
159
+ }
160
+ }
161
+ }
162
+
163
+
164
+ function* enumerate(iterable, start=0) {
165
+ if (isNil(iterable)) {
166
+ return;
167
+ }
168
+
169
+ let i = toInteger(start);
170
+
171
+ for (const value of iterable) {
172
+ yield [i, value];
173
+ i += 1;
174
+ }
175
+ }
176
+
177
+
178
+ function sameValueZero(a, b) {
179
+ return a === b || (a !== a && b !== b);
180
+ }
181
+
182
+
183
+ function* islice(iterable, start, stop, step) {
184
+ if (isNil(iterable)) {
185
+ return;
186
+ }
187
+
188
+ let begin;
189
+ let end;
190
+ let stride;
191
+
192
+ if (stop === undefined && step === undefined) {
193
+ begin = 0;
194
+ end = start;
195
+ stride = 1;
196
+ } else {
197
+ begin = isNil(start) ? 0 : toInteger(start);
198
+ end = stop;
199
+ stride = step === undefined || isNil(step) ? 1 : toInteger(step);
200
+ }
201
+
202
+ if (stride < 1) {
203
+ return;
204
+ }
205
+
206
+ const hasEnd = !(end === null || end === undefined);
207
+ const stopAt = hasEnd ? toInteger(end) : Infinity;
208
+ const skip = toInteger(begin);
209
+
210
+ if (hasEnd && stopAt <= skip) {
211
+ return;
212
+ }
213
+
214
+ let i = 0;
215
+ let nextIndex = skip;
216
+
217
+ for (const item of iterable) {
218
+ if (hasEnd && i >= stopAt) {
219
+ return;
220
+ }
221
+
222
+ if (i === nextIndex) {
223
+ yield item;
224
+ nextIndex += stride;
225
+ }
226
+
227
+ i += 1;
228
+ }
229
+ }
230
+
231
+
232
+ function* takewhile(predicate, iterable) {
233
+ if (isNil(iterable) || !isFunction(predicate)) {
234
+ return;
235
+ }
236
+
237
+ for (const item of iterable) {
238
+ if (!predicate(item)) {
239
+ return;
240
+ }
241
+
242
+ yield item;
243
+ }
244
+ }
245
+
246
+
247
+ function* dropwhile(predicate, iterable) {
248
+ if (isNil(iterable) || !isFunction(predicate)) {
249
+ return;
250
+ }
251
+
252
+ let dropping = true;
253
+
254
+ for (const item of iterable) {
255
+ if (dropping && predicate(item)) {
256
+ continue;
257
+ }
258
+
259
+ dropping = false;
260
+ yield item;
261
+ }
262
+ }
263
+
264
+
265
+ function* filterfalse(predicate, iterable) {
266
+ if (isNil(iterable) || !isFunction(predicate)) {
267
+ return;
268
+ }
269
+
270
+ for (const item of iterable) {
271
+ if (!predicate(item)) {
272
+ yield item;
273
+ }
274
+ }
275
+ }
276
+
277
+
278
+ function* zip_longest(...args) {
279
+ let fillvalue;
280
+ let iterables = args;
281
+
282
+ if (args.length > 0) {
283
+ const last = args[args.length - 1];
284
+
285
+ if (isObject(last) && typeof last[Symbol.iterator] !== 'function' && Object.prototype.hasOwnProperty.call(last, 'fillvalue')) {
286
+ fillvalue = last.fillvalue;
287
+ iterables = args.slice(0, -1);
288
+ }
289
+ }
290
+
291
+ if (iterables.length === 0) {
292
+ return;
293
+ }
294
+
295
+ const iterators = [];
296
+
297
+ for (let i = 0; i < iterables.length; i++) {
298
+ const iterable = iterables[i];
299
+
300
+ if (isNil(iterable) || typeof iterable[Symbol.iterator] !== 'function') {
301
+ return;
302
+ }
303
+
304
+ iterators.push(iterable[Symbol.iterator]());
305
+ }
306
+
307
+ while (true) {
308
+ const row = [];
309
+ let anyAlive = false;
310
+
311
+ for (let i = 0; i < iterators.length; i++) {
312
+ if (iterators[i] === null) {
313
+ row.push(fillvalue);
314
+ continue;
315
+ }
316
+
317
+ const next = iterators[i].next();
318
+
319
+ if (next.done) {
320
+ iterators[i] = null;
321
+ row.push(fillvalue);
322
+ } else {
323
+ anyAlive = true;
324
+ row.push(next.value);
325
+ }
326
+ }
327
+
328
+ if (!anyAlive) {
329
+ return;
330
+ }
331
+
332
+ yield row;
333
+ }
334
+ }
335
+
336
+
337
+ function* product(...iterables) {
338
+ const pools = [];
339
+
340
+ for (let i = 0; i < iterables.length; i++) {
341
+ const iterable = iterables[i];
342
+
343
+ if (isNil(iterable) || typeof iterable[Symbol.iterator] !== 'function') {
344
+ return;
345
+ }
346
+
347
+ pools.push([...iterable]);
348
+ }
349
+
350
+ if (pools.length === 0) {
351
+ yield [];
352
+ return;
353
+ }
354
+
355
+ for (let i = 0; i < pools.length; i++) {
356
+ if (pools[i].length === 0) {
357
+ return;
358
+ }
359
+ }
360
+
361
+ const lengths = [];
362
+ const idx = [];
363
+
364
+ for (let i = 0; i < pools.length; i++) {
365
+ lengths.push(pools[i].length);
366
+ idx.push(0);
367
+ }
368
+
369
+ while (true) {
370
+ const row = [];
371
+
372
+ for (let i = 0; i < pools.length; i++) {
373
+ row.push(pools[i][idx[i]]);
374
+ }
375
+
376
+ yield row;
377
+
378
+ let k = pools.length - 1;
379
+
380
+ while (k >= 0) {
381
+ idx[k] += 1;
382
+
383
+ if (idx[k] < lengths[k]) {
384
+ break;
385
+ }
386
+
387
+ idx[k] = 0;
388
+ k -= 1;
389
+ }
390
+
391
+ if (k < 0) {
392
+ return;
393
+ }
394
+ }
395
+ }
396
+
397
+
398
+ function* groupby(iterable, keyFn) {
399
+ if (isNil(iterable)) {
400
+ return;
401
+ }
402
+
403
+ const keyer = isFunction(keyFn) ? keyFn : (x) => x;
404
+ let started = false;
405
+ let currentKey;
406
+ let currentGroup = [];
407
+
408
+ for (const item of iterable) {
409
+ const k = keyer(item);
410
+
411
+ if (!started) {
412
+ started = true;
413
+ currentKey = k;
414
+ currentGroup.push(item);
415
+ continue;
416
+ }
417
+
418
+ if (sameValueZero(k, currentKey)) {
419
+ currentGroup.push(item);
420
+ } else {
421
+ yield [currentKey, currentGroup];
422
+ currentKey = k;
423
+ currentGroup = [item];
424
+ }
425
+ }
426
+
427
+ if (started) {
428
+ yield [currentKey, currentGroup];
429
+ }
430
+ }
431
+
432
+
433
+ function* starmap(fn, iterable) {
434
+ if (!isFunction(fn) || isNil(iterable)) {
435
+ return;
436
+ }
437
+
438
+ for (const args of iterable) {
439
+ yield fn.apply(undefined, args);
440
+ }
441
+ }
442
+
443
+
444
+ function* batched(iterable, n) {
445
+ if (isNil(iterable)) {
446
+ return;
447
+ }
448
+
449
+ const size = toInteger(n);
450
+
451
+ if (size < 1) {
452
+ return;
453
+ }
454
+
455
+ let batch = [];
456
+
457
+ for (const item of iterable) {
458
+ batch.push(item);
459
+
460
+ if (batch.length === size) {
461
+ yield batch;
462
+ batch = [];
463
+ }
464
+ }
465
+
466
+ if (batch.length > 0) {
467
+ yield batch;
468
+ }
469
+ }
470
+
471
+
472
+ function* pairwise(iterable) {
473
+ if (isNil(iterable) || typeof iterable[Symbol.iterator] !== 'function') {
474
+ return;
475
+ }
476
+
477
+ const it = iterable[Symbol.iterator]();
478
+ const first = it.next();
479
+
480
+ if (first.done) {
481
+ return;
482
+ }
483
+
484
+ let prev = first.value;
485
+
486
+ while (true) {
487
+ const next = it.next();
488
+
489
+ if (next.done) {
490
+ return;
491
+ }
492
+
493
+ yield [prev, next.value];
494
+ prev = next.value;
495
+ }
496
+ }
497
+
498
+
499
+ function* compress(data, selectors) {
500
+ if (isNil(data) || isNil(selectors) || typeof selectors[Symbol.iterator] !== 'function') {
501
+ return;
502
+ }
503
+
504
+ const sel = selectors[Symbol.iterator]();
505
+
506
+ for (const item of data) {
507
+ const s = sel.next();
508
+
509
+ if (s.done) {
510
+ return;
511
+ }
512
+
513
+ if (s.value) {
514
+ yield item;
515
+ }
516
+ }
517
+ }
518
+
519
+
34
520
  module.exports = {
35
521
  count,
36
- repeat
37
- };
522
+ repeat,
523
+ cycle,
524
+ chain,
525
+ take,
526
+ zip,
527
+ range,
528
+ enumerate,
529
+ islice,
530
+ takewhile,
531
+ dropwhile,
532
+ filterfalse,
533
+ zip_longest,
534
+ product,
535
+ groupby,
536
+ starmap,
537
+ batched,
538
+ pairwise,
539
+ compress
540
+ };
@@ -0,0 +1,123 @@
1
+ const { isNil, isArray, isString } = require('./checks.js');
2
+
3
+
4
+ const UNSAFE_KEYS = new Set(['__proto__', 'prototype', 'constructor']);
5
+
6
+
7
+ function toKeyList(keys) {
8
+ if (isArray(keys)) {
9
+ return keys;
10
+ }
11
+
12
+ return [keys];
13
+ }
14
+
15
+
16
+ function pathKeys(path) {
17
+ if (isArray(path)) {
18
+ return path;
19
+ }
20
+
21
+ if (isString(path)) {
22
+ if (path.length === 0) {
23
+ return [];
24
+ }
25
+
26
+ return path.split('.');
27
+ }
28
+
29
+ return [path];
30
+ }
31
+
32
+
33
+ function assignOwn(target, key, value) {
34
+ if (UNSAFE_KEYS.has(String(key))) {
35
+ Object.defineProperty(target, key, {
36
+ value: value,
37
+ enumerable: true,
38
+ configurable: true,
39
+ writable: true
40
+ });
41
+ return;
42
+ }
43
+
44
+ target[key] = value;
45
+ }
46
+
47
+
48
+ function pick(obj, keys) {
49
+ if (isNil(obj) || (typeof obj !== 'object' && typeof obj !== 'function')) {
50
+ return {};
51
+ }
52
+
53
+ const result = {};
54
+ const list = toKeyList(keys);
55
+
56
+ for (let i = 0; i < list.length; i++) {
57
+ const key = list[i];
58
+
59
+ if (key in obj) {
60
+ assignOwn(result, key, obj[key]);
61
+ }
62
+ }
63
+
64
+ return result;
65
+ }
66
+
67
+
68
+ function omit(obj, keys) {
69
+ if (isNil(obj) || (typeof obj !== 'object' && typeof obj !== 'function')) {
70
+ return {};
71
+ }
72
+
73
+ const exclude = new Set();
74
+ const list = toKeyList(keys);
75
+
76
+ for (let i = 0; i < list.length; i++) {
77
+ exclude.add(String(list[i]));
78
+ }
79
+
80
+ const result = {};
81
+ const ownKeys = Object.keys(obj);
82
+
83
+ for (let i = 0; i < ownKeys.length; i++) {
84
+ const key = ownKeys[i];
85
+
86
+ if (!exclude.has(key)) {
87
+ assignOwn(result, key, obj[key]);
88
+ }
89
+ }
90
+
91
+ return result;
92
+ }
93
+
94
+
95
+ function get(obj, path, defaultValue) {
96
+ if (isNil(obj)) {
97
+ return defaultValue;
98
+ }
99
+
100
+ const keys = pathKeys(path);
101
+ let current = obj;
102
+
103
+ for (let i = 0; i < keys.length; i++) {
104
+ if (isNil(current) || (typeof current !== 'object' && typeof current !== 'function')) {
105
+ return defaultValue;
106
+ }
107
+
108
+ current = current[keys[i]];
109
+ }
110
+
111
+ if (current === undefined) {
112
+ return defaultValue;
113
+ }
114
+
115
+ return current;
116
+ }
117
+
118
+
119
+ module.exports = {
120
+ pick,
121
+ omit,
122
+ get
123
+ };
@@ -20,6 +20,63 @@ function toInteger(num) {
20
20
  }
21
21
 
22
22
 
23
+ function toNumber(num) {
24
+ if (isNil(num)) {
25
+ return 0;
26
+ }
27
+
28
+ try {
29
+ const r = parseFloat(num);
30
+
31
+ if (isNaN(r)) {
32
+ return 0;
33
+ }
34
+
35
+ return r;
36
+ } catch (e) {
37
+ return 0;
38
+ }
39
+ }
40
+
41
+
42
+ function clamp(value, min, max) {
43
+ const n = Number(value);
44
+ let lo = Number(min);
45
+ let hi = Number(max);
46
+
47
+ if (lo > hi) {
48
+ const tmp = lo;
49
+ lo = hi;
50
+ hi = tmp;
51
+ }
52
+
53
+ if (n < lo) {
54
+ return lo;
55
+ }
56
+
57
+ if (n > hi) {
58
+ return hi;
59
+ }
60
+
61
+ return n;
62
+ }
63
+
64
+
65
+ function mod(n, m) {
66
+ const a = Number(n);
67
+ const b = Number(m);
68
+
69
+ if (!Number.isFinite(a) || !Number.isFinite(b) || b === 0) {
70
+ return 0;
71
+ }
72
+
73
+ return a - b * Math.floor(a / b);
74
+ }
75
+
76
+
23
77
  module.exports = {
24
- toInteger
25
- }
78
+ toInteger,
79
+ toNumber,
80
+ clamp,
81
+ mod
82
+ }