rubico 2.8.6 → 2.10.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/README.md +1 -1
- package/_internal/FlatMappingAsyncIterator.js +41 -30
- package/_internal/LinkedList.js +54 -0
- package/_internal/LinkedList.test.js +34 -0
- package/_internal/MappingAsyncIterator.js +65 -15
- package/_internal/SerialMappingAsyncIterator.js +79 -0
- package/_internal/iteratorFind.js +0 -2
- package/_internal/iteratorForEachSeries.js +1 -1
- package/_internal/objectFlatten.js +4 -1
- package/all.js +7 -8
- package/and.js +1 -1
- package/assign.js +1 -1
- package/compose.js +1 -1
- package/curry.js +1 -1
- 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 +1 -1
- package/dist/all.es.min.js +1 -1
- package/dist/all.js +1 -1
- package/dist/all.min.js +1 -1
- package/dist/all.mjs +1 -1
- 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 +1 -1
- package/dist/and.es.min.js +1 -1
- package/dist/and.js +1 -1
- package/dist/and.min.js +1 -1
- package/dist/and.mjs +1 -1
- package/dist/assign.es.js +1 -1
- package/dist/assign.es.min.js +1 -1
- package/dist/assign.js +1 -1
- package/dist/assign.min.js +1 -1
- package/dist/assign.mjs +1 -1
- package/dist/compose.es.js +1 -1
- package/dist/compose.es.min.js +1 -1
- package/dist/compose.js +1 -1
- package/dist/compose.min.js +1 -1
- package/dist/compose.mjs +1 -1
- 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 +1 -1
- package/dist/eq.es.min.js +1 -1
- package/dist/eq.js +1 -1
- package/dist/eq.min.js +1 -1
- package/dist/eq.mjs +1 -1
- 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 +4 -4
- package/dist/filter.es.min.js +2 -2
- package/dist/filter.js +4 -4
- package/dist/filter.min.js +2 -2
- package/dist/filter.mjs +4 -4
- package/dist/flatMap.es.js +44 -28
- package/dist/flatMap.es.min.js +2 -2
- package/dist/flatMap.js +44 -28
- package/dist/flatMap.min.js +2 -2
- package/dist/flatMap.mjs +44 -28
- package/dist/forEach.es.js +6 -6
- package/dist/forEach.es.min.js +2 -2
- package/dist/forEach.js +6 -6
- package/dist/forEach.min.js +2 -2
- package/dist/forEach.mjs +6 -6
- 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 +1 -1
- package/dist/gt.es.min.js +1 -1
- package/dist/gt.js +1 -1
- package/dist/gt.min.js +1 -1
- package/dist/gt.mjs +1 -1
- package/dist/gte.es.js +1 -1
- package/dist/gte.es.min.js +1 -1
- package/dist/gte.js +1 -1
- package/dist/gte.min.js +1 -1
- package/dist/gte.mjs +1 -1
- package/dist/lt.es.js +1 -1
- package/dist/lt.es.min.js +1 -1
- package/dist/lt.js +1 -1
- package/dist/lt.min.js +1 -1
- package/dist/lt.mjs +1 -1
- package/dist/lte.es.js +1 -1
- package/dist/lte.es.min.js +1 -1
- package/dist/lte.js +1 -1
- package/dist/lte.min.js +1 -1
- package/dist/lte.mjs +1 -1
- package/dist/map.es.js +187 -39
- package/dist/map.es.min.js +2 -2
- package/dist/map.js +187 -39
- package/dist/map.min.js +2 -2
- package/dist/map.mjs +187 -39
- package/dist/not.es.js +1 -1
- package/dist/not.es.min.js +1 -1
- package/dist/not.js +1 -1
- package/dist/not.min.js +1 -1
- package/dist/not.mjs +1 -1
- 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 +1 -1
- package/dist/or.es.min.js +1 -1
- package/dist/or.js +1 -1
- package/dist/or.min.js +1 -1
- package/dist/or.mjs +1 -1
- 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 +1 -1
- package/dist/pipe.es.min.js +1 -1
- package/dist/pipe.js +1 -1
- package/dist/pipe.min.js +1 -1
- package/dist/pipe.mjs +1 -1
- 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 +233 -78
- package/dist/rubico.es.min.js +2 -2
- package/dist/rubico.global.js +233 -78
- package/dist/rubico.global.min.js +2 -2
- package/dist/rubico.js +233 -78
- package/dist/rubico.min.js +2 -2
- package/dist/rubico.mjs +233 -78
- 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 +1 -1
- package/dist/switchCase.es.min.js +1 -1
- package/dist/switchCase.js +1 -1
- package/dist/switchCase.min.js +1 -1
- package/dist/switchCase.mjs +1 -1
- package/dist/tap.es.js +1 -1
- package/dist/tap.es.min.js +1 -1
- package/dist/tap.js +1 -1
- package/dist/tap.min.js +1 -1
- package/dist/tap.mjs +1 -1
- package/dist/thunkify.es.js +1 -1
- package/dist/thunkify.es.min.js +1 -1
- package/dist/thunkify.js +1 -1
- package/dist/thunkify.min.js +1 -1
- package/dist/thunkify.mjs +1 -1
- 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 +1 -1
- package/dist/tryCatch.es.min.js +1 -1
- package/dist/tryCatch.js +1 -1
- package/dist/tryCatch.min.js +1 -1
- package/dist/tryCatch.mjs +1 -1
- 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 +4 -4
- package/dist/x/filterOut.es.min.js +2 -2
- package/dist/x/filterOut.js +4 -4
- package/dist/x/filterOut.min.js +2 -2
- package/dist/x/filterOut.mjs +4 -4
- package/dist/x/find.es.js +1 -3
- package/dist/x/find.es.min.js +1 -1
- package/dist/x/find.js +1 -3
- package/dist/x/find.min.js +1 -1
- package/dist/x/find.mjs +1 -3
- 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 +44 -28
- package/dist/x/flatten.es.min.js +2 -2
- package/dist/x/flatten.js +44 -28
- package/dist/x/flatten.min.js +2 -2
- package/dist/x/flatten.mjs +44 -28
- 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 +187 -39
- package/dist/x/pluck.es.min.js +2 -2
- package/dist/x/pluck.js +187 -39
- package/dist/x/pluck.min.js +2 -2
- package/dist/x/pluck.mjs +187 -39
- 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 +1 -1
- package/dist/x/trace.es.min.js +1 -1
- package/dist/x/trace.js +1 -1
- package/dist/x/trace.min.js +1 -1
- package/dist/x/trace.mjs +1 -1
- 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/eq.js +2 -2
- package/es.js +233 -78
- package/every.js +2 -2
- package/filter.js +4 -4
- package/flatMap.js +61 -54
- package/forEach.js +33 -56
- package/get.js +5 -3
- package/gt.js +2 -2
- package/gte.js +2 -2
- package/index.js +233 -78
- package/lt.js +2 -2
- package/lte.js +2 -2
- package/map.js +115 -151
- package/monad/README.md +1 -1
- package/not.js +1 -1
- package/omit.js +22 -19
- package/or.js +1 -1
- package/package.json +1 -1
- package/pick.js +14 -11
- package/pipe.js +1 -1
- package/reduce.js +1 -1
- package/set.js +17 -18
- package/some.js +2 -2
- package/switchCase.js +12 -4
- package/tap.js +6 -4
- package/transform.js +1 -1
- package/tryCatch.js +1 -1
- package/x/defaultsDeep.js +1 -1
- package/x/defaultsDeep.test.js +1 -1
- package/_internal/NextIteration.js +0 -12
- package/_internal/generatorFunctionFilter.js +0 -28
- package/_internal/iterationMap.js +0 -27
package/README.md
CHANGED
|
@@ -137,7 +137,7 @@ pipe(helloPromise, [ // helloPromise is resolved for 'hello'
|
|
|
137
137
|
])
|
|
138
138
|
```
|
|
139
139
|
|
|
140
|
-
All Rubico operators support both eager and lazy
|
|
140
|
+
All Rubico operators support both eager and lazy interfaces. The eager interface takes all required arguments and executes at once, while the lazy interface takes only the setup arguments and returns a function that only expects the data arguments. This dual interface supports a natural and composable code style.
|
|
141
141
|
|
|
142
142
|
```javascript [playground]
|
|
143
143
|
const myObj = { a: 1, b: 2, c: 3 }
|
|
@@ -22,8 +22,11 @@ const sleep = require('./sleep')
|
|
|
22
22
|
* @muxing
|
|
23
23
|
*/
|
|
24
24
|
const FlatMappingAsyncIterator = function (asyncIterator, flatMapper) {
|
|
25
|
-
const buffer = []
|
|
26
|
-
|
|
25
|
+
const buffer = []
|
|
26
|
+
const promises = new Set()
|
|
27
|
+
|
|
28
|
+
let consumingAsyncIterator = false
|
|
29
|
+
let isAsyncIteratorDone = false
|
|
27
30
|
|
|
28
31
|
return {
|
|
29
32
|
isAsyncIteratorDone: false,
|
|
@@ -34,47 +37,55 @@ const FlatMappingAsyncIterator = function (asyncIterator, flatMapper) {
|
|
|
34
37
|
return '[object FlatMappingAsyncIterator]'
|
|
35
38
|
},
|
|
36
39
|
|
|
40
|
+
// _consumeAsyncIterator() -> Promise<>
|
|
41
|
+
async _consumeAsyncIterator() {
|
|
42
|
+
for await (const item of asyncIterator) {
|
|
43
|
+
const monad = flatMapper(item)
|
|
44
|
+
if (isPromise(monad)) {
|
|
45
|
+
const bufferLoading =
|
|
46
|
+
monad.then(curry3(genericReduce, __, arrayPush, buffer))
|
|
47
|
+
const promise = bufferLoading.then(() => promises.delete(promise))
|
|
48
|
+
promises.add(promise)
|
|
49
|
+
} else {
|
|
50
|
+
const bufferLoading = genericReduce(monad, arrayPush, buffer)
|
|
51
|
+
if (isPromise(bufferLoading)) {
|
|
52
|
+
const promise = bufferLoading.then(() => promises.delete(promise))
|
|
53
|
+
promises.add(promise)
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
isAsyncIteratorDone = true
|
|
58
|
+
},
|
|
59
|
+
|
|
37
60
|
/**
|
|
38
|
-
* @name
|
|
61
|
+
* @name next
|
|
39
62
|
*
|
|
40
63
|
* @synopsis
|
|
41
64
|
* ```coffeescript [specscript]
|
|
42
|
-
*
|
|
43
|
-
* asyncIterator AsyncIterator, flatMapper function,
|
|
44
|
-
* ).next() -> Promise<{ value, done }>
|
|
65
|
+
* next() -> Promise<{ value, done }>
|
|
45
66
|
* ```
|
|
46
67
|
*/
|
|
47
68
|
async next() {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
this.isAsyncIteratorDone = done
|
|
55
|
-
} else {
|
|
56
|
-
const monad = flatMapper(value)
|
|
57
|
-
if (isPromise(monad)) {
|
|
58
|
-
const bufferLoading =
|
|
59
|
-
monad.then(curry3(genericReduce, __, arrayPush, buffer))
|
|
60
|
-
const promise = bufferLoading.then(() => promises.delete(promise))
|
|
61
|
-
promises.add(promise)
|
|
62
|
-
} else {
|
|
63
|
-
const bufferLoading = genericReduce(monad, arrayPush, buffer)
|
|
64
|
-
if (isPromise(bufferLoading)) {
|
|
65
|
-
const promise = bufferLoading.then(() => promises.delete(promise))
|
|
66
|
-
promises.add(promise)
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
}
|
|
69
|
+
if (!consumingAsyncIterator) {
|
|
70
|
+
this._consumeAsyncIterator()
|
|
71
|
+
consumingAsyncIterator = true
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
while (!isAsyncIteratorDone || promises.size > 0) {
|
|
71
75
|
if (buffer.length > 0) {
|
|
72
76
|
return { value: buffer.shift(), done: false }
|
|
73
77
|
}
|
|
74
78
|
if (promises.size > 0) {
|
|
75
|
-
await promiseRace(
|
|
79
|
+
await promiseRace(promises)
|
|
80
|
+
} else {
|
|
81
|
+
await sleep(10)
|
|
76
82
|
}
|
|
77
83
|
}
|
|
84
|
+
|
|
85
|
+
if (buffer.length > 0) {
|
|
86
|
+
return { value: buffer.shift(), done: false }
|
|
87
|
+
}
|
|
88
|
+
|
|
78
89
|
return { value: undefined, done: true }
|
|
79
90
|
},
|
|
80
91
|
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @name LinkedList
|
|
3
|
+
*
|
|
4
|
+
* @docs
|
|
5
|
+
* ```coffeescript [specscript]
|
|
6
|
+
* new LinkedList() -> LinkedList
|
|
7
|
+
* ```
|
|
8
|
+
*/
|
|
9
|
+
class LinkedList {
|
|
10
|
+
constructor() {
|
|
11
|
+
this.first = null
|
|
12
|
+
this.last = null
|
|
13
|
+
this.length = 0
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// popFirst() -> firstValue any
|
|
17
|
+
popFirst() {
|
|
18
|
+
const first = this.first
|
|
19
|
+
|
|
20
|
+
if (first == null) {
|
|
21
|
+
return undefined
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
if (first.next) {
|
|
25
|
+
this.first = first.next
|
|
26
|
+
} else {
|
|
27
|
+
this.first = null
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
this.length -= 1
|
|
31
|
+
|
|
32
|
+
return first.value
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// append(value any) -> undefined
|
|
36
|
+
append(value) {
|
|
37
|
+
const node = { value }
|
|
38
|
+
if (this.first == null) {
|
|
39
|
+
this.first = node
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (this.last == null) {
|
|
43
|
+
this.last = node
|
|
44
|
+
} else {
|
|
45
|
+
this.last.next = node
|
|
46
|
+
this.last = node
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
this.length += 1
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
module.exports = LinkedList
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
const LinkedList = require('./LinkedList')
|
|
2
|
+
const assert = require('assert')
|
|
3
|
+
|
|
4
|
+
describe('LinkedList', () => {
|
|
5
|
+
it('integration', async () => {
|
|
6
|
+
const ll = new LinkedList()
|
|
7
|
+
|
|
8
|
+
assert.strictEqual(ll.popFirst(), undefined)
|
|
9
|
+
|
|
10
|
+
ll.append('value1')
|
|
11
|
+
assert.strictEqual(ll.length, 1)
|
|
12
|
+
|
|
13
|
+
assert.strictEqual(ll.popFirst(), 'value1')
|
|
14
|
+
assert.strictEqual(ll.length, 0)
|
|
15
|
+
assert.strictEqual(ll.popFirst(), undefined)
|
|
16
|
+
assert.strictEqual(ll.length, 0)
|
|
17
|
+
|
|
18
|
+
ll.append('value1')
|
|
19
|
+
assert.strictEqual(ll.length, 1)
|
|
20
|
+
ll.append('value2')
|
|
21
|
+
assert.strictEqual(ll.length, 2)
|
|
22
|
+
ll.append('value3')
|
|
23
|
+
assert.strictEqual(ll.length, 3)
|
|
24
|
+
|
|
25
|
+
assert.strictEqual(ll.popFirst(), 'value1')
|
|
26
|
+
assert.strictEqual(ll.length, 2)
|
|
27
|
+
assert.strictEqual(ll.popFirst(), 'value2')
|
|
28
|
+
assert.strictEqual(ll.length, 1)
|
|
29
|
+
assert.strictEqual(ll.popFirst(), 'value3')
|
|
30
|
+
assert.strictEqual(ll.length, 0)
|
|
31
|
+
assert.strictEqual(ll.popFirst(), undefined)
|
|
32
|
+
assert.strictEqual(ll.length, 0)
|
|
33
|
+
})
|
|
34
|
+
})
|
|
@@ -1,6 +1,11 @@
|
|
|
1
|
-
const
|
|
1
|
+
const promiseRace = require('./promiseRace')
|
|
2
|
+
const __ = require('./placeholder')
|
|
3
|
+
const curry2 = require('./curry2')
|
|
2
4
|
const isPromise = require('./isPromise')
|
|
5
|
+
const LinkedList = require('./LinkedList')
|
|
3
6
|
const symbolAsyncIterator = require('./symbolAsyncIterator')
|
|
7
|
+
const arrayPush = require('./arrayPush')
|
|
8
|
+
const sleep = require('./sleep')
|
|
4
9
|
|
|
5
10
|
/**
|
|
6
11
|
* @name MappingAsyncIterator
|
|
@@ -15,20 +20,65 @@ const symbolAsyncIterator = require('./symbolAsyncIterator')
|
|
|
15
20
|
* mappingAsyncIterator.next() -> Promise<{ value: any, done: boolean }>
|
|
16
21
|
* ```
|
|
17
22
|
*/
|
|
18
|
-
const MappingAsyncIterator = (asyncIterator, mapper) =>
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
23
|
+
const MappingAsyncIterator = (asyncIterator, mapper) => {
|
|
24
|
+
const buffer = new LinkedList()
|
|
25
|
+
|
|
26
|
+
let index = -1
|
|
27
|
+
let consumingAsyncIterator = false
|
|
28
|
+
let isAsyncIteratorDone = false
|
|
29
|
+
|
|
30
|
+
return {
|
|
31
|
+
[symbolAsyncIterator]() {
|
|
32
|
+
return this
|
|
33
|
+
},
|
|
34
|
+
|
|
35
|
+
// _consumeAsyncIterator() -> Promise<>
|
|
36
|
+
async _consumeAsyncIterator() {
|
|
37
|
+
for await (const item of asyncIterator) {
|
|
38
|
+
index += 1
|
|
39
|
+
const mappedItem = mapper(item)
|
|
40
|
+
buffer.append(mappedItem)
|
|
41
|
+
}
|
|
42
|
+
isAsyncIteratorDone = true
|
|
43
|
+
},
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* @name next
|
|
47
|
+
*
|
|
48
|
+
* @synopsis
|
|
49
|
+
* ```coffeescript [specscript]
|
|
50
|
+
* next() -> Promise<{ value, done }>
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
async next() {
|
|
54
|
+
if (!consumingAsyncIterator) {
|
|
55
|
+
this._consumeAsyncIterator()
|
|
56
|
+
consumingAsyncIterator = true
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
while (!isAsyncIteratorDone) {
|
|
60
|
+
if (buffer.length > 0) {
|
|
61
|
+
let value = buffer.popFirst()
|
|
62
|
+
if (isPromise(value)) {
|
|
63
|
+
value = await value
|
|
64
|
+
}
|
|
65
|
+
return { value, done: false }
|
|
66
|
+
}
|
|
67
|
+
await sleep(10)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (buffer.length > 0) {
|
|
71
|
+
let value = buffer.popFirst()
|
|
72
|
+
if (isPromise(value)) {
|
|
73
|
+
value = await value
|
|
74
|
+
}
|
|
75
|
+
return { value, done: false }
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return { value: undefined, done: true }
|
|
79
|
+
},
|
|
80
|
+
|
|
31
81
|
}
|
|
32
|
-
}
|
|
82
|
+
}
|
|
33
83
|
|
|
34
84
|
module.exports = MappingAsyncIterator
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
const promiseRace = require('./promiseRace')
|
|
2
|
+
const __ = require('./placeholder')
|
|
3
|
+
const curry2 = require('./curry2')
|
|
4
|
+
const isPromise = require('./isPromise')
|
|
5
|
+
const LinkedList = require('./LinkedList')
|
|
6
|
+
const symbolAsyncIterator = require('./symbolAsyncIterator')
|
|
7
|
+
const arrayPush = require('./arrayPush')
|
|
8
|
+
const sleep = require('./sleep')
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* @name SerialMappingAsyncIterator
|
|
12
|
+
*
|
|
13
|
+
* @synopsis
|
|
14
|
+
* ```coffeescript [specscript]
|
|
15
|
+
* serialMappingAsyncIterator = new SerialMappingAsyncIterator(
|
|
16
|
+
* asyncIter AsyncIterator<T>,
|
|
17
|
+
* mapper T=>Promise|any,
|
|
18
|
+
* ) -> serialMappingAsyncIterator AsyncIterator
|
|
19
|
+
*
|
|
20
|
+
* serialMappingAsyncIterator.next() -> Promise<{ value: any, done: boolean }>
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
const SerialMappingAsyncIterator = (asyncIterator, mapper) => {
|
|
24
|
+
const buffer = new LinkedList()
|
|
25
|
+
|
|
26
|
+
let index = -1
|
|
27
|
+
let consumingAsyncIterator = false
|
|
28
|
+
let isAsyncIteratorDone = false
|
|
29
|
+
|
|
30
|
+
return {
|
|
31
|
+
[symbolAsyncIterator]() {
|
|
32
|
+
return this
|
|
33
|
+
},
|
|
34
|
+
|
|
35
|
+
// _consumeAsyncIterator() -> Promise<>
|
|
36
|
+
async _consumeAsyncIterator() {
|
|
37
|
+
for await (const item of asyncIterator) {
|
|
38
|
+
index += 1
|
|
39
|
+
let mappedItem = mapper(item)
|
|
40
|
+
if (isPromise(mappedItem)) {
|
|
41
|
+
mappedItem = await mappedItem
|
|
42
|
+
}
|
|
43
|
+
buffer.append(mappedItem)
|
|
44
|
+
}
|
|
45
|
+
isAsyncIteratorDone = true
|
|
46
|
+
},
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* @name next
|
|
50
|
+
*
|
|
51
|
+
* @synopsis
|
|
52
|
+
* ```coffeescript [specscript]
|
|
53
|
+
* next() -> Promise<{ value, done }>
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
async next() {
|
|
57
|
+
if (!consumingAsyncIterator) {
|
|
58
|
+
this._consumeAsyncIterator()
|
|
59
|
+
consumingAsyncIterator = true
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
while (!isAsyncIteratorDone) {
|
|
63
|
+
if (buffer.length > 0) {
|
|
64
|
+
return { value: buffer.popFirst(), done: false }
|
|
65
|
+
}
|
|
66
|
+
await sleep(10)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (buffer.length > 0) {
|
|
70
|
+
return { value: buffer.popFirst(), done: false }
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return { value: undefined, done: true }
|
|
74
|
+
},
|
|
75
|
+
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
module.exports = SerialMappingAsyncIterator
|
|
@@ -28,7 +28,6 @@ const iteratorFindAsync = async function (iterator, predicate) {
|
|
|
28
28
|
}
|
|
29
29
|
iteration = iterator.next()
|
|
30
30
|
}
|
|
31
|
-
return undefined
|
|
32
31
|
}
|
|
33
32
|
|
|
34
33
|
/**
|
|
@@ -57,7 +56,6 @@ const iteratorFind = function (iterator, predicate) {
|
|
|
57
56
|
}
|
|
58
57
|
iteration = iterator.next()
|
|
59
58
|
}
|
|
60
|
-
return undefined
|
|
61
59
|
}
|
|
62
60
|
|
|
63
61
|
module.exports = iteratorFind
|
|
@@ -32,7 +32,7 @@ const _iteratorForEachSeriesAsync = async function (iterator, callback) {
|
|
|
32
32
|
*/
|
|
33
33
|
const iteratorForEachSeries = function (iterator, callback) {
|
|
34
34
|
let iteration = iterator.next()
|
|
35
|
-
while (!
|
|
35
|
+
while (!iteration.done) {
|
|
36
36
|
const operation = callback(iteration.value)
|
|
37
37
|
if (isPromise(operation)) {
|
|
38
38
|
return operation
|
|
@@ -38,9 +38,12 @@ const objectFlatten = function (object) {
|
|
|
38
38
|
|
|
39
39
|
for (const key in object) {
|
|
40
40
|
const element = object[key]
|
|
41
|
+
|
|
41
42
|
if (element == null) {
|
|
42
43
|
continue
|
|
43
|
-
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (typeof element[symbolIterator] == 'function') {
|
|
44
47
|
for (const monadElement of element) {
|
|
45
48
|
objectAssign(result, monadElement)
|
|
46
49
|
}
|
package/all.js
CHANGED
|
@@ -60,8 +60,7 @@ const _allValues = function (values) {
|
|
|
60
60
|
*
|
|
61
61
|
* const arrayOfGreetings = createArrayOfGreetings('example')
|
|
62
62
|
*
|
|
63
|
-
* console.log(
|
|
64
|
-
* // ['Hi example', 'Hello example', 'Gretings example']
|
|
63
|
+
* console.log(arrayOfGreetings)
|
|
65
64
|
* ```
|
|
66
65
|
*
|
|
67
66
|
* If provided promises, `all` resolves those promises and returns a promise of the resolved values.
|
|
@@ -107,13 +106,13 @@ const _allValues = function (values) {
|
|
|
107
106
|
* getAndLogUserById('1')
|
|
108
107
|
* ```
|
|
109
108
|
*
|
|
110
|
-
* Any promises
|
|
109
|
+
* Any promises in `arguments` are resolved for their values before further execution for the eager interface only.
|
|
111
110
|
*
|
|
112
111
|
* ```javascript [playground]
|
|
113
|
-
* all(Promise.resolve({ a: 1 }), [
|
|
114
|
-
* obj => obj.a + 1,
|
|
115
|
-
* obj => obj.a + 2,
|
|
116
|
-
* obj => obj.a + 3,
|
|
112
|
+
* all(Promise.resolve({ a: 1 }), Promise.resolve(2), [
|
|
113
|
+
* (obj, n) => obj.a + n + 1,
|
|
114
|
+
* (obj, n) => obj.a + n + 2,
|
|
115
|
+
* (obj, n) => obj.a + n + 3,
|
|
117
116
|
* ]).then(console.log)
|
|
118
117
|
* ```
|
|
119
118
|
*
|
|
@@ -169,7 +168,7 @@ const all = function (...args) {
|
|
|
169
168
|
* ```
|
|
170
169
|
*
|
|
171
170
|
* @description
|
|
172
|
-
*
|
|
171
|
+
* [all](/docs/all) with serial execution.
|
|
173
172
|
*
|
|
174
173
|
* ```javascript [playground]
|
|
175
174
|
* const sleep = ms => () => new Promise(resolve => setTimeout(resolve, ms))
|
package/and.js
CHANGED
|
@@ -145,7 +145,7 @@ const areAllPredicatesTruthy = function (args, predicates) {
|
|
|
145
145
|
* console.log(condition) // true
|
|
146
146
|
* ```
|
|
147
147
|
*
|
|
148
|
-
* Any promises passed in argument position are resolved for their values before further execution.
|
|
148
|
+
* Any promises passed in data argument position are resolved for their values before further execution.
|
|
149
149
|
*
|
|
150
150
|
* ```javascript [playground]
|
|
151
151
|
* and(Promise.resolve(5), [
|
package/assign.js
CHANGED
|
@@ -61,7 +61,7 @@ const _assign = function (object, funcs) {
|
|
|
61
61
|
* promise.then(console.log)
|
|
62
62
|
* ```
|
|
63
63
|
*
|
|
64
|
-
*
|
|
64
|
+
* If the argument object is a promise, it is resolved for its value before further execution for the eager interface only.
|
|
65
65
|
*
|
|
66
66
|
* ```javascript [playground]
|
|
67
67
|
* assign(Promise.resolve({}), {
|
package/compose.js
CHANGED
|
@@ -44,7 +44,7 @@ const funcConcat = require('./_internal/funcConcat')
|
|
|
44
44
|
* console.log(composition(1))
|
|
45
45
|
* ```
|
|
46
46
|
*
|
|
47
|
-
* Any promises
|
|
47
|
+
* Any promises in `arguments` are resolved for their values before further execution for the eager interface only.
|
|
48
48
|
*
|
|
49
49
|
* ```javascript [playground]
|
|
50
50
|
* compose(Promise.resolve(1), 2, Promise.resolve(3), [
|
package/curry.js
CHANGED
|
@@ -37,7 +37,7 @@ const curryArity = require('./_internal/curryArity')
|
|
|
37
37
|
* console.log(curry(add, __, __, 'c')(__, 'b')('a'))
|
|
38
38
|
* ```
|
|
39
39
|
*
|
|
40
|
-
* Any promises passed in argument position are resolved for their values before further execution.
|
|
40
|
+
* Any promises passed in data argument position are resolved for their values before further execution.
|
|
41
41
|
*
|
|
42
42
|
* ```javascript [playground]
|
|
43
43
|
* const add = (a, b, c) => a + b + c
|
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
package/dist/all.es.js
CHANGED
package/dist/all.es.min.js
CHANGED
package/dist/all.js
CHANGED
package/dist/all.min.js
CHANGED
package/dist/all.mjs
CHANGED
package/dist/always.es.js
CHANGED
package/dist/always.es.min.js
CHANGED
package/dist/always.js
CHANGED
package/dist/always.min.js
CHANGED
package/dist/always.mjs
CHANGED
package/dist/and.es.js
CHANGED
package/dist/and.es.min.js
CHANGED