rubico 2.6.1 → 2.6.3
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/README.md +14 -14
- package/_internal/areAllValuesNonfunctions.js +16 -4
- package/_internal/areAnyValuesPromises.js +16 -4
- package/_internal/arrayMapPool.js +1 -1
- package/_internal/arrayMapRate.js +85 -0
- package/_internal/functionArrayAll.js +2 -1
- package/_internal/functionObjectAll.js +2 -1
- package/all.js +103 -34
- package/assign.js +19 -3
- package/dist/Transducer.es.js +1 -1
- package/dist/Transducer.es.min.js +1 -1
- package/dist/Transducer.js +1 -1
- package/dist/Transducer.min.js +1 -1
- package/dist/Transducer.mjs +1 -1
- package/dist/__.es.js +1 -1
- package/dist/__.es.min.js +1 -1
- package/dist/__.js +1 -1
- package/dist/__.min.js +1 -1
- package/dist/__.mjs +1 -1
- package/dist/all.es.js +107 -8
- package/dist/all.es.min.js +2 -2
- package/dist/all.js +107 -8
- package/dist/all.min.js +2 -2
- package/dist/all.mjs +107 -8
- package/dist/always.es.js +1 -1
- package/dist/always.es.min.js +1 -1
- package/dist/always.js +1 -1
- package/dist/always.min.js +1 -1
- package/dist/always.mjs +1 -1
- package/dist/and.es.js +30 -9
- package/dist/and.es.min.js +2 -2
- package/dist/and.js +30 -9
- package/dist/and.min.js +2 -2
- package/dist/and.mjs +30 -9
- package/dist/assign.es.js +3 -2
- package/dist/assign.es.min.js +2 -2
- package/dist/assign.js +3 -2
- package/dist/assign.min.js +2 -2
- package/dist/assign.mjs +3 -2
- package/dist/compose.es.js +17 -5
- package/dist/compose.es.min.js +2 -2
- package/dist/compose.js +17 -5
- package/dist/compose.min.js +2 -2
- package/dist/compose.mjs +17 -5
- package/dist/curry.es.js +1 -1
- package/dist/curry.es.min.js +1 -1
- package/dist/curry.js +1 -1
- package/dist/curry.min.js +1 -1
- package/dist/curry.mjs +1 -1
- package/dist/eq.es.js +17 -5
- package/dist/eq.es.min.js +2 -2
- package/dist/eq.js +17 -5
- package/dist/eq.min.js +2 -2
- package/dist/eq.mjs +17 -5
- package/dist/every.es.js +1 -1
- package/dist/every.es.min.js +1 -1
- package/dist/every.js +1 -1
- package/dist/every.min.js +1 -1
- package/dist/every.mjs +1 -1
- package/dist/filter.es.js +1 -1
- package/dist/filter.es.min.js +1 -1
- package/dist/filter.js +1 -1
- package/dist/filter.min.js +1 -1
- package/dist/filter.mjs +1 -1
- package/dist/flatMap.es.js +1 -1
- package/dist/flatMap.es.min.js +1 -1
- package/dist/flatMap.js +1 -1
- package/dist/flatMap.min.js +1 -1
- package/dist/flatMap.mjs +1 -1
- package/dist/forEach.es.js +1 -1
- package/dist/forEach.es.min.js +1 -1
- package/dist/forEach.js +1 -1
- package/dist/forEach.min.js +1 -1
- package/dist/forEach.mjs +1 -1
- package/dist/get.es.js +1 -1
- package/dist/get.es.min.js +1 -1
- package/dist/get.js +1 -1
- package/dist/get.min.js +1 -1
- package/dist/get.mjs +1 -1
- package/dist/gt.es.js +17 -5
- package/dist/gt.es.min.js +2 -2
- package/dist/gt.js +17 -5
- package/dist/gt.min.js +2 -2
- package/dist/gt.mjs +17 -5
- package/dist/gte.es.js +17 -5
- package/dist/gte.es.min.js +2 -2
- package/dist/gte.js +17 -5
- package/dist/gte.min.js +2 -2
- package/dist/gte.mjs +17 -5
- package/dist/lt.es.js +17 -5
- package/dist/lt.es.min.js +2 -2
- package/dist/lt.js +17 -5
- package/dist/lt.min.js +2 -2
- package/dist/lt.mjs +17 -5
- package/dist/lte.es.js +17 -5
- package/dist/lte.es.min.js +2 -2
- package/dist/lte.js +17 -5
- package/dist/lte.min.js +2 -2
- package/dist/lte.mjs +17 -5
- package/dist/map.es.js +1 -1
- package/dist/map.es.min.js +1 -1
- package/dist/map.js +1 -1
- package/dist/map.min.js +1 -1
- package/dist/map.mjs +1 -1
- package/dist/not.es.js +17 -5
- package/dist/not.es.min.js +2 -2
- package/dist/not.js +17 -5
- package/dist/not.min.js +2 -2
- package/dist/not.mjs +17 -5
- package/dist/omit.es.js +1 -1
- package/dist/omit.es.min.js +1 -1
- package/dist/omit.js +1 -1
- package/dist/omit.min.js +1 -1
- package/dist/omit.mjs +1 -1
- package/dist/or.es.js +30 -9
- package/dist/or.es.min.js +2 -2
- package/dist/or.js +30 -9
- package/dist/or.min.js +2 -2
- package/dist/or.mjs +30 -9
- package/dist/pick.es.js +1 -1
- package/dist/pick.es.min.js +1 -1
- package/dist/pick.js +1 -1
- package/dist/pick.min.js +1 -1
- package/dist/pick.mjs +1 -1
- package/dist/pipe.es.js +17 -5
- package/dist/pipe.es.min.js +2 -2
- package/dist/pipe.js +17 -5
- package/dist/pipe.min.js +2 -2
- package/dist/pipe.mjs +17 -5
- package/dist/reduce.es.js +1 -1
- package/dist/reduce.es.min.js +1 -1
- package/dist/reduce.js +1 -1
- package/dist/reduce.min.js +1 -1
- package/dist/reduce.mjs +1 -1
- package/dist/rubico.es.js +107 -44
- package/dist/rubico.es.min.js +2 -2
- package/dist/rubico.global.js +107 -44
- package/dist/rubico.global.min.js +2 -2
- package/dist/rubico.js +107 -44
- package/dist/rubico.min.js +2 -2
- package/dist/rubico.mjs +107 -44
- package/dist/set.es.js +1 -1
- package/dist/set.es.min.js +1 -1
- package/dist/set.js +1 -1
- package/dist/set.min.js +1 -1
- package/dist/set.mjs +1 -1
- package/dist/some.es.js +1 -1
- package/dist/some.es.min.js +1 -1
- package/dist/some.js +1 -1
- package/dist/some.min.js +1 -1
- package/dist/some.mjs +1 -1
- package/dist/switchCase.es.js +30 -9
- package/dist/switchCase.es.min.js +2 -2
- package/dist/switchCase.js +30 -9
- package/dist/switchCase.min.js +2 -2
- package/dist/switchCase.mjs +30 -9
- package/dist/tap.es.js +17 -5
- package/dist/tap.es.min.js +2 -2
- package/dist/tap.js +17 -5
- package/dist/tap.min.js +2 -2
- package/dist/tap.mjs +17 -5
- package/dist/thunkify.es.js +17 -5
- package/dist/thunkify.es.min.js +2 -2
- package/dist/thunkify.js +17 -5
- package/dist/thunkify.min.js +2 -2
- package/dist/thunkify.mjs +17 -5
- package/dist/transform.es.js +1 -1
- package/dist/transform.es.min.js +1 -1
- package/dist/transform.js +1 -1
- package/dist/transform.min.js +1 -1
- package/dist/transform.mjs +1 -1
- package/dist/tryCatch.es.js +17 -5
- package/dist/tryCatch.es.min.js +2 -2
- package/dist/tryCatch.js +17 -5
- package/dist/tryCatch.min.js +2 -2
- package/dist/tryCatch.mjs +17 -5
- package/dist/x/append.es.js +1 -1
- package/dist/x/append.es.min.js +1 -1
- package/dist/x/append.js +1 -1
- package/dist/x/append.min.js +1 -1
- package/dist/x/append.mjs +1 -1
- package/dist/x/callProp.es.js +1 -1
- package/dist/x/callProp.es.min.js +1 -1
- package/dist/x/callProp.js +1 -1
- package/dist/x/callProp.min.js +1 -1
- package/dist/x/callProp.mjs +1 -1
- package/dist/x/defaultsDeep.es.js +1 -1
- package/dist/x/defaultsDeep.es.min.js +1 -1
- package/dist/x/defaultsDeep.js +1 -1
- package/dist/x/defaultsDeep.min.js +1 -1
- package/dist/x/defaultsDeep.mjs +1 -1
- package/dist/x/differenceWith.es.js +1 -1
- package/dist/x/differenceWith.es.min.js +1 -1
- package/dist/x/differenceWith.js +1 -1
- package/dist/x/differenceWith.min.js +1 -1
- package/dist/x/differenceWith.mjs +1 -1
- package/dist/x/filterOut.es.js +15 -5
- package/dist/x/filterOut.es.min.js +2 -2
- package/dist/x/filterOut.js +15 -5
- package/dist/x/filterOut.min.js +2 -2
- package/dist/x/filterOut.mjs +15 -5
- package/dist/x/find.es.js +1 -1
- package/dist/x/find.es.min.js +1 -1
- package/dist/x/find.js +1 -1
- package/dist/x/find.min.js +1 -1
- package/dist/x/find.mjs +1 -1
- package/dist/x/findIndex.es.js +1 -1
- package/dist/x/findIndex.es.min.js +1 -1
- package/dist/x/findIndex.js +1 -1
- package/dist/x/findIndex.min.js +1 -1
- package/dist/x/findIndex.mjs +1 -1
- package/dist/x/first.es.js +1 -1
- package/dist/x/first.es.min.js +1 -1
- package/dist/x/first.js +1 -1
- package/dist/x/first.min.js +1 -1
- package/dist/x/first.mjs +1 -1
- package/dist/x/flatten.es.js +1 -1
- package/dist/x/flatten.es.min.js +1 -1
- package/dist/x/flatten.js +1 -1
- package/dist/x/flatten.min.js +1 -1
- package/dist/x/flatten.mjs +1 -1
- package/dist/x/groupBy.es.js +1 -1
- package/dist/x/groupBy.es.min.js +1 -1
- package/dist/x/groupBy.js +1 -1
- package/dist/x/groupBy.min.js +1 -1
- package/dist/x/groupBy.mjs +1 -1
- package/dist/x/has.es.js +1 -1
- package/dist/x/has.es.min.js +1 -1
- package/dist/x/has.js +1 -1
- package/dist/x/has.min.js +1 -1
- package/dist/x/has.mjs +1 -1
- package/dist/x/identity.es.js +1 -1
- package/dist/x/identity.es.min.js +1 -1
- package/dist/x/identity.js +1 -1
- package/dist/x/identity.min.js +1 -1
- package/dist/x/identity.mjs +1 -1
- package/dist/x/includes.es.js +1 -1
- package/dist/x/includes.es.min.js +1 -1
- package/dist/x/includes.js +1 -1
- package/dist/x/includes.min.js +1 -1
- package/dist/x/includes.mjs +1 -1
- package/dist/x/isDeepEqual.es.js +1 -1
- package/dist/x/isDeepEqual.es.min.js +1 -1
- package/dist/x/isDeepEqual.js +1 -1
- package/dist/x/isDeepEqual.min.js +1 -1
- package/dist/x/isDeepEqual.mjs +1 -1
- package/dist/x/isEmpty.es.js +1 -1
- package/dist/x/isEmpty.es.min.js +1 -1
- package/dist/x/isEmpty.js +1 -1
- package/dist/x/isEmpty.min.js +1 -1
- package/dist/x/isEmpty.mjs +1 -1
- package/dist/x/isEqual.es.js +1 -1
- package/dist/x/isEqual.es.min.js +1 -1
- package/dist/x/isEqual.js +1 -1
- package/dist/x/isEqual.min.js +1 -1
- package/dist/x/isEqual.mjs +1 -1
- package/dist/x/isFunction.es.js +1 -1
- package/dist/x/isFunction.es.min.js +1 -1
- package/dist/x/isFunction.js +1 -1
- package/dist/x/isFunction.min.js +1 -1
- package/dist/x/isFunction.mjs +1 -1
- package/dist/x/isIn.es.js +1 -1
- package/dist/x/isIn.es.min.js +1 -1
- package/dist/x/isIn.js +1 -1
- package/dist/x/isIn.min.js +1 -1
- package/dist/x/isIn.mjs +1 -1
- package/dist/x/isObject.es.js +1 -1
- package/dist/x/isObject.es.min.js +1 -1
- package/dist/x/isObject.js +1 -1
- package/dist/x/isObject.min.js +1 -1
- package/dist/x/isObject.mjs +1 -1
- package/dist/x/isString.es.js +1 -1
- package/dist/x/isString.es.min.js +1 -1
- package/dist/x/isString.js +1 -1
- package/dist/x/isString.min.js +1 -1
- package/dist/x/isString.mjs +1 -1
- package/dist/x/keys.es.js +1 -1
- package/dist/x/keys.es.min.js +1 -1
- package/dist/x/keys.js +1 -1
- package/dist/x/keys.min.js +1 -1
- package/dist/x/keys.mjs +1 -1
- package/dist/x/last.es.js +1 -1
- package/dist/x/last.es.min.js +1 -1
- package/dist/x/last.js +1 -1
- package/dist/x/last.min.js +1 -1
- package/dist/x/last.mjs +1 -1
- package/dist/x/maxBy.es.js +1 -1
- package/dist/x/maxBy.es.min.js +1 -1
- package/dist/x/maxBy.js +1 -1
- package/dist/x/maxBy.min.js +1 -1
- package/dist/x/maxBy.mjs +1 -1
- package/dist/x/noop.es.js +1 -1
- package/dist/x/noop.es.min.js +1 -1
- package/dist/x/noop.js +1 -1
- package/dist/x/noop.min.js +1 -1
- package/dist/x/noop.mjs +1 -1
- package/dist/x/pluck.es.js +1 -1
- package/dist/x/pluck.es.min.js +1 -1
- package/dist/x/pluck.js +1 -1
- package/dist/x/pluck.min.js +1 -1
- package/dist/x/pluck.mjs +1 -1
- package/dist/x/prepend.es.js +1 -1
- package/dist/x/prepend.es.min.js +1 -1
- package/dist/x/prepend.js +1 -1
- package/dist/x/prepend.min.js +1 -1
- package/dist/x/prepend.mjs +1 -1
- package/dist/x/size.es.js +1 -1
- package/dist/x/size.es.min.js +1 -1
- package/dist/x/size.js +1 -1
- package/dist/x/size.min.js +1 -1
- package/dist/x/size.mjs +1 -1
- package/dist/x/trace.es.js +17 -5
- package/dist/x/trace.es.min.js +2 -2
- package/dist/x/trace.js +17 -5
- package/dist/x/trace.min.js +2 -2
- package/dist/x/trace.mjs +17 -5
- package/dist/x/unionWith.es.js +1 -1
- package/dist/x/unionWith.es.min.js +1 -1
- package/dist/x/unionWith.js +1 -1
- package/dist/x/unionWith.min.js +1 -1
- package/dist/x/unionWith.mjs +1 -1
- package/dist/x/uniq.es.js +1 -1
- package/dist/x/uniq.es.min.js +1 -1
- package/dist/x/uniq.js +1 -1
- package/dist/x/uniq.min.js +1 -1
- package/dist/x/uniq.mjs +1 -1
- package/dist/x/unless.es.js +1 -1
- package/dist/x/unless.es.min.js +1 -1
- package/dist/x/unless.js +1 -1
- package/dist/x/unless.min.js +1 -1
- package/dist/x/unless.mjs +1 -1
- package/dist/x/values.es.js +1 -1
- package/dist/x/values.es.min.js +1 -1
- package/dist/x/values.js +1 -1
- package/dist/x/values.min.js +1 -1
- package/dist/x/values.mjs +1 -1
- package/dist/x/when.es.js +1 -1
- package/dist/x/when.es.min.js +1 -1
- package/dist/x/when.js +1 -1
- package/dist/x/when.min.js +1 -1
- package/dist/x/when.mjs +1 -1
- package/es.js +107 -44
- package/index.js +107 -44
- package/map.js +44 -24
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|

