@naturalcycles/js-lib 15.7.0 → 15.8.0

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,5 +1,7 @@
1
1
  import { AsyncIterable2 } from '../iter/asyncIterable2.js';
2
2
  import { Iterable2 } from '../iter/iterable2.js';
3
+ import type { Primitive } from '../typeFest.js';
4
+ import type { Integer } from '../types.js';
3
5
  /**
4
6
  * Returns an array with ranges from `from` up to (but not including) `to`.
5
7
  *
@@ -10,15 +12,24 @@ import { Iterable2 } from '../iter/iterable2.js';
10
12
  * range(3, 6) // [ 3, 4, 5 ]
11
13
  * range(1, 10, 2) // [ 1, 3, 5, 7, 9 ]
12
14
  */
13
- export declare function _range(toExcl: number): number[];
14
- export declare function _range(fromIncl: number, toExcl: number, step?: number): number[];
15
+ export declare function _range(toExcl: Integer): number[];
16
+ export declare function _range(fromIncl: Integer, toExcl: Integer, step?: number): number[];
17
+ /**
18
+ * Returns an array of `length` filled with `fill` primitive value.
19
+ * Performance-optimized implementation.
20
+ * `Array.from({ length }, () => fill)` shows ~25x perf regression in benchmarks
21
+ *
22
+ * Fill is Primitive, because it's safe to shallow-copy.
23
+ * If it was an object - it'll paste the same object reference, which can create bugs.
24
+ */
25
+ export declare function _rangeFilled<T extends Primitive>(length: Integer, fill: T): T[];
15
26
  /**
16
27
  * Like _range, but returns an Iterable2.
17
28
  */
18
- export declare function _rangeIterable(toExcl: number): Iterable2<number>;
19
- export declare function _rangeIterable(fromIncl: number, toExcl: number, step?: number): Iterable2<number>;
29
+ export declare function _rangeIterable(toExcl: Integer): Iterable2<number>;
30
+ export declare function _rangeIterable(fromIncl: Integer, toExcl: Integer, step?: number): Iterable2<number>;
20
31
  /**
21
32
  * Like _range, but returns an AsyncIterable2.
22
33
  */
23
- export declare function _rangeAsyncIterable(toExcl: number): AsyncIterable2<number>;
24
- export declare function _rangeAsyncIterable(fromIncl: number, toExcl: number, step?: number): AsyncIterable2<number>;
34
+ export declare function _rangeAsyncIterable(toExcl: Integer): AsyncIterable2<number>;
35
+ export declare function _rangeAsyncIterable(fromIncl: Integer, toExcl: Integer, step?: number): AsyncIterable2<number>;
@@ -2,9 +2,26 @@ import { AsyncIterable2 } from '../iter/asyncIterable2.js';
2
2
  import { Iterable2 } from '../iter/iterable2.js';
3
3
  export function _range(fromIncl, toExcl, step = 1) {
4
4
  if (toExcl === undefined) {
5
- return Array.from(new Array(fromIncl), (_, i) => i);
5
+ toExcl = fromIncl;
6
+ fromIncl = 0;
6
7
  }
7
- return Array.from({ length: Math.ceil((toExcl - fromIncl) / step) }, (_, i) => i * step + fromIncl);
8
+ const a = [];
9
+ for (let i = fromIncl; i < toExcl; i += step) {
10
+ a.push(i);
11
+ }
12
+ return a;
13
+ }
14
+ /**
15
+ * Returns an array of `length` filled with `fill` primitive value.
16
+ * Performance-optimized implementation.
17
+ * `Array.from({ length }, () => fill)` shows ~25x perf regression in benchmarks
18
+ *
19
+ * Fill is Primitive, because it's safe to shallow-copy.
20
+ * If it was an object - it'll paste the same object reference, which can create bugs.
21
+ */
22
+ export function _rangeFilled(length, fill) {
23
+ // biome-ignore lint/style/useConsistentBuiltinInstantiation: ok
24
+ return Array(length).fill(fill);
8
25
  }
