rubico 2.10.0 → 2.12.1
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 +16 -20
- package/Transducer.js +37 -58
- package/__.js +3 -3
- package/_internal/FilteringAsyncIterator.js +74 -23
- package/always.js +4 -4
- package/and.js +34 -26
- package/assign.js +2 -2
- package/compose.js +1 -0
- package/curry.js +48 -28
- 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 +113 -19
- package/dist/filter.es.min.js +2 -2
- package/dist/filter.js +113 -19
- package/dist/filter.min.js +2 -2
- package/dist/filter.mjs +113 -19
- 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 +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 +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 +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 +57 -19
- package/dist/rubico.es.min.js +2 -2
- package/dist/rubico.global.js +57 -19
- package/dist/rubico.global.min.js +2 -2
- package/dist/rubico.js +57 -19
- package/dist/rubico.min.js +2 -2
- package/dist/rubico.mjs +57 -19
- 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 +113 -19
- package/dist/x/filterOut.es.min.js +2 -2
- package/dist/x/filterOut.js +113 -19
- package/dist/x/filterOut.min.js +2 -2
- package/dist/x/filterOut.mjs +113 -19
- 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 +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 +29 -30
- package/es.js +57 -19
- package/every.js +14 -20
- package/filter.js +48 -86
- package/flatMap.js +13 -13
- package/forEach.js +8 -8
- package/get.js +3 -3
- package/gt.js +18 -25
- package/gte.js +22 -29
- package/index.js +57 -19
- package/lt.js +33 -31
- package/lte.js +24 -31
- package/map.js +37 -41
- package/not.js +12 -17
- package/or.js +34 -26
- package/package.json +1 -1
- package/reduce.js +60 -67
- package/some.js +11 -34
- package/switchCase.js +3 -3
- package/thunkify.js +42 -12
- package/transform.js +57 -56
package/every.js
CHANGED
|
@@ -51,18 +51,22 @@ const _every = function (collection, predicate) {
|
|
|
51
51
|
* ```
|
|
52
52
|
*
|
|
53
53
|
* @description
|
|
54
|
-
*
|
|
54
|
+
* Tests a predicate concurrently across all items of a foldable. Returns true if every item tests true by the predicate.
|
|
55
55
|
*
|
|
56
56
|
* ```javascript [playground]
|
|
57
57
|
* const isOdd = number => number % 2 == 1
|
|
58
58
|
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
59
|
+
* {
|
|
60
|
+
* const array = [1, 2, 3, 4, 5]
|
|
61
|
+
* const isEveryNumberOdd = every(array, isOdd)
|
|
62
|
+
* console.log(isEveryNumberOdd)
|
|
63
|
+
* }
|
|
62
64
|
*
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
*
|
|
65
|
+
* {
|
|
66
|
+
* const array = [1, 3, 5]
|
|
67
|
+
* const isEveryNumberOdd = every(array, isOdd)
|
|
68
|
+
* console.log(isEveryNumberOdd)
|
|
69
|
+
* }
|
|
66
70
|
* ```
|
|
67
71
|
*
|
|
68
72
|
* The following data types are considered to be foldables:
|
|
@@ -74,29 +78,19 @@ const _every = function (collection, predicate) {
|
|
|
74
78
|
* * `object with .reduce method`
|
|
75
79
|
* * `object`
|
|
76
80
|
*
|
|
77
|
-
* `every` works for async generators.
|
|
78
|
-
*
|
|
79
|
-
* ```javascript [playground]
|
|
80
|
-
* const asyncNumbers = async function* () {
|
|
81
|
-
* yield 1; yield 2; yield 3; yield 4; yield 5
|
|
82
|
-
* }
|
|
83
|
-
*
|
|
84
|
-
* every(asyncNumbers(), async number => number < 6).then(console.log) // true
|
|
85
|
-
* ```
|
|
86
|
-
*
|
|
87
81
|
* `every` supports a lazy interface for composability.
|
|
88
82
|
*
|
|
89
83
|
* ```javascript [playground]
|
|
90
84
|
* pipe([1, 2, 3], [
|
|
91
85
|
* every(number => number < 5),
|
|
92
|
-
* console.log,
|
|
86
|
+
* console.log,
|
|
93
87
|
* ])
|
|
94
88
|
* ```
|
|
95
89
|
*
|
|
96
|
-
*
|
|
90
|
+
* If the foldable is a promise, it is resolved for its value before further execution for the eager interface only.
|
|
97
91
|
*
|
|
98
92
|
* ```javascript [playground]
|
|
99
|
-
* every(Promise.resolve([1, 2, 3, 4, 5]), n => n < 6).then(console.log)
|
|
93
|
+
* every(Promise.resolve([1, 2, 3, 4, 5]), n => n < 6).then(console.log)
|
|
100
94
|
* ```
|
|
101
95
|
*
|
|
102
96
|
* See also:
|
package/filter.js
CHANGED
|
@@ -96,14 +96,24 @@ const _filter = function (value, predicate) {
|
|
|
96
96
|
* value any,
|
|
97
97
|
* indexOrKey number|string|any,
|
|
98
98
|
* filterable Filterable,
|
|
99
|
-
* )=>(
|
|
99
|
+
* )=>(booleanResult Promise|boolean|any)
|
|
100
100
|
*
|
|
101
|
-
* filter(filterable Promise|Filterable, predicate SyncOrAsyncPredicate) ->
|
|
102
|
-
* filter(predicate SyncOrAsyncPredicate)(filterable Filterable) ->
|
|
101
|
+
* filter(filterable Promise|Filterable, predicate SyncOrAsyncPredicate) -> filteredFilterable Promise|Filterable
|
|
102
|
+
* filter(predicate SyncOrAsyncPredicate)(filterable Filterable) -> filteredFilterable Promise|Filterable
|
|
103
103
|
* ```
|
|
104
104
|
*
|
|
105
105
|
* @description
|
|
106
|
-
* Filters out
|
|
106
|
+
* Filters out items from a filterable, returning a filtered filterable of the same type. The order of the items of the filterable is preserved.
|
|
107
|
+
*
|
|
108
|
+
* ```javascript [playground]
|
|
109
|
+
* const isOdd = number => number % 2 == 1
|
|
110
|
+
*
|
|
111
|
+
* const array = [1, 2, 3, 4, 5]
|
|
112
|
+
*
|
|
113
|
+
* const filteredArray = filter(array, isOdd)
|
|
114
|
+
*
|
|
115
|
+
* console.log(filteredArray)
|
|
116
|
+
* ```
|
|
107
117
|
*
|
|
108
118
|
* The following data types are considered to be filterables:
|
|
109
119
|
* * `array`
|
|
@@ -114,12 +124,12 @@ const _filter = function (value, predicate) {
|
|
|
114
124
|
* * `object with .filter method`
|
|
115
125
|
* * `object`
|
|
116
126
|
*
|
|
117
|
-
* The filtering operation is defined by
|
|
127
|
+
* The filtering operation is defined by the predicate function, which determines whether a given item from the filterable should be included in the filtered filterable.
|
|
118
128
|
*
|
|
119
129
|
* ```javascript
|
|
120
|
-
* const predicate = function (
|
|
121
|
-
* //
|
|
122
|
-
* return
|
|
130
|
+
* const predicate = function (item) {
|
|
131
|
+
* // booleanResult is the boolean result of the predicate
|
|
132
|
+
* return booleanResult
|
|
123
133
|
* }
|
|
124
134
|
* ```
|
|
125
135
|
*
|
|
@@ -127,142 +137,94 @@ const _filter = function (value, predicate) {
|
|
|
127
137
|
*
|
|
128
138
|
* If the filterable is an array:
|
|
129
139
|
* ```coffeescript [specscript]
|
|
130
|
-
* predicate(
|
|
140
|
+
* predicate(item any, index number, filterable Array) -> booleanResult Promise|boolean|any
|
|
131
141
|
* ```
|
|
132
142
|
*
|
|
133
143
|
* If the filterable is a set:
|
|
134
144
|
* ```coffeescript [specscript]
|
|
135
|
-
* predicate(
|
|
145
|
+
* predicate(item any, item any, filterable Set) -> booleanResult Promise|boolean|any
|
|
136
146
|
* ```
|
|
137
147
|
*
|
|
138
148
|
* If the filterable is a map:
|
|
139
149
|
* ```coffeescript [specscript]
|
|
140
|
-
* predicate(
|
|
150
|
+
* predicate(item any, key any, filterable Map) -> booleanResult Promise|boolean|any
|
|
141
151
|
* ```
|
|
142
152
|
*
|
|
143
153
|
* If the filterable is a generator:
|
|
144
154
|
* ```coffeescript [specscript]
|
|
145
|
-
* predicate(
|
|
155
|
+
* predicate(item any) -> booleanResult Promise|boolean|any
|
|
146
156
|
* ```
|
|
147
157
|
*
|
|
148
158
|
* If the filterable is an async generator:
|
|
149
159
|
* ```coffeescript [specscript]
|
|
150
|
-
* predicate(
|
|
160
|
+
* predicate(item any) -> booleanResult Promise|boolean|any
|
|
151
161
|
* ```
|
|
152
162
|
*
|
|
153
|
-
* If the filterable is an object with a `.filter` method, the predicate function signature is defined externally.
|
|
154
|
-
*
|
|
155
163
|
* If the filterable is a plain object:
|
|
156
164
|
* ```coffeescript [specscript]
|
|
157
|
-
* predicate(
|
|
165
|
+
* predicate(item any, key string, filterable Object) -> booleanResult Promise|boolean|any
|
|
158
166
|
* ```
|
|
159
167
|
*
|
|
160
|
-
*
|
|
161
|
-
*
|
|
162
|
-
* ```javascript [playground]
|
|
163
|
-
* const isOdd = number => number % 2 == 1
|
|
164
|
-
*
|
|
165
|
-
* const array = [1, 2, 3, 4, 5]
|
|
168
|
+
* If the filterable is an object with a `.filter` method, the predicate function signature is defined externally.
|
|
166
169
|
*
|
|
167
|
-
*
|
|
168
|
-
* console.log(result) // [1, 3, 5]
|
|
169
|
-
* ```
|
|
170
|
+
* If the filterable is a generator, the predicate function must be synchronous.
|
|
170
171
|
*
|
|
171
|
-
* If the predicate is asynchronous,
|
|
172
|
+
* If the predicate function is asynchronous, it is executed concurrently.
|
|
172
173
|
*
|
|
173
174
|
* ```javascript [playground]
|
|
174
175
|
* const asyncIsOdd = async number => number % 2 == 1
|
|
175
176
|
*
|
|
176
177
|
* const array = [1, 2, 3, 4, 5]
|
|
177
178
|
*
|
|
178
|
-
* const
|
|
179
|
-
* promise.then(console.log) // [1, 3, 5]
|
|
180
|
-
* ```
|
|
181
|
-
*
|
|
182
|
-
* `filter` applies the predicate function to just the values of an object.
|
|
179
|
+
* const result = await filter(array, asyncIsOdd)
|
|
183
180
|
*
|
|
184
|
-
*
|
|
185
|
-
* const isOdd = number => number % 2 == 1
|
|
186
|
-
*
|
|
187
|
-
* const obj = { a: 1, b: 2, c: 3, d: 4, e: 5 }
|
|
188
|
-
*
|
|
189
|
-
* const result = filter(obj, isOdd)
|
|
190
|
-
* console.log(result) // { a: 1, c: 3, e: 5 }
|
|
181
|
+
* console.log(result)
|
|
191
182
|
* ```
|
|
192
183
|
*
|
|
193
|
-
* `filter` applies the predicate to the values of
|
|
184
|
+
* `filter` applies the predicate function to just the values of objects and maps.
|
|
194
185
|
*
|
|
195
186
|
* ```javascript [playground]
|
|
196
187
|
* const isOdd = number => number % 2 == 1
|
|
197
188
|
*
|
|
198
|
-
* const
|
|
199
|
-
*
|
|
200
|
-
* const result = filter(myMap, isOdd)
|
|
201
|
-
* console.log(result) // Map(3) { 'a' => 1, 'c' => 3, 'e' => 5 }
|
|
202
|
-
* ```
|
|
189
|
+
* const object = { a: 1, b: 2, c: 3, d: 4, e: 5 }
|
|
190
|
+
* const map = new Map([['a', 1], ['b', 2], ['c', 3], ['d', 4], ['e', 5]])
|
|
203
191
|
*
|
|
204
|
-
*
|
|
192
|
+
* const filteredObject = filter(object, isOdd)
|
|
193
|
+
* const filteredMap = filter(map, isOdd)
|
|
205
194
|
*
|
|
206
|
-
*
|
|
207
|
-
*
|
|
208
|
-
*
|
|
209
|
-
* const numbersGeneratorFunction = function* () {
|
|
210
|
-
* yield 1; yield 2; yield 3; yield 4; yield 5
|
|
211
|
-
* }
|
|
212
|
-
*
|
|
213
|
-
* const numbersGenerator = numbersGeneratorFunction()
|
|
214
|
-
* const oddNumbersGenerator = filter(numbersGeneratorFunction(), isOdd)
|
|
215
|
-
*
|
|
216
|
-
* for (const number of numbersGenerator) {
|
|
217
|
-
* console.log(number) // 1
|
|
218
|
-
* // 2
|
|
219
|
-
* // 3
|
|
220
|
-
* // 4
|
|
221
|
-
* // 5
|
|
222
|
-
* }
|
|
223
|
-
*
|
|
224
|
-
* for (const number of oddNumbersGenerator) {
|
|
225
|
-
* console.log(number) // 1
|
|
226
|
-
* // 3
|
|
227
|
-
* // 5
|
|
228
|
-
* }
|
|
195
|
+
* console.log(filteredObject)
|
|
196
|
+
* console.log(filteredMap)
|
|
229
197
|
* ```
|
|
230
198
|
*
|
|
231
|
-
* For
|
|
199
|
+
* For generators, `filter` returns a filtered generator.
|
|
232
200
|
*
|
|
233
201
|
* ```javascript [playground]
|
|
234
|
-
* const
|
|
202
|
+
* const isOdd = number => number % 2 == 1
|
|
235
203
|
*
|
|
236
|
-
* const
|
|
204
|
+
* const generateNumbers = function* () {
|
|
237
205
|
* yield 1; yield 2; yield 3; yield 4; yield 5
|
|
238
206
|
* }
|
|
239
207
|
*
|
|
240
|
-
* const
|
|
241
|
-
*
|
|
242
|
-
* const asyncOddNumbersGenerator = filter(asyncNumbersGeneratorFunction(), asyncIsOdd)
|
|
208
|
+
* const numbers = generateNumbers()
|
|
209
|
+
* const oddNumbers = filter(generateNumbers(), isOdd)
|
|
243
210
|
*
|
|
244
|
-
*
|
|
245
|
-
*
|
|
246
|
-
*
|
|
247
|
-
* // 3
|
|
248
|
-
* // 4
|
|
249
|
-
* // 5
|
|
211
|
+
* console.log('numbers')
|
|
212
|
+
* for (const number of numbers) {
|
|
213
|
+
* console.log(number)
|
|
250
214
|
* }
|
|
251
215
|
*
|
|
252
|
-
*
|
|
253
|
-
*
|
|
254
|
-
*
|
|
255
|
-
* // 5
|
|
216
|
+
* console.log('odd numbers')
|
|
217
|
+
* for (const number of oddNumbers) {
|
|
218
|
+
* console.log(number)
|
|
256
219
|
* }
|
|
257
220
|
* ```
|
|
258
221
|
*
|
|
259
|
-
*
|
|
222
|
+
* If the filterable is a promise, it is resolved for its value before further execution for the eager interface only.
|
|
260
223
|
*
|
|
261
224
|
* ```javascript [playground]
|
|
262
225
|
* const isOdd = number => number % 2 == 1
|
|
263
226
|
*
|
|
264
227
|
* filter(Promise.resolve([1, 2, 3, 4, 5]), isOdd).then(console.log)
|
|
265
|
-
* // [1, 3, 5]
|
|
266
228
|
* ```
|
|
267
229
|
*
|
|
268
230
|
* See also:
|
package/flatMap.js
CHANGED
|
@@ -79,9 +79,17 @@ const _flatMap = function (value, flatMapper) {
|
|
|
79
79
|
* @description
|
|
80
80
|
* Applies a flat-mapper function to each item of a monad, returning a flat-mapped monad of the same type.
|
|
81
81
|
*
|
|
82
|
-
*
|
|
82
|
+
* ```javascript [playground]
|
|
83
|
+
* const duplicate = value => [value, value]
|
|
84
|
+
*
|
|
85
|
+
* const duplicated = flatMap([1, 2, 3, 4, 5], duplicate)
|
|
86
|
+
*
|
|
87
|
+
* console.log(duplicated)
|
|
88
|
+
* ```
|
|
89
|
+
*
|
|
90
|
+
* `flatMap` iterates through each item of a monad and applies the flat-mapper function to each item, concatenating the execution result (flat-mapped item) into the flat-mapped monad. If the execution result is a promise, it is resolved for its value before being concatenated into the flat-mapped monad. If the execution result is asynchronously iterable, it is muxed into the flat-mapped monad.
|
|
83
91
|
*
|
|
84
|
-
* If the flat-mapper is asynchronous, it is executed concurrently.
|
|
92
|
+
* If the flat-mapper function is asynchronous, it is executed concurrently.
|
|
85
93
|
*
|
|
86
94
|
* The following data types are considered to be monads:
|
|
87
95
|
* * `array`
|
|
@@ -125,15 +133,7 @@ const _flatMap = function (value, flatMapper) {
|
|
|
125
133
|
* flatMapper(item any, key string, monad Object) -> flatMappedItem Promise|Monad|any
|
|
126
134
|
* ```
|
|
127
135
|
*
|
|
128
|
-
*
|
|
129
|
-
* const duplicate = value => [value, value]
|
|
130
|
-
*
|
|
131
|
-
* const duplicated = flatMap([1, 2, 3, 4, 5], duplicate)
|
|
132
|
-
*
|
|
133
|
-
* console.log(duplicated)
|
|
134
|
-
* ```
|
|
135
|
-
*
|
|
136
|
-
* If the iterable is an object with a `.flatMap` or `.chain` method, the flat-mapper function signature is defined externally.
|
|
136
|
+
* If the iterable is an object with a `flatMap` or `chain` method, the flat-mapper function signature is defined externally.
|
|
137
137
|
*
|
|
138
138
|
* Values from async generators are muxed. Muxing, or asynchronously "mixing", is the process of combining multiple asynchronous sources into one source, with order determined by the asynchronous resolution of the individual promise elements.
|
|
139
139
|
*
|
|
@@ -153,7 +153,7 @@ const _flatMap = function (value, flatMapper) {
|
|
|
153
153
|
* // values from async generators are muxed
|
|
154
154
|
* const muxed = await flatMap(['foo', 'bar', 'baz'], asyncRepeat3)
|
|
155
155
|
*
|
|
156
|
-
* console.log(muxed)
|
|
156
|
+
* console.log('muxed:', muxed)
|
|
157
157
|
*
|
|
158
158
|
* const repeat3 = function* (message) {
|
|
159
159
|
* yield message; yield message; yield message
|
|
@@ -162,7 +162,7 @@ const _flatMap = function (value, flatMapper) {
|
|
|
162
162
|
* // values from generators and other monads are concatenated
|
|
163
163
|
* const repeated = flatMap(['foo', 'bar', 'baz'], repeat3)
|
|
164
164
|
*
|
|
165
|
-
* console.log(repeated)
|
|
165
|
+
* console.log('repeated:', repeated)
|
|
166
166
|
* ```
|
|
167
167
|
*
|
|
168
168
|
* If the monad is a promise, it is resolved for its value before further execution for the eager interface only.
|
package/forEach.js
CHANGED
|
@@ -60,6 +60,14 @@ const _forEach = function (collection, callback) {
|
|
|
60
60
|
* @description
|
|
61
61
|
* Executes a callback function for each item of an iterable, returning the original iterable unmodified.
|
|
62
62
|
*
|
|
63
|
+
* ```javascript [playground]
|
|
64
|
+
* console.log('array')
|
|
65
|
+
* forEach([1, 2, 3, 4, 5], num => console.log(num))
|
|
66
|
+
*
|
|
67
|
+
* console.log('object')
|
|
68
|
+
* forEach({ a: 1, b: 2, c: 3 }, num => console.log(num))
|
|
69
|
+
* ```
|
|
70
|
+
*
|
|
63
71
|
* The following data types are considered to be iterable:
|
|
64
72
|
* * `array`
|
|
65
73
|
* * `set`
|
|
@@ -101,14 +109,6 @@ const _forEach = function (collection, callback) {
|
|
|
101
109
|
* callback(item any, key string, iterable Object) -> Promise|undefined
|
|
102
110
|
* ```
|
|
103
111
|
*
|
|
104
|
-
* ```javascript [playground]
|
|
105
|
-
* console.log('array')
|
|
106
|
-
* forEach([1, 2, 3, 4, 5], num => console.log(num))
|
|
107
|
-
*
|
|
108
|
-
* console.log('object')
|
|
109
|
-
* forEach({ a: 1, b: 2, c: 3 }, num => console.log(num))
|
|
110
|
-
* ```
|
|
111
|
-
*
|
|
112
112
|
* If the iterable is an object with a `.forEach` method, the callback function signature is defined externally.
|
|
113
113
|
*
|
|
114
114
|
* If the callback function is asynchronous, it is executed concurrently.
|
package/get.js
CHANGED
|
@@ -74,9 +74,9 @@ const _get = function (object, path, defaultValue) {
|
|
|
74
74
|
* ```javascript [playground]
|
|
75
75
|
* const asyncDefaultResolver = async object => object.a
|
|
76
76
|
*
|
|
77
|
-
* const
|
|
77
|
+
* const result = await get({ a: 1 }, 'notfound', asyncDefaultResolver)
|
|
78
78
|
*
|
|
79
|
-
*
|
|
79
|
+
* console.log(result)
|
|
80
80
|
* ```
|
|
81
81
|
*
|
|
82
82
|
* `get` supports three types of path patterns for nested property access.
|
|
@@ -96,7 +96,7 @@ const _get = function (object, path, defaultValue) {
|
|
|
96
96
|
* const get00000BracketNotation = get('[0][0][0][0][0]')
|
|
97
97
|
* const get00000ArrayNotation = get([0, 0, 0, 0, 0])
|
|
98
98
|
*
|
|
99
|
-
* const nested = [[[[[
|
|
99
|
+
* const nested = [[[[[1]]]]]
|
|
100
100
|
*
|
|
101
101
|
* console.log(get00000DotNotation(nested))
|
|
102
102
|
* console.log(get00000BracketNotation(nested))
|
package/gt.js
CHANGED
|
@@ -6,44 +6,37 @@ const greaterThan = require('./_internal/greaterThan')
|
|
|
6
6
|
*
|
|
7
7
|
* @synopsis
|
|
8
8
|
* ```coffeescript [specscript]
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* leftResolver SyncOrAsyncResolver
|
|
17
|
-
* rightResolver SyncOrAsyncResolver
|
|
18
|
-
*
|
|
19
|
-
* gt(leftValue, rightValue) -> Promise|boolean
|
|
20
|
-
* gt(...argsOrPromises, leftResolver, rightValue) -> Promise|boolean
|
|
21
|
-
* gt(...argsOrPromises, leftValue, rightResolver) -> Promise|boolean
|
|
22
|
-
* gt(...argsOrPromises, leftResolver, rightResolver) -> Promise|boolean
|
|
23
|
-
* gt(leftResolver, rightValue)(...args) -> Promise|boolean
|
|
24
|
-
* gt(leftValue, rightResolver)(...args) -> Promise|boolean
|
|
25
|
-
* gt(leftResolver, rightResolver)(...args) -> Promise|boolean
|
|
9
|
+
* type SyncOrAsyncResolver = (...arguments)=>Promise|any
|
|
10
|
+
*
|
|
11
|
+
* gt(leftValue Promise|any, rightValue Promise|any) -> Promise|boolean
|
|
12
|
+
* gt(...arguments, leftResolver SyncOrAsyncResolver, rightValue Promise|any) -> Promise|boolean
|
|
13
|
+
* gt(...arguments, leftValue Promise|any, rightResolver SyncOrAsyncResolver) -> Promise|boolean
|
|
14
|
+
* gt(...arguments, leftResolver SyncOrAsyncResolver, rightResolver SyncOrAsyncResolver) -> Promise|boolean
|
|
15
|
+
*
|
|
16
|
+
* gt(leftResolver SyncOrAsyncResolver, rightValue Promise|any)(...arguments) -> Promise|boolean
|
|
17
|
+
* gt(leftValue Promise|any, rightResolver SyncOrAsyncResolver)(...arguments) -> Promise|boolean
|
|
18
|
+
* gt(leftResolver SyncOrAsyncResolver, rightResolver SyncOrAsyncResolver)(...arguments) -> Promise|boolean
|
|
26
19
|
* ```
|
|
27
20
|
*
|
|
28
21
|
* @description
|
|
29
|
-
*
|
|
22
|
+
* Comparison operator. Tests if a value is greater than (`>`) another value.
|
|
30
23
|
*
|
|
31
24
|
* ```javascript [playground]
|
|
32
25
|
* const age = 40
|
|
33
26
|
*
|
|
34
27
|
* const isAgeGreaterThan21 = gt(age, 21)
|
|
35
28
|
*
|
|
36
|
-
* console.log(isAgeGreaterThan21)
|
|
29
|
+
* console.log(isAgeGreaterThan21)
|
|
37
30
|
* ```
|
|
38
31
|
*
|
|
39
|
-
* If either of the two values are resolver functions, `gt` returns a function that resolves the
|
|
32
|
+
* If either of the two values are resolver functions, `gt` returns a function that resolves the values to compare.
|
|
40
33
|
*
|
|
41
34
|
* ```javascript [playground]
|
|
42
35
|
* const isOfLegalAge = gt(get('age'), 21)
|
|
43
36
|
*
|
|
44
37
|
* const juvenile = { age: 16 }
|
|
45
38
|
*
|
|
46
|
-
* console.log(isOfLegalAge(juvenile))
|
|
39
|
+
* console.log(isOfLegalAge(juvenile))
|
|
47
40
|
* ```
|
|
48
41
|
*
|
|
49
42
|
* If either of the resolver functions is asynchronous, `gt` returns an asynchronous function.
|
|
@@ -53,7 +46,7 @@ const greaterThan = require('./_internal/greaterThan')
|
|
|
53
46
|
*
|
|
54
47
|
* const juvenile = { age: 16 }
|
|
55
48
|
*
|
|
56
|
-
* asyncIsOfLegalAge(juvenile).then(console.log)
|
|
49
|
+
* asyncIsOfLegalAge(juvenile).then(console.log)
|
|
57
50
|
* ```
|
|
58
51
|
*
|
|
59
52
|
* `gt` supports a lazy interface for composability.
|
|
@@ -61,14 +54,14 @@ const greaterThan = require('./_internal/greaterThan')
|
|
|
61
54
|
* ```javascript [playground]
|
|
62
55
|
* pipe({ value: 1 }, [
|
|
63
56
|
* gt(5, get('value')),
|
|
64
|
-
* console.log,
|
|
57
|
+
* console.log,
|
|
65
58
|
* ])
|
|
66
59
|
* ```
|
|
67
60
|
*
|
|
68
|
-
* Any promises
|
|
61
|
+
* Any promises in `arguments` are resolved for their values before further execution for the eager interface only.
|
|
69
62
|
*
|
|
70
63
|
* ```javascript [playground]
|
|
71
|
-
* gt(Promise.resolve({ a: 2, b: 1 }), get('a'), get('b')).then(console.log)
|
|
64
|
+
* gt(Promise.resolve({ a: 2, b: 1 }), get('a'), get('b')).then(console.log)
|
|
72
65
|
* ```
|
|
73
66
|
*
|
|
74
67
|
* See also:
|
package/gte.js
CHANGED
|
@@ -6,46 +6,39 @@ const greaterThanOrEqual = require('./_internal/greaterThanOrEqual')
|
|
|
6
6
|
*
|
|
7
7
|
* @synopsis
|
|
8
8
|
* ```coffeescript [specscript]
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* leftResolver SyncOrAsyncResolver
|
|
17
|
-
* rightResolver SyncOrAsyncResolver
|
|
18
|
-
*
|
|
19
|
-
* gte(leftValue, rightValue) -> Promise|boolean
|
|
20
|
-
* gte(...argsOrPromises, leftResolver, rightValue) -> Promise|boolean
|
|
21
|
-
* gte(...argsOrPromises, leftValue, rightResolver) -> Promise|boolean
|
|
22
|
-
* gte(...argsOrPromises, leftResolver, rightResolver) -> Promise|boolean
|
|
23
|
-
* gte(leftResolver, rightValue)(...args) -> Promise|boolean
|
|
24
|
-
* gte(leftValue, rightResolver)(...args) -> Promise|boolean
|
|
25
|
-
* gte(leftResolver, rightResolver)(...args) -> Promise|boolean
|
|
9
|
+
* type SyncOrAsyncResolver = (...arguments)=>Promise|any
|
|
10
|
+
*
|
|
11
|
+
* gte(leftValue Promise|any, rightValue Promise|any) -> Promise|boolean
|
|
12
|
+
* gte(...arguments, leftResolver SyncOrAsyncResolver, rightValue Promise|any) -> Promise|boolean
|
|
13
|
+
* gte(...arguments, leftValue Promise|any, rightResolver SyncOrAsyncResolver) -> Promise|boolean
|
|
14
|
+
* gte(...arguments, leftResolver SyncOrAsyncResolver, rightResolver SyncOrAsyncResolver) -> Promise|boolean
|
|
15
|
+
*
|
|
16
|
+
* gte(leftResolver SyncOrAsyncResolver, rightValue Promise|any)(...arguments) -> Promise|boolean
|
|
17
|
+
* gte(leftValue Promise|any, rightResolver SyncOrAsyncResolver)(...arguments) -> Promise|boolean
|
|
18
|
+
* gte(leftResolver SyncOrAsyncResolver, rightResolver SyncOrAsyncResolver)(...arguments) -> Promise|boolean
|
|
26
19
|
* ```
|
|
27
20
|
*
|
|
28
21
|
* @description
|
|
29
|
-
*
|
|
22
|
+
* Comparison operator. Tests if a value is greater than or equal (`>=`) to another value.
|
|
30
23
|
*
|
|
31
24
|
* ```javascript [playground]
|
|
32
25
|
* const age = 20
|
|
33
26
|
*
|
|
34
27
|
* const isAdultAge = gte(age, 18)
|
|
35
28
|
*
|
|
36
|
-
* console.log(isAdultAge)
|
|
29
|
+
* console.log(isAdultAge)
|
|
37
30
|
* ```
|
|
38
31
|
*
|
|
39
|
-
* If either of the two values are resolver functions, `gte` returns a function that resolves the
|
|
32
|
+
* If either of the two values are resolver functions, `gte` returns a function that resolves the values to compare.
|
|
40
33
|
*
|
|
41
34
|
* ```javascript [playground]
|
|
42
35
|
* const identity = value => value
|
|
43
36
|
*
|
|
44
37
|
* const isAtLeast100 = gte(identity, 100)
|
|
45
38
|
*
|
|
46
|
-
* console.log(isAtLeast100(99))
|
|
47
|
-
* console.log(isAtLeast100(100))
|
|
48
|
-
* console.log(isAtLeast100(101))
|
|
39
|
+
* console.log(isAtLeast100(99))
|
|
40
|
+
* console.log(isAtLeast100(100))
|
|
41
|
+
* console.log(isAtLeast100(101))
|
|
49
42
|
* ```
|
|
50
43
|
*
|
|
51
44
|
* If either of the two resolver functions is asynchronous, `gte` returns an asynchronous function.
|
|
@@ -55,9 +48,9 @@ const greaterThanOrEqual = require('./_internal/greaterThanOrEqual')
|
|
|
55
48
|
*
|
|
56
49
|
* const asyncIsAtLeast100 = gte(asyncIdentity, 100)
|
|
57
50
|
*
|
|
58
|
-
* asyncIsAtLeast100(99).then(console.log)
|
|
59
|
-
* asyncIsAtLeast100(100).then(console.log)
|
|
60
|
-
* asyncIsAtLeast100(101).then(console.log)
|
|
51
|
+
* asyncIsAtLeast100(99).then(console.log)
|
|
52
|
+
* asyncIsAtLeast100(100).then(console.log)
|
|
53
|
+
* asyncIsAtLeast100(101).then(console.log)
|
|
61
54
|
* ```
|
|
62
55
|
*
|
|
63
56
|
* `gte` supports a lazy interface for composability.
|
|
@@ -65,14 +58,14 @@ const greaterThanOrEqual = require('./_internal/greaterThanOrEqual')
|
|
|
65
58
|
* ```javascript [playground]
|
|
66
59
|
* pipe({ value: 1 }, [
|
|
67
60
|
* gte(1, get('value')),
|
|
68
|
-
* console.log,
|
|
61
|
+
* console.log,
|
|
69
62
|
* ])
|
|
70
63
|
* ```
|
|
71
64
|
*
|
|
72
|
-
* Any promises
|
|
65
|
+
* Any promises in `arguments` are resolved for their values before further execution for the eager interface only.
|
|
73
66
|
*
|
|
74
67
|
* ```javascript [playground]
|
|
75
|
-
* gte(Promise.resolve({ a: 1, b: 1 }), get('a'), get('b')).then(console.log)
|
|
68
|
+
* gte(Promise.resolve({ a: 1, b: 1 }), get('a'), get('b')).then(console.log)
|
|
76
69
|
* ```
|
|
77
70
|
*
|
|
78
71
|
* See also:
|
package/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Rubico v2.
|
|
2
|
+
* Rubico v2.12.1
|
|
3
3
|
* https://rubico.land/
|
|
4
4
|
*
|
|
5
5
|
* © Richard Yufei Tong, King of Software
|
|
@@ -1480,26 +1480,64 @@ const FilteringIterator = (iterator, predicate) => ({
|
|
|
1480
1480
|
},
|
|
1481
1481
|
})
|
|
1482
1482
|
|
|
1483
|
-
const FilteringAsyncIterator = (asyncIterator, predicate) =>
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
|
-
|
|
1483
|
+
const FilteringAsyncIterator = (asyncIterator, predicate) => {
|
|
1484
|
+
const buffer = new LinkedList()
|
|
1485
|
+
|
|
1486
|
+
let index = -1
|
|
1487
|
+
let consumingAsyncIterator = false
|
|
1488
|
+
let isAsyncIteratorDone = false
|
|
1489
|
+
|
|
1490
|
+
return {
|
|
1491
|
+
[symbolAsyncIterator]() {
|
|
1492
|
+
return this
|
|
1493
|
+
},
|
|
1494
|
+
|
|
1495
|
+
// _consumeAsyncIterator() -> Promise<>
|
|
1496
|
+
async _consumeAsyncIterator() {
|
|
1497
|
+
for await (const item of asyncIterator) {
|
|
1498
|
+
index += 1
|
|
1499
|
+
const booleanResult = predicate(item)
|
|
1500
|
+
buffer.append([booleanResult, item])
|
|
1501
|
+
}
|
|
1502
|
+
isAsyncIteratorDone = true
|
|
1503
|
+
},
|
|
1504
|
+
|
|
1505
|
+
|
|
1506
|
+
async next() {
|
|
1507
|
+
if (!consumingAsyncIterator) {
|
|
1508
|
+
this._consumeAsyncIterator()
|
|
1509
|
+
consumingAsyncIterator = true
|
|
1510
|
+
}
|
|
1511
|
+
|
|
1512
|
+
while (!isAsyncIteratorDone) {
|
|
1513
|
+
if (buffer.length > 0) {
|
|
1514
|
+
let [booleanResult, item] = buffer.popFirst()
|
|
1515
|
+
if (isPromise(booleanResult)) {
|
|
1516
|
+
booleanResult = await booleanResult
|
|
1517
|
+
}
|
|
1518
|
+
if (booleanResult) {
|
|
1519
|
+
return { value: item, done: false }
|
|
1520
|
+
}
|
|
1521
|
+
continue
|
|
1497
1522
|
}
|
|
1523
|
+
await sleep(10)
|
|
1498
1524
|
}
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
|
|
1525
|
+
|
|
1526
|
+
while (buffer.length > 0) {
|
|
1527
|
+
let [booleanResult, item] = buffer.popFirst()
|
|
1528
|
+
if (isPromise(booleanResult)) {
|
|
1529
|
+
booleanResult = await booleanResult
|
|
1530
|
+
}
|
|
1531
|
+
if (booleanResult) {
|
|
1532
|
+
return { value: item, done: false }
|
|
1533
|
+
}
|
|
1534
|
+
}
|
|
1535
|
+
|
|
1536
|
+
return { value: undefined, done: true }
|
|
1537
|
+
},
|
|
1538
|
+
|
|
1539
|
+
}
|
|
1540
|
+
}
|
|
1503
1541
|
|
|
1504
1542
|
const arrayExtendMap = function (
|
|
1505
1543
|
array, values, valuesMapper, valuesIndex,
|