@thi.ng/transducers 8.7.2 → 8.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.
- package/CHANGELOG.md +8 -1
- package/README.md +25 -1
- package/consume.d.ts +23 -0
- package/consume.js +25 -0
- package/index.d.ts +3 -0
- package/index.js +3 -0
- package/package.json +13 -4
- package/repeatedly2d.d.ts +22 -0
- package/repeatedly2d.js +26 -0
- package/repeatedly3d.d.ts +22 -0
- package/repeatedly3d.js +28 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Change Log
|
|
2
2
|
|
|
3
|
-
- **Last updated**: 2023-
|
|
3
|
+
- **Last updated**: 2023-10-11T10:05:08Z
|
|
4
4
|
- **Generator**: [thi.ng/monopub](https://thi.ng/monopub)
|
|
5
5
|
|
|
6
6
|
All notable changes to this project will be documented in this file.
|
|
@@ -9,6 +9,13 @@ See [Conventional Commits](https://conventionalcommits.org/) for commit guidelin
|
|
|
9
9
|
**Note:** Unlisted _patch_ versions only involve non-code or otherwise excluded changes
|
|
10
10
|
and/or version bumps of transitive dependencies.
|
|
11
11
|
|
|
12
|
+
## [8.8.0](https://github.com/thi-ng/umbrella/tree/@thi.ng/transducers@8.8.0) (2023-10-11)
|
|
13
|
+
|
|
14
|
+
#### 🚀 Features
|
|
15
|
+
|
|
16
|
+
- add repeatedly2d/3d() iterators ([5057939](https://github.com/thi-ng/umbrella/commit/5057939))
|
|
17
|
+
- add consume() helper fn ([e612846](https://github.com/thi-ng/umbrella/commit/e612846))
|
|
18
|
+
|
|
12
19
|
## [8.7.0](https://github.com/thi-ng/umbrella/tree/@thi.ng/transducers@8.7.0) (2023-09-15)
|
|
13
20
|
|
|
14
21
|
#### 🚀 Features
|
package/README.md
CHANGED
|
@@ -52,6 +52,7 @@ This project is part of the
|
|
|
52
52
|
- [transduce](#transduce)
|
|
53
53
|
- [transduceRight](#transduceright)
|
|
54
54
|
- [run](#run)
|
|
55
|
+
- [consume](#consume)
|
|
55
56
|
- [Transducers](#transducers)
|
|
56
57
|
- [Generators / Iterators](#generators--iterators)
|
|
57
58
|
- [Reducers](#reducers)
|
|
@@ -174,7 +175,7 @@ For Node.js REPL:
|
|
|
174
175
|
const transducers = await import("@thi.ng/transducers");
|
|
175
176
|
```
|
|
176
177
|
|
|
177
|
-
Package sizes (brotli'd, pre-treeshake): ESM: 8.
|
|
178
|
+
Package sizes (brotli'd, pre-treeshake): ESM: 8.78 KB
|
|
178
179
|
|
|
179
180
|
## Dependencies
|
|
180
181
|
|
|
@@ -201,6 +202,7 @@ A selection:
|
|
|
201
202
|
| <img src="https://raw.githubusercontent.com/thi-ng/umbrella/develop/assets/examples/ascii-raymarch.jpg" width="240"/> | ASCII art raymarching with thi.ng/shader-ast & thi.ng/text-canvas | [Demo](https://demo.thi.ng/umbrella/ascii-raymarch/) | [Source](https://github.com/thi-ng/umbrella/tree/develop/examples/ascii-raymarch) |
|
|
202
203
|
| <img src="https://raw.githubusercontent.com/thi-ng/umbrella/develop/assets/examples/big-font.png" width="240"/> | Large ASCII font text generator using @thi.ng/rdom | [Demo](https://demo.thi.ng/umbrella/big-font/) | [Source](https://github.com/thi-ng/umbrella/tree/develop/examples/big-font) |
|
|
203
204
|
| <img src="https://raw.githubusercontent.com/thi-ng/umbrella/develop/assets/examples/bitmap-font.gif" width="240"/> | Figlet-style bitmap font creation with transducers | [Demo](https://demo.thi.ng/umbrella/bitmap-font/) | [Source](https://github.com/thi-ng/umbrella/tree/develop/examples/bitmap-font) |
|
|
205
|
+
| <img src="https://raw.githubusercontent.com/thi-ng/umbrella/develop/assets/examples/canvas-recorder.png" width="240"/> | Self-modifying, animated typographic grid with emergent complex patterns | [Demo](https://demo.thi.ng/umbrella/canvas-recorder/) | [Source](https://github.com/thi-ng/umbrella/tree/develop/examples/canvas-recorder) |
|
|
204
206
|
| <img src="https://raw.githubusercontent.com/thi-ng/umbrella/develop/assets/examples/cellular-automata.png" width="240"/> | 2D transducer based cellular automata | [Demo](https://demo.thi.ng/umbrella/cellular-automata/) | [Source](https://github.com/thi-ng/umbrella/tree/develop/examples/cellular-automata) |
|
|
205
207
|
| <img src="https://raw.githubusercontent.com/thi-ng/umbrella/develop/assets/examples/commit-heatmap.png" width="240"/> | Heatmap visualization of this mono-repo's commits | | [Source](https://github.com/thi-ng/umbrella/tree/develop/examples/commit-heatmap) |
|
|
206
208
|
| <img src="https://raw.githubusercontent.com/thi-ng/umbrella/develop/assets/examples/commit-table-ssr.png" width="240"/> | Filterable commit log UI w/ minimal server to provide commit history | [Demo](https://demo.thi.ng/umbrella/commit-table-ssr/) | [Source](https://github.com/thi-ng/umbrella/tree/develop/examples/commit-table-ssr) |
|
|
@@ -851,6 +853,26 @@ every value produced by the transducer. If `fx` is _not_ given, the
|
|
|
851
853
|
transducer is assumed to include at least one `sideEffect()` step
|
|
852
854
|
itself. Returns nothing.
|
|
853
855
|
|
|
856
|
+
#### consume
|
|
857
|
+
|
|
858
|
+
`consume(src: Iterable<any>): void`
|
|
859
|
+
|
|
860
|
+
Similar to `run()`, consumes given iterable, presumably for any implicit
|
|
861
|
+
side-effects. Iterable MUST be finite!
|
|
862
|
+
|
|
863
|
+
```ts
|
|
864
|
+
// here the function given to repeatedly2d() has only a side-effect, however
|
|
865
|
+
// repeatedly2d() itself is lazy. Using consume() then forces this lazy iterator/generator
|
|
866
|
+
// to be realized and so also the side-effects to be executed
|
|
867
|
+
consume(repeatedly2d((x, y) => console.log("output:", [x, y]), 2, 3));
|
|
868
|
+
// output: [ 0, 0 ]
|
|
869
|
+
// output: [ 1, 0 ]
|
|
870
|
+
// output: [ 0, 1 ]
|
|
871
|
+
// output: [ 1, 1 ]
|
|
872
|
+
// output: [ 0, 2 ]
|
|
873
|
+
// output: [ 1, 2 ]
|
|
874
|
+
```
|
|
875
|
+
|
|
854
876
|
### Transducers
|
|
855
877
|
|
|
856
878
|
All of the following functions can be used and composed as transducers.
|
|
@@ -964,6 +986,8 @@ transduce(map((x) => x*10), push(), range(4))
|
|
|
964
986
|
- [rangeNd](https://github.com/thi-ng/umbrella/tree/develop/packages/transducers/src/range-nd.ts)
|
|
965
987
|
- [repeat](https://github.com/thi-ng/umbrella/tree/develop/packages/transducers/src/repeat.ts)
|
|
966
988
|
- [repeatedly](https://github.com/thi-ng/umbrella/tree/develop/packages/transducers/src/repeatedly.ts)
|
|
989
|
+
- [repeatedly2d](https://github.com/thi-ng/umbrella/tree/develop/packages/transducers/src/repeatedly2d.ts)
|
|
990
|
+
- [repeatedly3d](https://github.com/thi-ng/umbrella/tree/develop/packages/transducers/src/repeatedly3d.ts)
|
|
967
991
|
- [reverse](https://github.com/thi-ng/umbrella/tree/develop/packages/transducers/src/reverse.ts)
|
|
968
992
|
- [sortedKeys](https://github.com/thi-ng/umbrella/tree/develop/packages/transducers/src/sorted-keys.ts)
|
|
969
993
|
- [symmetric](https://github.com/thi-ng/umbrella/tree/develop/packages/transducers/src/symmetric.ts)
|
package/consume.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Consumes given iterable, presumably for any implicit side-effects. Iterable
|
|
3
|
+
* MUST be finite!
|
|
4
|
+
*
|
|
5
|
+
* @remarks
|
|
6
|
+
* See {@link run} for a similar approach when also side-effecting transducers
|
|
7
|
+
* should be applied.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* consume(repeatedly2d((x, y) => console.log("output:", [x, y]), 2, 3));
|
|
12
|
+
* // output: [ 0, 0 ]
|
|
13
|
+
* // output: [ 1, 0 ]
|
|
14
|
+
* // output: [ 0, 1 ]
|
|
15
|
+
* // output: [ 1, 1 ]
|
|
16
|
+
* // output: [ 0, 2 ]
|
|
17
|
+
* // output: [ 1, 2 ]
|
|
18
|
+
* ```
|
|
19
|
+
*
|
|
20
|
+
* @param src
|
|
21
|
+
*/
|
|
22
|
+
export declare const consume: (src: Iterable<any>) => void;
|
|
23
|
+
//# sourceMappingURL=consume.d.ts.map
|
package/consume.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Consumes given iterable, presumably for any implicit side-effects. Iterable
|
|
3
|
+
* MUST be finite!
|
|
4
|
+
*
|
|
5
|
+
* @remarks
|
|
6
|
+
* See {@link run} for a similar approach when also side-effecting transducers
|
|
7
|
+
* should be applied.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* consume(repeatedly2d((x, y) => console.log("output:", [x, y]), 2, 3));
|
|
12
|
+
* // output: [ 0, 0 ]
|
|
13
|
+
* // output: [ 1, 0 ]
|
|
14
|
+
* // output: [ 0, 1 ]
|
|
15
|
+
* // output: [ 1, 1 ]
|
|
16
|
+
* // output: [ 0, 2 ]
|
|
17
|
+
* // output: [ 1, 2 ]
|
|
18
|
+
* ```
|
|
19
|
+
*
|
|
20
|
+
* @param src
|
|
21
|
+
*/
|
|
22
|
+
export const consume = (src) => {
|
|
23
|
+
for (let _ of src)
|
|
24
|
+
;
|
|
25
|
+
};
|
package/index.d.ts
CHANGED
|
@@ -8,6 +8,7 @@ export * from "./step.js";
|
|
|
8
8
|
export * from "./transduce.js";
|
|
9
9
|
export * from "./comp.js";
|
|
10
10
|
export * from "./compr.js";
|
|
11
|
+
export * from "./consume.js";
|
|
11
12
|
export * from "./deep-transform.js";
|
|
12
13
|
export * from "./juxtr.js";
|
|
13
14
|
export * from "./lookup.js";
|
|
@@ -139,6 +140,8 @@ export * from "./range3d.js";
|
|
|
139
140
|
export * from "./range-nd.js";
|
|
140
141
|
export * from "./repeat.js";
|
|
141
142
|
export * from "./repeatedly.js";
|
|
143
|
+
export * from "./repeatedly2d.js";
|
|
144
|
+
export * from "./repeatedly3d.js";
|
|
142
145
|
export * from "./reverse.js";
|
|
143
146
|
export * from "./sorted-keys.js";
|
|
144
147
|
export * from "./symmetric.js";
|
package/index.js
CHANGED
|
@@ -9,6 +9,7 @@ export * from "./transduce.js";
|
|
|
9
9
|
// helpers
|
|
10
10
|
export * from "./comp.js";
|
|
11
11
|
export * from "./compr.js";
|
|
12
|
+
export * from "./consume.js";
|
|
12
13
|
export * from "./deep-transform.js";
|
|
13
14
|
export * from "./juxtr.js";
|
|
14
15
|
export * from "./lookup.js";
|
|
@@ -143,6 +144,8 @@ export * from "./range3d.js";
|
|
|
143
144
|
export * from "./range-nd.js";
|
|
144
145
|
export * from "./repeat.js";
|
|
145
146
|
export * from "./repeatedly.js";
|
|
147
|
+
export * from "./repeatedly2d.js";
|
|
148
|
+
export * from "./repeatedly3d.js";
|
|
146
149
|
export * from "./reverse.js";
|
|
147
150
|
export * from "./sorted-keys.js";
|
|
148
151
|
export * from "./symmetric.js";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@thi.ng/transducers",
|
|
3
|
-
"version": "8.
|
|
3
|
+
"version": "8.8.0",
|
|
4
4
|
"description": "Lightweight transducer implementations for ES6 / TypeScript",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"module": "./index.js",
|
|
@@ -39,13 +39,13 @@
|
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
41
|
"@thi.ng/api": "^8.9.5",
|
|
42
|
-
"@thi.ng/arrays": "^2.6.
|
|
42
|
+
"@thi.ng/arrays": "^2.6.1",
|
|
43
43
|
"@thi.ng/checks": "^3.4.5",
|
|
44
44
|
"@thi.ng/compare": "^2.2.0",
|
|
45
45
|
"@thi.ng/compose": "^2.1.41",
|
|
46
46
|
"@thi.ng/errors": "^2.3.5",
|
|
47
47
|
"@thi.ng/math": "^5.6.1",
|
|
48
|
-
"@thi.ng/random": "^3.6.
|
|
48
|
+
"@thi.ng/random": "^3.6.7"
|
|
49
49
|
},
|
|
50
50
|
"devDependencies": {
|
|
51
51
|
"@microsoft/api-extractor": "^7.36.4",
|
|
@@ -147,6 +147,9 @@
|
|
|
147
147
|
"./conj": {
|
|
148
148
|
"default": "./conj.js"
|
|
149
149
|
},
|
|
150
|
+
"./consume": {
|
|
151
|
+
"default": "./consume.js"
|
|
152
|
+
},
|
|
150
153
|
"./converge": {
|
|
151
154
|
"default": "./converge.js"
|
|
152
155
|
},
|
|
@@ -459,6 +462,12 @@
|
|
|
459
462
|
"./repeatedly": {
|
|
460
463
|
"default": "./repeatedly.js"
|
|
461
464
|
},
|
|
465
|
+
"./repeatedly2d": {
|
|
466
|
+
"default": "./repeatedly2d.js"
|
|
467
|
+
},
|
|
468
|
+
"./repeatedly3d": {
|
|
469
|
+
"default": "./repeatedly3d.js"
|
|
470
|
+
},
|
|
462
471
|
"./reverse": {
|
|
463
472
|
"default": "./reverse.js"
|
|
464
473
|
},
|
|
@@ -579,5 +588,5 @@
|
|
|
579
588
|
],
|
|
580
589
|
"year": 2016
|
|
581
590
|
},
|
|
582
|
-
"gitHead": "
|
|
591
|
+
"gitHead": "e9f04908dc37ae9e29320f098d195f9f8445a1ad\n"
|
|
583
592
|
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { FnU2 } from "@thi.ng/api";
|
|
2
|
+
/**
|
|
3
|
+
* Syntax sugar for `map(fn, range2d(cols, rows))`. Returns iterator yielding
|
|
4
|
+
* values of given 2-arg function `fn` which is called repeatedly with `x` and
|
|
5
|
+
* `y` grid coordinates. The iteration order is always row-major.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* [...repeatedly2d((x, y) => [(x + 1) * 10, (y + 1) * 100], 2, 3)]
|
|
10
|
+
* // [
|
|
11
|
+
* // [ 10, 100 ], [ 20, 100 ],
|
|
12
|
+
* // [ 10, 200 ], [ 20, 200 ],
|
|
13
|
+
* // [ 10, 300 ], [ 20, 300 ]
|
|
14
|
+
* // ]
|
|
15
|
+
* ```
|
|
16
|
+
*
|
|
17
|
+
* @param fn - value producer
|
|
18
|
+
* @param cols - number of columns
|
|
19
|
+
* @param rows - number of rows
|
|
20
|
+
*/
|
|
21
|
+
export declare function repeatedly2d<T>(fn: FnU2<number, T>, cols: number, rows: number): Generator<T, void, unknown>;
|
|
22
|
+
//# sourceMappingURL=repeatedly2d.d.ts.map
|
package/repeatedly2d.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Syntax sugar for `map(fn, range2d(cols, rows))`. Returns iterator yielding
|
|
3
|
+
* values of given 2-arg function `fn` which is called repeatedly with `x` and
|
|
4
|
+
* `y` grid coordinates. The iteration order is always row-major.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```ts
|
|
8
|
+
* [...repeatedly2d((x, y) => [(x + 1) * 10, (y + 1) * 100], 2, 3)]
|
|
9
|
+
* // [
|
|
10
|
+
* // [ 10, 100 ], [ 20, 100 ],
|
|
11
|
+
* // [ 10, 200 ], [ 20, 200 ],
|
|
12
|
+
* // [ 10, 300 ], [ 20, 300 ]
|
|
13
|
+
* // ]
|
|
14
|
+
* ```
|
|
15
|
+
*
|
|
16
|
+
* @param fn - value producer
|
|
17
|
+
* @param cols - number of columns
|
|
18
|
+
* @param rows - number of rows
|
|
19
|
+
*/
|
|
20
|
+
export function* repeatedly2d(fn, cols, rows) {
|
|
21
|
+
for (let y = 0; y < rows; y++) {
|
|
22
|
+
for (let x = 0; x < cols; x++) {
|
|
23
|
+
yield fn(x, y);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { FnU3 } from "@thi.ng/api";
|
|
2
|
+
/**
|
|
3
|
+
* Syntax sugar for `map(fn, range3d(cols, rows, slices))`. Returns iterator yielding
|
|
4
|
+
* values of given 3-arg function `fn` which is called repeatedly with `x`, `y` and
|
|
5
|
+
* `z` grid coordinates. The iteration order is always slice major, then row-major.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* [...repeatedly3d((x, y, z) => [(x+1)*10, (y+1)*100, (z+1)*1000], 2, 2, 2)]
|
|
10
|
+
* // [
|
|
11
|
+
* // [ 10, 100, 1000 ], [ 20, 100, 1000 ], [ 10, 200, 1000 ], [ 20, 200, 1000 ],
|
|
12
|
+
* // [ 10, 100, 2000 ], [ 20, 100, 2000 ], [ 10, 200, 2000 ], [ 20, 200, 2000 ]
|
|
13
|
+
* // ]
|
|
14
|
+
* ```
|
|
15
|
+
*
|
|
16
|
+
* @param fn - value producer
|
|
17
|
+
* @param cols - number of columns
|
|
18
|
+
* @param rows - number of rows
|
|
19
|
+
* @param slices - number of slices
|
|
20
|
+
*/
|
|
21
|
+
export declare function repeatedly3d<T>(fn: FnU3<number, T>, cols: number, rows: number, slices: number): Generator<T, void, unknown>;
|
|
22
|
+
//# sourceMappingURL=repeatedly3d.d.ts.map
|
package/repeatedly3d.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Syntax sugar for `map(fn, range3d(cols, rows, slices))`. Returns iterator yielding
|
|
3
|
+
* values of given 3-arg function `fn` which is called repeatedly with `x`, `y` and
|
|
4
|
+
* `z` grid coordinates. The iteration order is always slice major, then row-major.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```ts
|
|
8
|
+
* [...repeatedly3d((x, y, z) => [(x+1)*10, (y+1)*100, (z+1)*1000], 2, 2, 2)]
|
|
9
|
+
* // [
|
|
10
|
+
* // [ 10, 100, 1000 ], [ 20, 100, 1000 ], [ 10, 200, 1000 ], [ 20, 200, 1000 ],
|
|
11
|
+
* // [ 10, 100, 2000 ], [ 20, 100, 2000 ], [ 10, 200, 2000 ], [ 20, 200, 2000 ]
|
|
12
|
+
* // ]
|
|
13
|
+
* ```
|
|
14
|
+
*
|
|
15
|
+
* @param fn - value producer
|
|
16
|
+
* @param cols - number of columns
|
|
17
|
+
* @param rows - number of rows
|
|
18
|
+
* @param slices - number of slices
|
|
19
|
+
*/
|
|
20
|
+
export function* repeatedly3d(fn, cols, rows, slices) {
|
|
21
|
+
for (let z = 0; z < slices; z++) {
|
|
22
|
+
for (let y = 0; y < rows; y++) {
|
|
23
|
+
for (let x = 0; x < cols; x++) {
|
|
24
|
+
yield fn(x, y, z);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|