|
|
3
3
|
> a shallow river in northeastern Italy, just south of Ravenna
|
|
4
4
|
|
|
5
|
-

|
|
6
6
|
[](https://codecov.io/gh/a-synchronous/rubico)
|
|
7
7
|
[](https://www.npmjs.com/package/rubico)
|
|
8
8
|
[](https://opensource.org/licenses/MIT)
|
|
@@ -26,7 +26,7 @@ pipe(numbers, [
|
|
|
26
26
|
```
|
|
27
27
|
|
|
28
28
|
# Installation
|
|
29
|
-
[Core build](https://unpkg.com/rubico/index.js) ([~
|
|
29
|
+
[Core build](https://unpkg.com/rubico/index.js) ([~9.8 kB minified and gzipped](https://unpkg.com/rubico/dist/rubico.min.js))
|
|
30
30
|
|
|
31
31
|
with `npm`
|
|
32
32
|
```bash
|
|
@@ -86,15 +86,12 @@ When you import this library, you obtain the freedom that comes from having thos
|
|
|
86
86
|
|
|
87
87
|
# Introduction
|
|
88
88
|
|
|
89
|
-
rubico is a library for async-enabled functional programming in JavaScript. The library
|
|
89
|
+
rubico is a library for async-enabled functional programming in JavaScript. The library supports a simple and composable functional style in asynchronous environments.
|
|
90
90
|
|
|
91
91
|
```javascript
|
|
92
92
|
const {
|
|
93
93
|
// compose functions
|
|
94
|
-
pipe, compose,
|
|
95
|
-
|
|
96
|
-
// handle effects
|
|
97
|
-
tap, forEach,
|
|
94
|
+
pipe, compose, tap,
|
|
98
95
|
|
|
99
96
|
// control flow
|
|
100
97
|
switchCase,
|
|
@@ -102,9 +99,12 @@ const {
|
|
|
102
99
|
// handle errors
|
|
103
100
|
tryCatch,
|
|
104
101
|
|
|
105
|
-
//
|
|
102
|
+
// compose data
|
|
106
103
|
all, assign, get, set, pick, omit,
|
|
107
104
|
|
|
105
|
+
// iterate
|
|
106
|
+
forEach,
|
|
107
|
+
|
|
108
108
|
// transform data
|
|
109
109
|
map, filter, reduce, transform, flatMap,
|
|
110
110
|
|
|
@@ -119,7 +119,7 @@ const {
|
|
|
119
119
|
} = rubico
|
|
120
120
|
```
|
|
121
121
|
|
|
122
|
-
With async-enabled, or [a]synchronous, functional programming, functions provided to the rubico
|
|
122
|
+
With async-enabled, or [a]synchronous, functional programming, functions provided to the rubico operators may be asynchronous and return a Promise. Any promises in argument position are also resolved before continuing with the operation.
|
|
123
123
|
|
|
124
124
|
```javascript [playground]
|
|
125
125
|
const helloPromise = Promise.resolve('hello')
|
|
@@ -133,7 +133,7 @@ pipe(helloPromise, [ // helloPromise is resolved for 'hello'
|
|
|
133
133
|
])
|
|
134
134
|
```
|
|
135
135
|
|
|
136
|
-
|
|
136
|
+
All rubico operators support both an eager and a lazy API. The eager API takes all required arguments and executes at once, while its lazy API takes only the non-data arguments and executes lazily, returning a function that expects the data arguments. This dual API supports a natural and composable code style.
|
|
137
137
|
|
|
138
138
|
```javascript [playground]
|
|
139
139
|
const myObj = { a: 1, b: 2, c: 3 }
|
|
@@ -150,7 +150,7 @@ console.log(myDuplicatedSquaredObject)
|
|
|
150
150
|
// { a: [1, 1], b: [4, 4], c: [9, 9] }
|
|
151
151
|
```
|
|
152
152
|
|
|
153
|
-
The rubico
|
|
153
|
+
The rubico operators are versatile and act on a wide range of vanilla JavaScript types to create declarative, extensible, and async-enabled function compositions. The same operator `map` can act on an array and also a `Map` data structure.
|
|
154
154
|
|
|
155
155
|
```javascript [playground]
|
|
156
156
|
const { pipe, tap, map, filter } = rubico
|
|
@@ -203,7 +203,7 @@ pipe(todoIDs, [
|
|
|
203
203
|
])
|
|
204
204
|
```
|
|
205
205
|
|
|
206
|
-
rubico offers transducers in its `Transducer` module. You can consume these transducers with the `transform` and `compose`
|
|
206
|
+
rubico offers transducers in its `Transducer` module. You can consume these transducers with the `transform` and `compose` operators. You should use `compose` over `pipe` to chain a left-to-right composition of transducers.
|
|
207
207
|
|
|
208
208
|
```javascript [playground]
|
|
209
209
|
const isOdd = number => number % 2 == 1
|
|
@@ -227,12 +227,12 @@ pipe(generateNumbers(), [
|
|
|
227
227
|
])
|
|
228
228
|
```
|
|
229
229
|
|
|
230
|
-
For advanced asynchronous use cases, some of the
|
|
230
|
+
For advanced asynchronous use cases, some of the operators have property functions that have different asynchronous behavior, e.g.
|
|
231
231
|
* `map` - apply a mapper function concurrently
|
|
232
232
|
* `map.pool` - apply a mapper function concurrently with a concurrency limit
|
|
233
233
|
* `map.series` - apply a mapper function serially
|
|
234
234
|
|
|
235
|
-
For more functions beyond the core
|
|
235
|
+
For more functions beyond the core operators, please visit `rubico/x`. You can find the full documentation at [rubico.land/docs](https://rubico.land/docs).
|
|
236
236
|
|
|
237
237
|
# Benchmarks
|
|
238
238
|
Please find the published benchmark output inside the [benchmark-output](https://github.com/a-synchronous/rubico/tree/master/benchmark-output) folder. You can run the benchmarks on your own system with the following command:
|
|
@@ -1,16 +1,28 @@
|
|
|
1
|
+
const isArray = require('./isArray')
|
|
2
|
+
|
|
1
3
|
/**
|
|
2
4
|
* @name areAllValuesNonfunctions
|
|
3
5
|
*
|
|
4
6
|
* @synopsis
|
|
5
7
|
* ```coffeescript [specscript]
|
|
6
8
|
* areAllValuesNonfunctions(values Array<function|value>) -> boolean
|
|
9
|
+
* areAllValuesNonfunctions(values Object<function|value>) -> boolean
|
|
7
10
|
* ```
|
|
8
11
|
*/
|
|
9
12
|
const areAllValuesNonfunctions = function (values) {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
13
|
+
if (isArray(values)) {
|
|
14
|
+
const length = values.length
|
|
15
|
+
let index = -1
|
|
16
|
+
while (++index < length) {
|
|
17
|
+
if (typeof values[index] == 'function') {
|
|
18
|
+
return false
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return true
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
for (const key in values) {
|
|
25
|
+
if (typeof values[key] == 'function') {
|
|
14
26
|
return false
|
|
15
27
|
}
|
|
16
28
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
const isArray = require('./isArray')
|
|
1
2
|
const isPromise = require('./isPromise')
|
|
2
3
|
|
|
3
4
|
/**
|
|
@@ -6,13 +7,24 @@ const isPromise = require('./isPromise')
|
|
|
6
7
|
* @synopsis
|
|
7
8
|
* ```coffeescript [specscript]
|
|
8
9
|
* areAnyValuesPromises(values Array) -> boolean
|
|
10
|
+
* areAnyValuesPromises(values Object) -> boolean
|
|
9
11
|
* ```
|
|
10
12
|
*/
|
|
11
13
|
const areAnyValuesPromises = function (values) {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
if (isArray(values)) {
|
|
15
|
+
const length = values.length
|
|
16
|
+
let index = -1
|
|
17
|
+
while (++index < length) {
|
|
18
|
+
const value = values[index]
|
|
19
|
+
if (isPromise(value)) {
|
|
20
|
+
return true
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return false
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
for (const key in values) {
|
|
27
|
+
const value = values[key]
|
|
16
28
|
if (isPromise(value)) {
|
|
17
29
|
return true
|
|
18
30
|
}
|
|
@@ -48,7 +48,7 @@ const arrayMapPoolAsync = async function (
|
|
|
48
48
|
*
|
|
49
49
|
* @synopsis
|
|
50
50
|
* ```coffeescript [specscript]
|
|
51
|
-
* arrayMapPool(array Array, concurrency number, f function) -> Promise|
|
|
51
|
+
* arrayMapPool(array Array, concurrency number, f function) -> Promise|array
|
|
52
52
|
* ```
|
|
53
53
|
*
|
|
54
54
|
* @description
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
const curry3 = require('./curry3')
|
|
2
|
+
const __ = require('./placeholder')
|
|
3
|
+
const isPromise = require('./isPromise')
|
|
4
|
+
const promiseAll = require('./promiseAll')
|
|
5
|
+
const sleep = require('./sleep')
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @name arrayMapRate
|
|
9
|
+
*
|
|
10
|
+
* @synopsis
|
|
11
|
+
* ```coffeescript [specscript]
|
|
12
|
+
* arrayMapRate(
|
|
13
|
+
* array Array,
|
|
14
|
+
* rate number,
|
|
15
|
+
* f function,
|
|
16
|
+
* ) -> Promise<Array>
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
const arrayMapRate = async function (array, rate, f) {
|
|
20
|
+
const length = array.length
|
|
21
|
+
const result = Array(length)
|
|
22
|
+
const minPeriodMs = 1 / rate * 1000
|
|
23
|
+
let index = -1
|
|
24
|
+
let lastExecutionTime = 0
|
|
25
|
+
const totalStart = performance.now()
|
|
26
|
+
while (++index < length) {
|
|
27
|
+
if (index > 0 && lastExecutionTime < minPeriodMs) {
|
|
28
|
+
await sleep(minPeriodMs - lastExecutionTime)
|
|
29
|
+
}
|
|
30
|
+
const start = performance.now()
|
|
31
|
+
let resultItem = f(array[index], index, array)
|
|
32
|
+
if (isPromise(resultItem)) {
|
|
33
|
+
resultItem = await resultItem
|
|
34
|
+
}
|
|
35
|
+
const end = performance.now()
|
|
36
|
+
const executionTime = end - start
|
|
37
|
+
lastExecutionTime = executionTime
|
|
38
|
+
result[index] = resultItem
|
|
39
|
+
}
|
|
40
|
+
const totalEnd = performance.now()
|
|
41
|
+
return result
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* @name range
|
|
46
|
+
*
|
|
47
|
+
* @synopsis
|
|
48
|
+
* ```coffeescript [specscript]
|
|
49
|
+
* range(lower number, upper number) -> numbers Array<number>
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
const range = function (lower, upper) {
|
|
53
|
+
const result = []
|
|
54
|
+
let start = lower
|
|
55
|
+
while (start <= upper) {
|
|
56
|
+
result.push(start)
|
|
57
|
+
start += 1
|
|
58
|
+
}
|
|
59
|
+
return result
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/*
|
|
63
|
+
const start = performance.now()
|
|
64
|
+
arrayMapRate(
|
|
65
|
+
range(0, 10),
|
|
66
|
+
2,
|
|
67
|
+
async n => {
|
|
68
|
+
const duration = Math.random() * 1000
|
|
69
|
+
console.log('duration', duration)
|
|
70
|
+
// const duration = 500
|
|
71
|
+
await sleep(duration)
|
|
72
|
+
return n ** 2
|
|
73
|
+
}
|
|
74
|
+
async n => {
|
|
75
|
+
console.log('n', n)
|
|
76
|
+
return n ** 2
|
|
77
|
+
},
|
|
78
|
+
).then(result => {
|
|
79
|
+
const end = performance.now()
|
|
80
|
+
console.log('average period:', (end - start) / result.length)
|
|
81
|
+
console.log(result)
|
|
82
|
+
})
|
|
83
|
+
*/
|
|
84
|
+
|
|
85
|
+
module.exports = arrayMapRate
|
|
@@ -14,7 +14,8 @@ const functionArrayAll = function (funcs, args) {
|
|
|
14
14
|
result = Array(funcsLength)
|
|
15
15
|
let funcsIndex = -1, isAsync = false
|
|
16
16
|
while (++funcsIndex < funcsLength) {
|
|
17
|
-
const
|
|
17
|
+
const f = funcs[funcsIndex]
|
|
18
|
+
const resultItem = typeof f == 'function' ? f(...args) : f
|
|
18
19
|
if (isPromise(resultItem)) {
|
|
19
20
|
isAsync = true
|
|
20
21
|
}
|
|
@@ -19,7 +19,8 @@ const objectSet = require('./objectSet')
|
|
|
19
19
|
const functionObjectAll = function (funcs, args) {
|
|
20
20
|
const result = {}, promises = []
|
|
21
21
|
for (const key in funcs) {
|
|
22
|
-
const
|
|
22
|
+
const f = funcs[key]
|
|
23
|
+
const resultItem = typeof f == 'function' ? f(...args) : f
|
|
23
24
|
if (isPromise(resultItem)) {
|
|
24
25
|
promises.push(resultItem.then(curry3(objectSet, result, key, __)))
|
|
25
26
|
} else {
|
package/all.js
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
const isPromise = require('./_internal/isPromise')
|
|
1
2
|
const areAnyValuesPromises = require('./_internal/areAnyValuesPromises')
|
|
3
|
+
const areAllValuesNonfunctions = require('./_internal/areAllValuesNonfunctions')
|
|
2
4
|
const promiseAll = require('./_internal/promiseAll')
|
|
5
|
+
const promiseObjectAll = require('./_internal/promiseObjectAll')
|
|
3
6
|
const isArray = require('./_internal/isArray')
|
|
4
7
|
const __ = require('./_internal/placeholder')
|
|
5
8
|
const curry2 = require('./_internal/curry2')
|
|
@@ -9,21 +12,54 @@ const functionArrayAllSeries = require('./_internal/functionArrayAllSeries')
|
|
|
9
12
|
const functionObjectAll = require('./_internal/functionObjectAll')
|
|
10
13
|
|
|
11
14
|
/**
|
|
12
|
-
* @name
|
|
15
|
+
* @name _allValues
|
|
13
16
|
*
|
|
14
17
|
* @synopsis
|
|
15
18
|
* ```coffeescript [specscript]
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
* _allValues(values Array<Promise|any>) -> Promise<Array>
|
|
20
|
+
* _allValues(values Object<Promise|any>) -> Promise<Object>
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
const _allValues = function (values) {
|
|
24
|
+
if (isArray(values)) {
|
|
25
|
+
return areAnyValuesPromises(values)
|
|
26
|
+
? promiseAll(values)
|
|
27
|
+
: values
|
|
28
|
+
}
|
|
29
|
+
return areAnyValuesPromises(values)
|
|
30
|
+
? promiseObjectAll(values)
|
|
31
|
+
: values
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* @name all
|
|
21
36
|
*
|
|
22
|
-
*
|
|
37
|
+
* @synopsis
|
|
38
|
+
* ```coffeescript [specscript]
|
|
39
|
+
* all(values Promise|Array<Promise|any>) -> result Promise|Array
|
|
40
|
+
* all(values Promise|Object<Promise|any>) -> result Promise|Object
|
|
41
|
+
*
|
|
42
|
+
* all(
|
|
43
|
+
* ...args,
|
|
44
|
+
* resolversOrValues Array<function|Promise|any>
|
|
45
|
+
* ) -> result Promise|Array
|
|
46
|
+
*
|
|
47
|
+
* all(
|
|
48
|
+
* resolversOrValues Array<function|Promise|any>
|
|
49
|
+
* )(...args) -> result Promise|Array
|
|
50
|
+
*
|
|
51
|
+
* all(
|
|
52
|
+
* ...args,
|
|
53
|
+
* resolversOrValues Object<function|Promise|any>
|
|
54
|
+
* ) -> result Promise|Object
|
|
55
|
+
*
|
|
56
|
+
* all(
|
|
57
|
+
* resolversOrValues Object<function|Promise|any>
|
|
58
|
+
* )(...args) -> result Promise|Object
|
|
23
59
|
* ```
|
|
24
60
|
*
|
|
25
61
|
* @description
|
|
26
|
-
*
|
|
62
|
+
* Calls an array or object of resolver functions or values `resolversOrValues` with provided arguments.
|
|
27
63
|
*
|
|
28
64
|
* ```javascript [playground]
|
|
29
65
|
* const createArrayOfGreetingsFor = all([
|
|
@@ -32,24 +68,29 @@ const functionObjectAll = require('./_internal/functionObjectAll')
|
|
|
32
68
|
* name => `Hello ${name}`,
|
|
33
69
|
* ])
|
|
34
70
|
*
|
|
35
|
-
* const
|
|
71
|
+
* const arrayOfGreetingsFor1 = createArrayOfGreetingsFor('1')
|
|
36
72
|
*
|
|
37
|
-
* console.log(
|
|
38
|
-
* // ['Hi
|
|
39
|
-
*
|
|
40
|
-
* const createObjectOfGreetingsFor = all({
|
|
41
|
-
* hi: name => `Hi ${name}`,
|
|
42
|
-
* hey: name => `Hey ${name}`,
|
|
43
|
-
* hello: name => `Hello ${name}`,
|
|
44
|
-
* })
|
|
73
|
+
* console.log(arrayOfGreetingsFor1)
|
|
74
|
+
* // ['Hi 1', 'Hey 1', 'Hello 1']
|
|
75
|
+
* ```
|
|
45
76
|
*
|
|
46
|
-
*
|
|
77
|
+
* If provided only values for `resolversOrValues`, returns an array or object with the same shape as `resolversOrValues` with any Promises resolved.
|
|
47
78
|
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
79
|
+
* ```javascript [playground]
|
|
80
|
+
* all([
|
|
81
|
+
* Promise.resolve(1),
|
|
82
|
+
* Promise.resolve(2),
|
|
83
|
+
* 3,
|
|
84
|
+
* ]).then(console.log) // [1, 2, 3]
|
|
85
|
+
*
|
|
86
|
+
* all({
|
|
87
|
+
* a: Promise.resolve(1),
|
|
88
|
+
* b: Promise.resolve(2),
|
|
89
|
+
* c: 3,
|
|
90
|
+
* }).then(console.log) // { a: 1, b: 2, c: 3 }
|
|
50
91
|
* ```
|
|
51
92
|
*
|
|
52
|
-
* `all` can
|
|
93
|
+
* `all` can be used in a pipeline to compose and manpulate data.
|
|
53
94
|
*
|
|
54
95
|
* ```javascript [playground]
|
|
55
96
|
* const identity = value => value
|
|
@@ -72,6 +113,24 @@ const functionObjectAll = require('./_internal/functionObjectAll')
|
|
|
72
113
|
* getAndLogUserById('1') // Got user {"_id":1,"name":"George"} by id 1
|
|
73
114
|
* ```
|
|
74
115
|
*
|
|
116
|
+
* Values may be provided along with functions, in which case they are set on the result object or array directly. If any of these values are promises, they are resolved for their values before being set on the result object or array.
|
|
117
|
+
*
|
|
118
|
+
* ```javascript [playground]
|
|
119
|
+
* all({}, {
|
|
120
|
+
* a: Promise.resolve(1),
|
|
121
|
+
* b: 2,
|
|
122
|
+
* c: () => 3,
|
|
123
|
+
* d: async () => 4,
|
|
124
|
+
* }).then(console.log) // { a: 1, b: 2, c: 3, d: 4 }
|
|
125
|
+
*
|
|
126
|
+
* all([], [
|
|
127
|
+
* Promise.resolve(1),
|
|
128
|
+
* 2,
|
|
129
|
+
* () => 3,
|
|
130
|
+
* async () => 4,
|
|
131
|
+
* ]).then(console.log) // [1, 2, 3, 4]
|
|
132
|
+
* ```
|
|
133
|
+
*
|
|
75
134
|
* Any promises passed in argument position are resolved for their values before further execution. This only applies to the eager version of the API.
|
|
76
135
|
*
|
|
77
136
|
* ```javascript [playground]
|
|
@@ -84,24 +143,34 @@ const functionObjectAll = require('./_internal/functionObjectAll')
|
|
|
84
143
|
*
|
|
85
144
|
* @execution concurrent
|
|
86
145
|
*/
|
|
87
|
-
|
|
88
146
|
const all = function (...args) {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
147
|
+
if (args.length == 1) {
|
|
148
|
+
const resolversOrValues = args[0]
|
|
149
|
+
if (isPromise(resolversOrValues)) {
|
|
150
|
+
return resolversOrValues.then(_allValues)
|
|
151
|
+
}
|
|
152
|
+
if (areAllValuesNonfunctions(resolversOrValues)) {
|
|
153
|
+
return _allValues(resolversOrValues)
|
|
154
|
+
}
|
|
155
|
+
return isArray(resolversOrValues)
|
|
156
|
+
? curryArgs2(functionArrayAll, resolversOrValues, __)
|
|
157
|
+
: curryArgs2(functionObjectAll, resolversOrValues, __)
|
|
94
158
|
}
|
|
95
159
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
160
|
+
const resolversOrValues = args[args.length - 1]
|
|
161
|
+
const argValues = args.slice(0, -1)
|
|
162
|
+
|
|
163
|
+
if (areAnyValuesPromises(argValues)) {
|
|
164
|
+
return isArray(resolversOrValues)
|
|
165
|
+
? promiseAll(argValues)
|
|
166
|
+
.then(curry2(functionArrayAll, resolversOrValues, __))
|
|
167
|
+
: promiseAll(argValues)
|
|
168
|
+
.then(curry2(functionObjectAll, resolversOrValues, __))
|
|
100
169
|
}
|
|
101
170
|
|
|
102
|
-
return isArray(
|
|
103
|
-
? functionArrayAll(
|
|
104
|
-
: functionObjectAll(
|
|
171
|
+
return isArray(resolversOrValues)
|
|
172
|
+
? functionArrayAll(resolversOrValues, argValues)
|
|
173
|
+
: functionObjectAll(resolversOrValues, argValues)
|
|
105
174
|
}
|
|
106
175
|
|
|
107
176
|
/**
|
package/assign.js
CHANGED
|
@@ -18,13 +18,18 @@ const _assign = function (object, funcs) {
|
|
|
18
18
|
*
|
|
19
19
|
* @synopsis
|
|
20
20
|
* ```coffeescript [specscript]
|
|
21
|
-
* assign(
|
|
21
|
+
* assign(
|
|
22
|
+
* o Promise|Object,
|
|
23
|
+
* resolversOrValues Object<function|Promise|any>
|
|
24
|
+
* ) -> result Promise|Object
|
|
22
25
|
*
|
|
23
|
-
* assign(
|
|
26
|
+
* assign(
|
|
27
|
+
* resolversOrValues Object<function|Promise|any>
|
|
28
|
+
* )(o Object) -> result Promise|Object
|
|
24
29
|
* ```
|
|
25
30
|
*
|
|
26
31
|
* @description
|
|
27
|
-
* Function executor and composer. Accepts an object of resolver functions and an
|
|
32
|
+
* Function executor and composer. Accepts an object of resolver functions or values and an object `o`. Creates a result object from the argument object, evaluates each resolver with the argument object, and assigns to the result object the evaluations at the corresponding resolver keys.
|
|
28
33
|
*
|
|
29
34
|
* ```javascript [playground]
|
|
30
35
|
* const assignSquaredAndCubed = assign({
|
|
@@ -55,6 +60,17 @@ const _assign = function (object, funcs) {
|
|
|
55
60
|
* // { numbers: [1, 2, 3, 4, 5], total: 15 }
|
|
56
61
|
* ```
|
|
57
62
|
*
|
|
63
|
+
* Values passed in resolver position are set on the result object directly. If any of these values are promises, they are resolved for their values before being set on the result object.
|
|
64
|
+
*
|
|
65
|
+
* ```javascript [playground]
|
|
66
|
+
* assign({}, {
|
|
67
|
+
* a: 1,
|
|
68
|
+
* b: Promise.resolve(2),
|
|
69
|
+
* c: () => 3,
|
|
70
|
+
* d: async o => Object.keys(o).length,
|
|
71
|
+
* }).then(console.log) // { a: 1, b: 2, c: 3, d: 0 }
|
|
72
|
+
* ```
|
|
73
|
+
*
|
|
58
74
|
* Any promises passed in argument position are resolved for their values before further execution. This only applies to the eager version of the API.
|
|
59
75
|
*
|
|
60
76
|
* ```javascript [playground]
|
package/dist/Transducer.es.js
CHANGED
package/dist/Transducer.js
CHANGED
package/dist/Transducer.min.js
CHANGED
package/dist/Transducer.mjs
CHANGED
package/dist/__.es.js
CHANGED
package/dist/__.es.min.js
CHANGED
package/dist/__.js
CHANGED
package/dist/__.min.js
CHANGED
package/dist/__.mjs
CHANGED