9
26
  export function _rangeIterable(fromIncl, toExcl, step = 1) {
10
27
  if (toExcl === undefined) {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@naturalcycles/js-lib",
3
3
  "type": "module",
4
- "version": "15.7.0",
4
+ "version": "15.8.0",
5
5
  "dependencies": {
6
6
  "tslib": "^2",
7
7
  "zod": "^3"
@@ -1,7 +1,7 @@
1
1
  import { AsyncIterable2 } from '../iter/asyncIterable2.js'
2
2
  import { Iterable2 } from '../iter/iterable2.js'
3
-
4
- /* eslint-disable unicorn/no-new-array */
3
+ import type { Primitive } from '../typeFest.js'
4
+ import type { Integer } from '../types.js'
5
5
 
6
6
  /**
7
7
  * Returns an array with ranges from `from` up to (but not including) `to`.
@@ -13,25 +13,40 @@ import { Iterable2 } from '../iter/iterable2.js'
13
13
  * range(3, 6) // [ 3, 4, 5 ]
14
14
  * range(1, 10, 2) // [ 1, 3, 5, 7, 9 ]
15
15
  */
16
- export function _range(toExcl: number): number[]
17
- export function _range(fromIncl: number, toExcl: number, step?: number): number[]
18
- export function _range(fromIncl: number, toExcl?: number, step = 1): number[] {
16
+ export function _range(toExcl: Integer): number[]
17
+ export function _range(fromIncl: Integer, toExcl: Integer, step?: number): number[]
18
+ export function _range(fromIncl: Integer, toExcl?: Integer, step = 1): number[] {
19
19
  if (toExcl === undefined) {
20
- return Array.from(new Array(fromIncl), (_, i) => i)
20
+ toExcl = fromIncl
21
+ fromIncl = 0
21
22
  }
22
23
 
23
- return Array.from(
24
- { length: Math.ceil((toExcl - fromIncl) / step) },
25
- (_, i) => i * step + fromIncl,
26
- )
24
+ const a: number[] = []
25
+ for (let i = fromIncl; i < toExcl; i += step) {
26
+ a.push(i)
27
+ }
28
+ return a
29
+ }
30
+
31
+ /**
32
+ * Returns an array of `length` filled with `fill` primitive value.
33
+ * Performance-optimized implementation.
34
+ * `Array.from({ length }, () => fill)` shows ~25x perf regression in benchmarks
35
+ *
36
+ * Fill is Primitive, because it's safe to shallow-copy.
37
+ * If it was an object - it'll paste the same object reference, which can create bugs.
38
+ */
39
+ export function _rangeFilled<T extends Primitive>(length: Integer, fill: T): T[] {
40
+ // biome-ignore lint/style/useConsistentBuiltinInstantiation: ok
41
+ return Array(length).fill(fill)
27
42
  }
28
43
 
29
44
  /**
30
45
  * Like _range, but returns an Iterable2.
31
46
  */
32
- export function _rangeIterable(toExcl: number): Iterable2<number>
33
- export function _rangeIterable(fromIncl: number, toExcl: number, step?: number): Iterable2<number>
34
- export function _rangeIterable(fromIncl: number, toExcl?: number, step = 1): Iterable2<number> {
47
+ export function _rangeIterable(toExcl: Integer): Iterable2<number>
48
+ export function _rangeIterable(fromIncl: Integer, toExcl: Integer, step?: number): Iterable2<number>
49
+ export function _rangeIterable(fromIncl: Integer, toExcl?: Integer, step = 1): Iterable2<number> {
35
50
  if (toExcl === undefined) {
36
51
  toExcl = fromIncl
37
52
  fromIncl = 0
@@ -49,15 +64,15 @@ export function _rangeIterable(fromIncl: number, toExcl?: number, step = 1): Ite
49
64
  /**
50
65
  * Like _range, but returns an AsyncIterable2.
51
66
  */
52
- export function _rangeAsyncIterable(toExcl: number): AsyncIterable2<number>
67
+ export function _rangeAsyncIterable(toExcl: Integer): AsyncIterable2<number>
53
68
  export function _rangeAsyncIterable(
54
- fromIncl: number,
55
- toExcl: number,
69
+ fromIncl: Integer,
70
+ toExcl: Integer,
56
71
  step?: number,
57
72
  ): AsyncIterable2<number>
58
73
  export function _rangeAsyncIterable(
59
- fromIncl: number,
60
- toExcl?: number,
74
+ fromIncl: Integer,
75
+ toExcl?: Integer,
61
76
  step = 1,
62
77
  ): AsyncIterable2<number> {
63
78
  if (toExcl === undefined) {