rubico 2.1.0 → 2.2.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 +2 -0
- package/_internal/genericTransform.js +30 -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 +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 +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 -46
- package/dist/rubico.es.min.js +2 -2
- package/dist/rubico.global.js +57 -46
- package/dist/rubico.global.min.js +2 -2
- package/dist/rubico.js +57 -46
- package/dist/rubico.min.js +2 -2
- package/dist/rubico.mjs +57 -46
- 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 +32 -2
- package/dist/tap.es.min.js +2 -2
- package/dist/tap.js +32 -2
- package/dist/tap.min.js +2 -2
- package/dist/tap.mjs +32 -2
- 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 +26 -24
- package/dist/transform.es.min.js +2 -2
- package/dist/transform.js +26 -24
- package/dist/transform.min.js +2 -2
- package/dist/transform.mjs +26 -24
- 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 +1 -1
- package/dist/x/filterOut.es.min.js +1 -1
- package/dist/x/filterOut.js +1 -1
- package/dist/x/filterOut.min.js +1 -1
- package/dist/x/filterOut.mjs +1 -1
- 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 +32 -2
- package/dist/x/trace.es.min.js +2 -2
- package/dist/x/trace.js +32 -2
- package/dist/x/trace.min.js +2 -2
- package/dist/x/trace.mjs +32 -2
- 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 +57 -46
- package/index.js +57 -46
- package/package.json +43 -2
- package/tap.js +15 -4
- package/.eslintignore +0 -5
- package/.eslintrc.js +0 -330
- package/.github/workflows/nodejs.yml +0 -27
- package/.vscode/launch.json +0 -25
- package/AggregateReducer.test.js +0 -82
- package/CHANGELOG.md +0 -310
- package/CNAME +0 -1
- package/CODE_OF_CONDUCT.md +0 -128
- package/CONTRIBUTING.md +0 -4
- package/Transducer.test.js +0 -154
- package/_config.yml +0 -1
- package/_internal/improvedGenericTransform.js +0 -93
- package/archive/FlatMappingIterator-2020-09-28.js +0 -68
- package/archive/_Promise-2023-05-29.js +0 -93
- package/archive/arrayMap2-2023-05-29.js +0 -73
- package/archive/benchmarks-v1.9.7/all.js +0 -34
- package/archive/benchmarks-v1.9.7/and.js +0 -24
- package/archive/benchmarks-v1.9.7/any.js +0 -32
- package/archive/benchmarks-v1.9.7/assign.js +0 -174
- package/archive/benchmarks-v1.9.7/curry.js +0 -55
- package/archive/benchmarks-v1.9.7/eq.js +0 -25
- package/archive/benchmarks-v1.9.7/filter.js +0 -1322
- package/archive/benchmarks-v1.9.7/flatMap.js +0 -48
- package/archive/benchmarks-v1.9.7/forEach.js +0 -33
- package/archive/benchmarks-v1.9.7/fork.js +0 -123
- package/archive/benchmarks-v1.9.7/get.js +0 -44
- package/archive/benchmarks-v1.9.7/gt.js +0 -25
- package/archive/benchmarks-v1.9.7/gte.js +0 -25
- package/archive/benchmarks-v1.9.7/integration.js +0 -88
- package/archive/benchmarks-v1.9.7/lt.js +0 -25
- package/archive/benchmarks-v1.9.7/lte.js +0 -25
- package/archive/benchmarks-v1.9.7/map.js +0 -892
- package/archive/benchmarks-v1.9.7/misc.js +0 -470
- package/archive/benchmarks-v1.9.7/omit.js +0 -28
- package/archive/benchmarks-v1.9.7/or.js +0 -51
- package/archive/benchmarks-v1.9.7/pick.js +0 -24
- package/archive/benchmarks-v1.9.7/pipe.js +0 -152
- package/archive/benchmarks-v1.9.7/reduce.js +0 -739
- package/archive/benchmarks-v1.9.7/switchCase.js +0 -256
- package/archive/benchmarks-v1.9.7/tap.js +0 -90
- package/archive/benchmarks-v1.9.7/transform.js +0 -218
- package/archive/benchmarks-v1.9.7/tryCatch.js +0 -108
- package/archive/curry.js +0 -13
- package/archive/examples-v1.6.11/browserModule.html +0 -31
- package/archive/examples-v1.6.11/browserScript.html +0 -32
- package/archive/examples-v1.6.11/coolTransformToConsole.js +0 -1
- package/archive/examples-v1.6.11/denoLargeGasMap.js +0 -85
- package/archive/examples-v1.6.11/denoServer.js +0 -9
- package/archive/examples-v1.6.11/denoServerWithMiddleware.js +0 -55
- package/archive/examples-v1.6.11/logTodosRange.js +0 -21
- package/archive/examples-v1.6.11/makeARequest.html +0 -46
- package/archive/examples-v1.6.11/nodeComplexTransformation.js +0 -106
- package/archive/examples-v1.6.11/nodeConditionallyExtractIDs.js +0 -50
- package/archive/examples-v1.6.11/nodeFloatingPoint.js +0 -55
- package/archive/examples-v1.6.11/nodeGetAllJiraBoards.js +0 -45
- package/archive/examples-v1.6.11/nodeGetSocketIOClientsTotalCount.js +0 -34
- package/archive/examples-v1.6.11/nodeKafkaConsumer.js +0 -63
- package/archive/examples-v1.6.11/nodeMakeMultipleRequests.js +0 -55
- package/archive/examples-v1.6.11/nodeOnRecordAddTask.js +0 -34
- package/archive/examples-v1.6.11/nodePostRequestWithAuth.js +0 -36
- package/archive/examples-v1.6.11/nodeSpeedbackMatchmakingAlgorithm.js +0 -96
- package/archive/examples-v1.6.11/nodeTireData.js +0 -36
- package/archive/examples-v1.6.11/nodeTripleMap.js +0 -85
- package/archive/examples-v1.6.11/squaredOdds.ts +0 -16
- package/archive/examples-v1.6.11/transducerMaxBuyer.js +0 -67
- package/archive/examples-v1.6.11/transformLogTodosRange.js +0 -31
- package/archive/examples-v1.6.11/transformStreamRandomInts.js +0 -19
- package/archive/genericReduceConcurrent.js +0 -277
- package/archive/index.v0.2.9.js +0 -1685
- package/archive/objectValuesGenerator.js +0 -13
- package/archive/test.v0.2.9.js +0 -2334
- package/bench +0 -65
- package/benchmark-output/v1.9.7 +0 -268
- package/benchmarks/all.async.js +0 -43
- package/benchmarks/all.js +0 -43
- package/benchmarks/always.js +0 -15
- package/benchmarks/and.async.js +0 -25
- package/benchmarks/and.js +0 -25
- package/benchmarks/assign.async.js +0 -27
- package/benchmarks/assign.js +0 -27
- package/benchmarks/curry.js +0 -35
- package/benchmarks/eq.async.js +0 -23
- package/benchmarks/eq.js +0 -23
- package/benchmarks/every.async.js +0 -19
- package/benchmarks/every.js +0 -19
- package/benchmarks/filter.async.js +0 -32
- package/benchmarks/filter.js +0 -38
- package/benchmarks/flatMap.async.js +0 -26
- package/benchmarks/flatMap.js +0 -38
- package/benchmarks/get.async.js +0 -19
- package/benchmarks/get.js +0 -39
- package/benchmarks/gt.async.js +0 -23
- package/benchmarks/gt.js +0 -23
- package/benchmarks/gte.async.js +0 -23
- package/benchmarks/gte.js +0 -23
- package/benchmarks/lt.async.js +0 -23
- package/benchmarks/lt.js +0 -23
- package/benchmarks/lte.async.js +0 -23
- package/benchmarks/lte.js +0 -23
- package/benchmarks/map.async.js +0 -43
- package/benchmarks/map.js +0 -40
- package/benchmarks/misc/Promise.js +0 -26
- package/benchmarks/misc/isPromise.js +0 -30
- package/benchmarks/misc/promiseAll.js +0 -36
- package/benchmarks/not.js +0 -23
- package/benchmarks/omit.js +0 -38
- package/benchmarks/or.async.js +0 -25
- package/benchmarks/or.js +0 -25
- package/benchmarks/pick.js +0 -38
- package/benchmarks/pipe.async.js +0 -47
- package/benchmarks/pipe.js +0 -47
- package/benchmarks/reduce.async.js +0 -32
- package/benchmarks/reduce.js +0 -38
- package/benchmarks/set.async.js +0 -19
- package/benchmarks/set.js +0 -41
- package/benchmarks/some.async.js +0 -19
- package/benchmarks/some.js +0 -19
- package/benchmarks/switchCase.async.js +0 -27
- package/benchmarks/switchCase.js +0 -55
- package/benchmarks/tap.js +0 -15
- package/benchmarks/thunkify.js +0 -15
- package/benchmarks/transform.async.js +0 -27
- package/benchmarks/transform.js +0 -40
- package/benchmarks/tryCatch.async.js +0 -25
- package/benchmarks/tryCatch.js +0 -32
- package/build +0 -472
- package/dist-test.js +0 -37
- package/examples/type-to-search-wiki/README.md +0 -19
- package/examples/type-to-search-wiki/package.json +0 -13
- package/examples/type-to-search-wiki/src/app.js +0 -46
- package/examples/type-to-search-wiki/src/index.html +0 -18
- package/import-test.html +0 -73
- package/memory-usage/reduce.js +0 -40
- package/monad/AsyncPool.js +0 -0
- package/monad/BrokenPromise.js +0 -63
- package/monad/BrokenPromise.test.js +0 -22
- package/monad/Cancellable.js +0 -84
- package/monad/Cancellable.memoryUsage.js +0 -60
- package/monad/Cancellable.test.js +0 -20
- package/monad/Function.js +0 -0
- package/monad/Instance.benchmark.js +0 -378
- package/monad/Instance.js +0 -351
- package/monad/Instance.test.js +0 -445
- package/monad/Mux.benchmark.js +0 -29
- package/monad/Mux.js +0 -589
- package/monad/Mux.test.js +0 -512
- package/monad/PossiblePromise.benchmark.js +0 -87
- package/monad/PossiblePromise.js +0 -144
- package/monad/PossiblePromise.test.js +0 -89
- package/monad/README.md +0 -75
- package/monad/Reducer.js +0 -0
- package/monad/Sequence.benchmark.js +0 -42
- package/monad/Sequence.js +0 -36
- package/monad/SpecScript.js +0 -0
- package/monad/Stack.js +0 -0
- package/monad/Struct.benchmark.js +0 -154
- package/monad/Struct.js +0 -249
- package/monad/Struct.test.js +0 -237
- package/rubico.js +0 -66
- package/test.js +0 -4242
- package/tmp.js +0 -1
|
@@ -1,892 +0,0 @@
|
|
|
1
|
-
const timeInLoop = require('../x/timeInLoop')
|
|
2
|
-
const { map } = require('..')
|
|
3
|
-
const R = require('ramda')
|
|
4
|
-
const _ = require('lodash')
|
|
5
|
-
|
|
6
|
-
const symbolIterator = Symbol.iterator
|
|
7
|
-
|
|
8
|
-
const symbolAsyncIterator = Symbol.asyncIterator
|
|
9
|
-
|
|
10
|
-
const objectKeys = Object.keys
|
|
11
|
-
|
|
12
|
-
const promiseAll = Promise.all.bind(Promise)
|
|
13
|
-
|
|
14
|
-
const promiseRace = Promise.race.bind(Promise)
|
|
15
|
-
|
|
16
|
-
const isPromise = value => value != null && typeof value.then == 'function'
|
|
17
|
-
|
|
18
|
-
const asyncIteratorToArray = async asyncIter => {
|
|
19
|
-
const result = []
|
|
20
|
-
for await (const item of asyncIter) result.push(item)
|
|
21
|
-
return result
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
const arrayMap1 = function (array, func) {
|
|
26
|
-
let isAsync = false
|
|
27
|
-
const output = array.map(function arrayMapper(item) {
|
|
28
|
-
const outputItem = func(item)
|
|
29
|
-
if (isPromise(outputItem)) isAsync = true
|
|
30
|
-
return item
|
|
31
|
-
})
|
|
32
|
-
return isAsync ? promiseAll(output) : output
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
const arrayMap2 = function (array, func) {
|
|
36
|
-
const arrayLength = array.length, output = []
|
|
37
|
-
let index = -1, isAsync = false
|
|
38
|
-
while (++index < arrayLength) {
|
|
39
|
-
const outputItem = func(array[index])
|
|
40
|
-
if (isPromise(outputItem)) isAsync = true
|
|
41
|
-
output[index] = outputItem
|
|
42
|
-
}
|
|
43
|
-
return isAsync ? promiseAll(output) : output
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
const arrayMap20 = function (array, func) {
|
|
47
|
-
const arrayLength = array.length, output = []
|
|
48
|
-
let index = -1, isAsync = false
|
|
49
|
-
while (++index < arrayLength) {
|
|
50
|
-
const outputItem = func(array[index])
|
|
51
|
-
if (isPromise(outputItem)) isAsync = true
|
|
52
|
-
output.push(outputItem)
|
|
53
|
-
}
|
|
54
|
-
return isAsync ? promiseAll(output) : output
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
const arrayMap3 = function (array, func) {
|
|
58
|
-
const arrayLength = array.length,
|
|
59
|
-
output = Array(arrayLength)
|
|
60
|
-
let index = -1, isAsync = false
|
|
61
|
-
while (++index < arrayLength) {
|
|
62
|
-
const outputItem = func(array[index])
|
|
63
|
-
if (isPromise(outputItem)) isAsync = true
|
|
64
|
-
output[index] = outputItem
|
|
65
|
-
}
|
|
66
|
-
return isAsync ? promiseAll(output) : output
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* @name arrayMap
|
|
71
|
-
*
|
|
72
|
-
* @benchmark
|
|
73
|
-
* vanilla1: 1e+6: 44.19ms
|
|
74
|
-
* arrayMap1: 1e+6: 46.194ms
|
|
75
|
-
* arrayMap2: 1e+6: 65.156ms
|
|
76
|
-
* arrayMap20: 1e+6: 62.963ms
|
|
77
|
-
* arrayMap3: 1e+6: 29.981ms
|
|
78
|
-
*
|
|
79
|
-
* arrayMap1_forOf: 1e+6: 19.514ms
|
|
80
|
-
* arrayMap2_forOf: 1e+6: 19.406ms
|
|
81
|
-
* arrayMap3_forOf: 1e+6: 20.483ms
|
|
82
|
-
*
|
|
83
|
-
* arrayMap1_forLoop: 1e+6: 9.992ms
|
|
84
|
-
* arrayMap2_forLoop: 1e+6: 9.958ms
|
|
85
|
-
* arrayMap3_forLoop: 1e+6: 9.929ms
|
|
86
|
-
*
|
|
87
|
-
* RMap: 1e+6: 217.641ms
|
|
88
|
-
* _Map: 1e+6: 32.702ms
|
|
89
|
-
*
|
|
90
|
-
* @NOTE Bo5
|
|
91
|
-
*
|
|
92
|
-
* @NOTE https://reinteractive.net/posts/292-the-quirky-array-constructor-and-a-use-for-holey-arrays-in-es6
|
|
93
|
-
*
|
|
94
|
-
* @NOTE https://v8.dev/blog/elements-kinds#avoid-creating-holes
|
|
95
|
-
*/
|
|
96
|
-
|
|
97
|
-
{
|
|
98
|
-
const array = [1, 2, 3, 4, 5]
|
|
99
|
-
|
|
100
|
-
const identity = value => value
|
|
101
|
-
|
|
102
|
-
const array1 = arrayMap1(array, identity)
|
|
103
|
-
|
|
104
|
-
const array2 = arrayMap2(array, identity)
|
|
105
|
-
|
|
106
|
-
const array3 = arrayMap3(array, identity)
|
|
107
|
-
|
|
108
|
-
const vanilla1 = (arr, func) => arr.map(func)
|
|
109
|
-
|
|
110
|
-
const RMap = R.map
|
|
111
|
-
|
|
112
|
-
const _Map = _.map
|
|
113
|
-
|
|
114
|
-
// timeInLoop('vanilla1', 1e6, () => vanilla1(array, identity))
|
|
115
|
-
|
|
116
|
-
// timeInLoop('arrayMap1', 1e6, () => arrayMap1(array, identity))
|
|
117
|
-
|
|
118
|
-
// timeInLoop('arrayMap2', 1e6, () => arrayMap2(array, identity))
|
|
119
|
-
|
|
120
|
-
// timeInLoop('arrayMap20', 1e6, () => arrayMap20(array, identity))
|
|
121
|
-
|
|
122
|
-
// timeInLoop('arrayMap3', 1e6, () => arrayMap3(array, identity))
|
|
123
|
-
|
|
124
|
-
// timeInLoop('arrayMap4', 1e6, () => arrayMap4(array, identity))
|
|
125
|
-
|
|
126
|
-
// timeInLoop('arrayMap1_forOf', 1e6, () => { for (const item of array1) identity(item) })
|
|
127
|
-
|
|
128
|
-
// timeInLoop('arrayMap2_forOf', 1e6, () => { for (const item of array2) identity(item) })
|
|
129
|
-
|
|
130
|
-
// timeInLoop('arrayMap3_forOf', 1e6, () => { for (const item of array3) identity(item) })
|
|
131
|
-
|
|
132
|
-
// timeInLoop('arrayMap1_forLoop', 1e6, () => { for (let i = 0; i < array1.length; i++) identity(array1[i]) })
|
|
133
|
-
|
|
134
|
-
// timeInLoop('arrayMap2_forLoop', 1e6, () => { for (let i = 0; i < array2.length; i++) identity(array2[i]) })
|
|
135
|
-
|
|
136
|
-
// timeInLoop('arrayMap3_forLoop', 1e6, () => { for (let i = 0; i < array3.length; i++) identity(array3[i]) })
|
|
137
|
-
|
|
138
|
-
// timeInLoop('RMap', 1e6, () => RMap(array, identity))
|
|
139
|
-
|
|
140
|
-
// timeInLoop('_Map', 1e6, () => _Map(array, identity))
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
const promiseAll1 = Promise.all.bind(Promise)
|
|
144
|
-
|
|
145
|
-
const promiseAll2 = array => new Promise(function (resolve) {
|
|
146
|
-
const arrayLength = array.length,
|
|
147
|
-
output = Array(arrayLength)
|
|
148
|
-
let index = -1,
|
|
149
|
-
numPromises = 0
|
|
150
|
-
while (++index < arrayLength) {
|
|
151
|
-
const value = array[index]
|
|
152
|
-
if (isPromise(value)) {
|
|
153
|
-
numPromises += 1
|
|
154
|
-
value.then((index => function(res) {
|
|
155
|
-
output[index] = res
|
|
156
|
-
numPromises -= 1
|
|
157
|
-
if (numPromises == 0) resolve(output)
|
|
158
|
-
})(index))
|
|
159
|
-
} else {
|
|
160
|
-
output[index] = value
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
if (numPromises == 0) resolve(object)
|
|
164
|
-
})
|
|
165
|
-
|
|
166
|
-
{
|
|
167
|
-
/**
|
|
168
|
-
* @name promiseAll
|
|
169
|
-
*
|
|
170
|
-
* @benchmark
|
|
171
|
-
* promiseAll1: promiseArray: 1e+5: 89.714ms
|
|
172
|
-
* promiseAll2: promiseArray: 1e+5: 92.055ms
|
|
173
|
-
*/
|
|
174
|
-
|
|
175
|
-
const normalArray = [1, 2, 3, 4, 5]
|
|
176
|
-
|
|
177
|
-
const promiseArray = [
|
|
178
|
-
Promise.resolve(1),
|
|
179
|
-
Promise.resolve(2),
|
|
180
|
-
Promise.resolve(3),
|
|
181
|
-
Promise.resolve(4),
|
|
182
|
-
Promise.resolve(5),
|
|
183
|
-
]
|
|
184
|
-
|
|
185
|
-
// promiseAll1(promiseArray).then(res => console.log('promiseAll1', res))
|
|
186
|
-
// promiseAll2(promiseArray).then(res => console.log('promiseAll2', res))
|
|
187
|
-
|
|
188
|
-
// timeInLoop.async('promiseAll1: promiseArray', 1e5, () => promiseAll1(promiseArray))
|
|
189
|
-
|
|
190
|
-
// timeInLoop.async('promiseAll2: promiseArray', 1e5, () => promiseAll2(promiseArray))
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
const promiseObjectAll1 = object => new Promise(function (resolve) {
|
|
194
|
-
const output = {}, promises = new Map()
|
|
195
|
-
for (const key in object) {
|
|
196
|
-
const value = object[key]
|
|
197
|
-
if (isPromise(value)) {
|
|
198
|
-
const promise = value.then((key => function (res) {
|
|
199
|
-
output[key] = res
|
|
200
|
-
promises.delete(key)
|
|
201
|
-
if (promises.size == 0) resolve(output)
|
|
202
|
-
})(key))
|
|
203
|
-
promises.set(key, promise)
|
|
204
|
-
} else {
|
|
205
|
-
output[key] = value
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
if (promises.size == 0) resolve(output)
|
|
209
|
-
})
|
|
210
|
-
|
|
211
|
-
const promiseObjectAll2 = object => new Promise(function (resolve) {
|
|
212
|
-
const output = {}
|
|
213
|
-
let numPromises = 0
|
|
214
|
-
for (const key in object) {
|
|
215
|
-
const value = object[key]
|
|
216
|
-
if (isPromise(value)) {
|
|
217
|
-
numPromises += 1
|
|
218
|
-
value.then((key => function (res) {
|
|
219
|
-
output[key] = res
|
|
220
|
-
numPromises -= 1
|
|
221
|
-
if (numPromises == 0) resolve(output)
|
|
222
|
-
})(key))
|
|
223
|
-
} else {
|
|
224
|
-
output[key] = value
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
if (numPromises == 0) resolve(output)
|
|
228
|
-
})
|
|
229
|
-
|
|
230
|
-
const promiseObjectAll3 = object => new Promise(function (resolve) {
|
|
231
|
-
const output = {}, keys = objectKeys(object)
|
|
232
|
-
let numPromises = 0
|
|
233
|
-
for (const key of keys) {
|
|
234
|
-
const value = object[key]
|
|
235
|
-
if (isPromise(value)) {
|
|
236
|
-
numPromises += 1
|
|
237
|
-
value.then((key => function (res) {
|
|
238
|
-
output[key] = res
|
|
239
|
-
numPromises -= 1
|
|
240
|
-
if (numPromises == 0) resolve(output)
|
|
241
|
-
})(key))
|
|
242
|
-
} else {
|
|
243
|
-
output[key] = value
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
if (numPromises == 0) resolve(output)
|
|
247
|
-
})
|
|
248
|
-
|
|
249
|
-
{
|
|
250
|
-
/**
|
|
251
|
-
* @name promiseObjectAll
|
|
252
|
-
*
|
|
253
|
-
* @benchmark
|
|
254
|
-
* promiseObjectAll1: promiseObject: 1e+5: 189.951ms
|
|
255
|
-
* promiseObjectAll2: promiseObject: 1e+5: 102.514ms
|
|
256
|
-
* promiseObjectAll3: promiseObject: 1e+5: 110.166ms
|
|
257
|
-
* promiseObjectAll1: normalObject: 1e+5: 68.371ms
|
|
258
|
-
* promiseObjectAll2: normalObject: 1e+5: 59.979ms
|
|
259
|
-
* promiseObjectAll3: normalObject: 1e+5: 66.123ms
|
|
260
|
-
*/
|
|
261
|
-
|
|
262
|
-
const normalObject = { a: 1, b: 2, c: 3, d: 4, e: 5 }
|
|
263
|
-
|
|
264
|
-
const promiseObject = {
|
|
265
|
-
a: Promise.resolve(1),
|
|
266
|
-
b: Promise.resolve(2),
|
|
267
|
-
c: Promise.resolve(3),
|
|
268
|
-
d: Promise.resolve(4),
|
|
269
|
-
e: Promise.resolve(5),
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
// promiseObjectAll1(normalObject).then(res => console.log('normal', res))
|
|
273
|
-
// promiseObjectAll1(promiseObject).then(res => console.log('promise', res))
|
|
274
|
-
// promiseObjectAll2(normalObject).then(res => console.log('normal', res))
|
|
275
|
-
// promiseObjectAll2(promiseObject).then(res => console.log('promise', res))
|
|
276
|
-
// promiseObjectAll3(normalObject).then(res => console.log('normal', res))
|
|
277
|
-
// promiseObjectAll3(promiseObject).then(res => console.log('promise', res))
|
|
278
|
-
|
|
279
|
-
// timeInLoop.async('promiseObjectAll1: promiseObject', 1e5, () => promiseObjectAll1(promiseObject))
|
|
280
|
-
|
|
281
|
-
// timeInLoop.async('promiseObjectAll2: promiseObject', 1e5, () => promiseObjectAll2(promiseObject))
|
|
282
|
-
|
|
283
|
-
// timeInLoop.async('promiseObjectAll3: promiseObject', 1e5, () => promiseObjectAll3(promiseObject))
|
|
284
|
-
|
|
285
|
-
// timeInLoop.async('promiseObjectAll1: normalObject', 1e5, () => promiseObjectAll1(normalObject))
|
|
286
|
-
|
|
287
|
-
// timeInLoop.async('promiseObjectAll2: normalObject', 1e5, () => promiseObjectAll2(normalObject))
|
|
288
|
-
|
|
289
|
-
// timeInLoop.async('promiseObjectAll3: normalObject', 1e5, () => promiseObjectAll3(normalObject))
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
const objectMap1 = function (object, mapperFunc) {
|
|
293
|
-
const output = {}, promises = []
|
|
294
|
-
for (const key in object) {
|
|
295
|
-
const outputItem = mapperFunc(object[key])
|
|
296
|
-
if (isPromise(outputItem)) {
|
|
297
|
-
promises.push(outputItem.then(res => (output[key] = res)))
|
|
298
|
-
} else {
|
|
299
|
-
output[key] = outputItem
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
return promises.length > 0 ? promiseAll(promises).then(() => output) : output
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
const promiseObjectAll = promiseObjectAll2
|
|
306
|
-
|
|
307
|
-
const objectMap2 = function (object, mapperFunc) {
|
|
308
|
-
const output = {}
|
|
309
|
-
let isAsync = false
|
|
310
|
-
for (const key in object) {
|
|
311
|
-
const outputItem = mapperFunc(object[key])
|
|
312
|
-
if (isPromise(outputItem)) isAsync = true
|
|
313
|
-
output[key] = outputItem
|
|
314
|
-
}
|
|
315
|
-
return isAsync ? promiseObjectAll(output) : output
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
const objectMap3 = function (object, mapperFunc) {
|
|
319
|
-
const output = {}
|
|
320
|
-
let isAsync = false
|
|
321
|
-
for (const key of objectKeys(object)) {
|
|
322
|
-
const outputItem = mapperFunc(object[key])
|
|
323
|
-
if (isPromise(outputItem)) isAsync = true
|
|
324
|
-
output[key] = outputItem
|
|
325
|
-
}
|
|
326
|
-
return isAsync ? promiseObjectAll(output) : output
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
/**
|
|
330
|
-
* @name objectMap
|
|
331
|
-
*
|
|
332
|
-
* @benchmark
|
|
333
|
-
* objectMap1: 1e+6: 286.133ms
|
|
334
|
-
* objectMap2: 1e+6: 184.431ms
|
|
335
|
-
* objectMap3: 1e+6: 273.79ms
|
|
336
|
-
*
|
|
337
|
-
* @remarks
|
|
338
|
-
* The stark differential between objectMap1 and objectMap2 is surprising. In neither case are the asynchronous blocks hit. Perhaps it's the additional scope introduced from the .then handler of objectMap1.
|
|
339
|
-
*/
|
|
340
|
-
|
|
341
|
-
{
|
|
342
|
-
const identity = value => value
|
|
343
|
-
|
|
344
|
-
const object = { a: 1, b: 2, c: 3, d: 4, e: 5 }
|
|
345
|
-
|
|
346
|
-
// console.log(objectMap1(object, identity))
|
|
347
|
-
// console.log(objectMap2(object, identity))
|
|
348
|
-
// console.log(objectMap3(object, identity))
|
|
349
|
-
|
|
350
|
-
// timeInLoop('objectMap1', 1e6, () => objectMap1(object, identity))
|
|
351
|
-
|
|
352
|
-
// timeInLoop('objectMap2', 1e6, () => objectMap2(object, identity))
|
|
353
|
-
|
|
354
|
-
// timeInLoop('objectMap3', 1e6, () => objectMap3(object, identity))
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
const generatorFunctionMap1 = function (generatorFunc, func) {
|
|
358
|
-
return function* mappingGeneratorFunc(...args) {
|
|
359
|
-
for (const item of generatorFunc(...args)) {
|
|
360
|
-
yield func(item)
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
const generatorFunctionMap10 = function (generatorFunc, func) {
|
|
366
|
-
return function* mappingGeneratorFunc() {
|
|
367
|
-
for (const item of generatorFunc.apply(null, arguments)) {
|
|
368
|
-
yield func(item)
|
|
369
|
-
}
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
const generatorFunctionMap11 = function (generatorFunc, func) {
|
|
374
|
-
return function* mappingGeneratorFunc(...args) {
|
|
375
|
-
for (const item of generatorFunc.apply(null, args)) {
|
|
376
|
-
yield func(item)
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
const generatorFunctionMap12 = function (generatorFunc, func) {
|
|
382
|
-
return function* mappingGeneratorFunc(...args) {
|
|
383
|
-
for (const item of generatorFunc.call(null, ...args)) {
|
|
384
|
-
yield func(item)
|
|
385
|
-
}
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
/**
|
|
390
|
-
* @name generatorFunctionMap
|
|
391
|
-
*
|
|
392
|
-
* @benchmark
|
|
393
|
-
* [...squareNumbers1()]: 1e+5: 120.221ms
|
|
394
|
-
* [...squareNumbers10()]: 1e+5: 120.26ms
|
|
395
|
-
* [...squareNumbers11()]: 1e+5: 120.734ms
|
|
396
|
-
* [...squareNumbers12()]: 1e+5: 122.146ms
|
|
397
|
-
*/
|
|
398
|
-
|
|
399
|
-
{
|
|
400
|
-
const numbers = function* () {
|
|
401
|
-
yield 1; yield 2; yield 3; yield 4; yield 5
|
|
402
|
-
}
|
|
403
|
-
|
|
404
|
-
const square = number => number ** 2
|
|
405
|
-
|
|
406
|
-
const squareNumbers1 = generatorFunctionMap1(numbers, square)
|
|
407
|
-
const squareNumbers10 = generatorFunctionMap10(numbers, square)
|
|
408
|
-
const squareNumbers11 = generatorFunctionMap11(numbers, square)
|
|
409
|
-
const squareNumbers12 = generatorFunctionMap12(numbers, square)
|
|
410
|
-
|
|
411
|
-
// timeInLoop('[...squareNumbers1()]', 1e5, () => [...squareNumbers1()])
|
|
412
|
-
|
|
413
|
-
// timeInLoop('[...squareNumbers10()]', 1e5, () => [...squareNumbers10()])
|
|
414
|
-
|
|
415
|
-
// timeInLoop('[...squareNumbers11()]', 1e5, () => [...squareNumbers11()])
|
|
416
|
-
|
|
417
|
-
// timeInLoop('[...squareNumbers12()]', 1e5, () => [...squareNumbers12()])
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
const iteratorMap1 = function* (iter, func) {
|
|
421
|
-
for (const item of iter) {
|
|
422
|
-
yield func(item)
|
|
423
|
-
}
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
const iteratorMap2 = function (iter, func) {
|
|
427
|
-
const iterNext = iter.next.bind(iter)
|
|
428
|
-
const mappingIter = {
|
|
429
|
-
[symbolIterator]() {
|
|
430
|
-
return mappingIter
|
|
431
|
-
},
|
|
432
|
-
next() {
|
|
433
|
-
const { value, done } = iterNext()
|
|
434
|
-
return done ? { value, done } : { value: func(value), done }
|
|
435
|
-
},
|
|
436
|
-
}
|
|
437
|
-
return mappingIter
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
const iteratorMap21 = function (iter, func) {
|
|
441
|
-
const mappingIter = {
|
|
442
|
-
[symbolIterator]() {
|
|
443
|
-
return mappingIter
|
|
444
|
-
},
|
|
445
|
-
next() {
|
|
446
|
-
const { value, done } = iter.next()
|
|
447
|
-
return done ? { value, done } : { value: func(value), done }
|
|
448
|
-
},
|
|
449
|
-
}
|
|
450
|
-
return mappingIter
|
|
451
|
-
}
|
|
452
|
-
|
|
453
|
-
const iteratorMap3 = function (iter, func) {
|
|
454
|
-
const iterNext = iter.next.bind(iter)
|
|
455
|
-
const mappingIter = {
|
|
456
|
-
[symbolIterator]: () => mappingIter,
|
|
457
|
-
next: function () {
|
|
458
|
-
const { value, done } = iterNext()
|
|
459
|
-
return done ? { value, done } : { value: func(value), done }
|
|
460
|
-
},
|
|
461
|
-
}
|
|
462
|
-
return mappingIter
|
|
463
|
-
}
|
|
464
|
-
|
|
465
|
-
const iteratorMap31 = function (iter, func) {
|
|
466
|
-
const mappingIter = {
|
|
467
|
-
[symbolIterator]: () => mappingIter,
|
|
468
|
-
next: function () {
|
|
469
|
-
const { value, done } = iter.next()
|
|
470
|
-
return done ? { value, done } : { value: func(value), done }
|
|
471
|
-
},
|
|
472
|
-
}
|
|
473
|
-
return mappingIter
|
|
474
|
-
}
|
|
475
|
-
|
|
476
|
-
const MappingIterator = function (iter, mappingFunc) {
|
|
477
|
-
this.iter = iter
|
|
478
|
-
this.mappingFunc = mappingFunc
|
|
479
|
-
}
|
|
480
|
-
|
|
481
|
-
MappingIterator.prototype[symbolIterator] = function mappingValues() {
|
|
482
|
-
return this
|
|
483
|
-
}
|
|
484
|
-
|
|
485
|
-
MappingIterator.prototype.next = function next() {
|
|
486
|
-
const { value, done } = this.iter.next()
|
|
487
|
-
return done ? { value, done } : { value: this.mappingFunc(value), done }
|
|
488
|
-
}
|
|
489
|
-
|
|
490
|
-
const iteratorMap5 = (iter, func) => new MappingIterator1(iter, func)
|
|
491
|
-
|
|
492
|
-
/**
|
|
493
|
-
* @name iteratorMap
|
|
494
|
-
*
|
|
495
|
-
* @benchmark
|
|
496
|
-
* iteratorMap1: 1e+5: 111.57ms
|
|
497
|
-
* iteratorMap2: 1e+5: 105.097ms
|
|
498
|
-
* iteratorMap21: 1e+5: 99.13ms
|
|
499
|
-
* iteratorMap3: 1e+5: 103.8ms
|
|
500
|
-
* iteratorMap31: 1e+5: 98.715ms
|
|
501
|
-
* iteratorMap5: 1e+5: 89.505ms
|
|
502
|
-
*/
|
|
503
|
-
|
|
504
|
-
{
|
|
505
|
-
const square = number => number ** 2
|
|
506
|
-
|
|
507
|
-
const numbers = function* () {
|
|
508
|
-
yield 1; yield 2; yield 3; yield 4; yield 5
|
|
509
|
-
}
|
|
510
|
-
|
|
511
|
-
// console.log([...numbers()])
|
|
512
|
-
// console.log([...iteratorMap1(numbers(), square)])
|
|
513
|
-
// console.log([...iteratorMap2(numbers(), square)])
|
|
514
|
-
// console.log([...iteratorMap21(numbers(), square)])
|
|
515
|
-
// console.log([...iteratorMap5(numbers(), square)])
|
|
516
|
-
|
|
517
|
-
// timeInLoop('iteratorMap1', 1e5, () => [...iteratorMap1(numbers(), square)])
|
|
518
|
-
|
|
519
|
-
// timeInLoop('iteratorMap2', 1e5, () => [...iteratorMap2(numbers(), square)])
|
|
520
|
-
|
|
521
|
-
// timeInLoop('iteratorMap21', 1e5, () => [...iteratorMap21(numbers(), square)])
|
|
522
|
-
|
|
523
|
-
// timeInLoop('iteratorMap3', 1e5, () => [...iteratorMap3(numbers(), square)])
|
|
524
|
-
|
|
525
|
-
// timeInLoop('iteratorMap31', 1e5, () => [...iteratorMap31(numbers(), square)])
|
|
526
|
-
|
|
527
|
-
// timeInLoop('iteratorMap5', 1e5, () => [...iteratorMap5(numbers(), square)])
|
|
528
|
-
}
|
|
529
|
-
|
|
530
|
-
const asyncGeneratorFunctionMap1 = function (asyncGeneratorFunc, func) {
|
|
531
|
-
return async function* mappingAsyncGeneratorFunc(...args) {
|
|
532
|
-
for await (const item of asyncGeneratorFunc(...args)) {
|
|
533
|
-
yield func(item)
|
|
534
|
-
}
|
|
535
|
-
}
|
|
536
|
-
}
|
|
537
|
-
|
|
538
|
-
/**
|
|
539
|
-
* @name asyncGeneratorFunctionMap
|
|
540
|
-
*
|
|
541
|
-
* @benchmark
|
|
542
|
-
* asyncGeneratorFunctionMap1: 1e+5: 431.501ms
|
|
543
|
-
*/
|
|
544
|
-
|
|
545
|
-
{
|
|
546
|
-
const asyncNumbers = async function*() {
|
|
547
|
-
for (let i = 1; i <= 5; i++) yield i
|
|
548
|
-
}
|
|
549
|
-
|
|
550
|
-
const square = number => number ** 2
|
|
551
|
-
|
|
552
|
-
const squares = asyncGeneratorFunctionMap1(asyncNumbers, square)
|
|
553
|
-
|
|
554
|
-
// asyncIteratorToArray(squares()).then(console.log)
|
|
555
|
-
|
|
556
|
-
// timeInLoop.async('asyncGeneratorFunctionMap1', 1e5, () => asyncIteratorToArray(squares()))
|
|
557
|
-
}
|
|
558
|
-
|
|
559
|
-
const asyncIteratorMap1 = async function* (asyncIter, func) {
|
|
560
|
-
for await (const item of asyncIter) {
|
|
561
|
-
yield func(item)
|
|
562
|
-
}
|
|
563
|
-
}
|
|
564
|
-
|
|
565
|
-
const asyncIteratorMap2 = (asyncIter, func) => ({
|
|
566
|
-
[symbolAsyncIterator]() {
|
|
567
|
-
const asyncIterNext = asyncIter.next.bind(asyncIter)
|
|
568
|
-
return {
|
|
569
|
-
async next() {
|
|
570
|
-
const { value, done } = await asyncIterNext()
|
|
571
|
-
return done ? { value, done } : { value: await func(value), done }
|
|
572
|
-
}
|
|
573
|
-
}
|
|
574
|
-
}
|
|
575
|
-
})
|
|
576
|
-
|
|
577
|
-
const MappingAsyncIterator = function (asyncIter, mappingFunc) {
|
|
578
|
-
this.asyncIter = asyncIter
|
|
579
|
-
this.mappingFunc = mappingFunc
|
|
580
|
-
}
|
|
581
|
-
|
|
582
|
-
MappingAsyncIterator.prototype[symbolAsyncIterator] = function mappingValues() {
|
|
583
|
-
return this
|
|
584
|
-
}
|
|
585
|
-
|
|
586
|
-
MappingAsyncIterator.prototype.next = async function next() {
|
|
587
|
-
const { value, done } = await this.asyncIter.next()
|
|
588
|
-
return done ? { value, done } : { value: await this.mappingFunc(value), done }
|
|
589
|
-
}
|
|
590
|
-
|
|
591
|
-
const asyncIteratorMap3 = (asyncIter, mappingFunc) => new MappingAsyncIterator(asyncIter, mappingFunc)
|
|
592
|
-
|
|
593
|
-
const MappingAsyncIterator2 = function (asyncIter, mappingFunc) {
|
|
594
|
-
this.asyncIter = asyncIter
|
|
595
|
-
this.mappingFunc = mappingFunc
|
|
596
|
-
}
|
|
597
|
-
|
|
598
|
-
MappingAsyncIterator2.prototype[symbolAsyncIterator] = function mappingValues() {
|
|
599
|
-
return this
|
|
600
|
-
}
|
|
601
|
-
|
|
602
|
-
MappingAsyncIterator2.prototype.next = async function next() {
|
|
603
|
-
const { value, done } = await this.asyncIter.next()
|
|
604
|
-
if (done) return { value: undefined, done: true }
|
|
605
|
-
const resultItem = this.mappingFunc(value)
|
|
606
|
-
return isPromise(resultItem)
|
|
607
|
-
? resultItem.then(res => ({ value: res, done: false }))
|
|
608
|
-
: ({ value: resultItem, done: false })
|
|
609
|
-
}
|
|
610
|
-
|
|
611
|
-
const asyncIteratorMap31 = (asyncIter, mappingFunc) => new MappingAsyncIterator2(asyncIter, mappingFunc)
|
|
612
|
-
|
|
613
|
-
/**
|
|
614
|
-
* @name asyncIteratorMap
|
|
615
|
-
*
|
|
616
|
-
* @benchmark
|
|
617
|
-
* asyncIteratorMap1: 1e+5: 411.392ms
|
|
618
|
-
* asyncIteratorMap2: 1e+5: 422.184ms
|
|
619
|
-
* asyncIteratorMap3: 1e+5: 385.01ms
|
|
620
|
-
* asyncIteratorMap31: 1e+5: 332.436ms
|
|
621
|
-
*/
|
|
622
|
-
|
|
623
|
-
{
|
|
624
|
-
const asyncNumbers = async function*() {
|
|
625
|
-
for (let i = 1; i <= 5; i++) yield i
|
|
626
|
-
}
|
|
627
|
-
|
|
628
|
-
const square = number => number ** 2
|
|
629
|
-
|
|
630
|
-
// timeInLoop.async('asyncIteratorMap1', 1e5, () => asyncIteratorToArray(asyncIteratorMap1(asyncNumbers(), square)))
|
|
631
|
-
|
|
632
|
-
// timeInLoop.async('asyncIteratorMap2', 1e5, () => asyncIteratorToArray(asyncIteratorMap2(asyncNumbers(), square)))
|
|
633
|
-
|
|
634
|
-
// timeInLoop.async('asyncIteratorMap3', 1e5, () => asyncIteratorToArray(asyncIteratorMap3(asyncNumbers(), square)))
|
|
635
|
-
|
|
636
|
-
// timeInLoop.async('asyncIteratorMap31', 1e5, () => asyncIteratorToArray(asyncIteratorMap31(asyncNumbers(), square)))
|
|
637
|
-
}
|
|
638
|
-
|
|
639
|
-
const reducerMap1 = (reducer, func) => function mappingReducer(accum, value) {
|
|
640
|
-
const resultItem = func(value)
|
|
641
|
-
return isPromise(resultItem)
|
|
642
|
-
? resultItem.then(res => reducer(accum, res))
|
|
643
|
-
: reducer(accum, resultItem)
|
|
644
|
-
}
|
|
645
|
-
|
|
646
|
-
const reducerMap10 = (reducer, func) => function mappingReducer(accum, value) {
|
|
647
|
-
const resultItem = func.call(null, value)
|
|
648
|
-
return isPromise(resultItem)
|
|
649
|
-
? resultItem.then(res => reducer.call(null, accum, res))
|
|
650
|
-
: reducer(accum, resultItem)
|
|
651
|
-
}
|
|
652
|
-
|
|
653
|
-
/**
|
|
654
|
-
* @name reducerMap
|
|
655
|
-
*
|
|
656
|
-
* @benchmark
|
|
657
|
-
* reducerMap1: 1e+5: 162.672ms
|
|
658
|
-
* reducerMap10: 1e+5: 176.32ms
|
|
659
|
-
*/
|
|
660
|
-
|
|
661
|
-
{
|
|
662
|
-
const numbers = [1, 2, 3, 4, 5]
|
|
663
|
-
|
|
664
|
-
const square = number => number ** 2
|
|
665
|
-
|
|
666
|
-
const arrayConcat = (arrA, arrB) => arrA.concat(arrB)
|
|
667
|
-
|
|
668
|
-
// timeInLoop('reducerMap1', 1e5, () => numbers.reduce(reducerMap1(arrayConcat, square), []))
|
|
669
|
-
|
|
670
|
-
// timeInLoop('reducerMap10', 1e5, () => numbers.reduce(reducerMap10(arrayConcat, square), []))
|
|
671
|
-
}
|
|
672
|
-
|
|
673
|
-
const possiblePromiseThen = (value, func) => (
|
|
674
|
-
isPromise(value) ? value.then(func) : func(value))
|
|
675
|
-
|
|
676
|
-
/**
|
|
677
|
-
* @name arrayMapSeries
|
|
678
|
-
*
|
|
679
|
-
* @benchmark
|
|
680
|
-
* arrayMapSeries1: 1e+5: 173.068ms
|
|
681
|
-
* arrayMapSeries2: 1e+5: 12.713ms
|
|
682
|
-
*/
|
|
683
|
-
|
|
684
|
-
const arrayMapSeries1 = (f, x, i, y) => {
|
|
685
|
-
if (i === x.length) return y
|
|
686
|
-
return possiblePromiseThen(
|
|
687
|
-
f(x[i]),
|
|
688
|
-
res => arrayMapSeries1(f, x, i + 1, y.concat(res)),
|
|
689
|
-
)
|
|
690
|
-
}
|
|
691
|
-
|
|
692
|
-
const asyncArrayMapSeries = async function (array, func, result, index) {
|
|
693
|
-
const arrayLength = array.length
|
|
694
|
-
while (++index < arrayLength) {
|
|
695
|
-
result[index] = await func(array[index])
|
|
696
|
-
}
|
|
697
|
-
return result
|
|
698
|
-
}
|
|
699
|
-
|
|
700
|
-
const arrayMapSeries2 = function (array, func) {
|
|
701
|
-
const arrayLength = array.length,
|
|
702
|
-
result = Array(arrayLength)
|
|
703
|
-
let index = -1
|
|
704
|
-
while (++index < arrayLength) {
|
|
705
|
-
const resultItem = func(array[index])
|
|
706
|
-
if (isPromise(resultItem)) {
|
|
707
|
-
return resultItem.then(res => {
|
|
708
|
-
result[index] = res
|
|
709
|
-
return asyncArrayMapSeries(array, func, result, index)
|
|
710
|
-
})
|
|
711
|
-
}
|
|
712
|
-
result[index] = resultItem
|
|
713
|
-
}
|
|
714
|
-
return result
|
|
715
|
-
}
|
|
716
|
-
|
|
717
|
-
{
|
|
718
|
-
const numbers = [1, 2, 3, 4, 5]
|
|
719
|
-
|
|
720
|
-
const square = number => number ** 2
|
|
721
|
-
|
|
722
|
-
// console.log(arrayMapSeries1(square, numbers, 0, []))
|
|
723
|
-
// console.log(arrayMapSeries2(numbers, square))
|
|
724
|
-
|
|
725
|
-
// timeInLoop('arrayMapSeries1', 1e5, () => arrayMapSeries1(square, numbers, 0, []))
|
|
726
|
-
|
|
727
|
-
// timeInLoop('arrayMapSeries2', 1e5, () => arrayMapSeries2(numbers, square))
|
|
728
|
-
}
|
|
729
|
-
|
|
730
|
-
/**
|
|
731
|
-
* @name arrayMapPool
|
|
732
|
-
*
|
|
733
|
-
* @benchmark
|
|
734
|
-
* arrayMapPool1: 1e+5: 342.172ms
|
|
735
|
-
* arrayMapPool2: 1e+5: 359.173ms
|
|
736
|
-
*/
|
|
737
|
-
|
|
738
|
-
const asyncArrayMapPool1 = async function (
|
|
739
|
-
array, mappingFunc, size, result, index, promises,
|
|
740
|
-
) {
|
|
741
|
-
const arrayLength = array.length
|
|
742
|
-
while (++index < arrayLength) {
|
|
743
|
-
if (promises.size >= size) {
|
|
744
|
-
await promiseRace(promises)
|
|
745
|
-
}
|
|
746
|
-
const resultItem = mappingFunc(array[index])
|
|
747
|
-
if (isPromise(resultItem)) {
|
|
748
|
-
const selfDeletingPromise = resultItem.then(res => {
|
|
749
|
-
promises.delete(selfDeletingPromise)
|
|
750
|
-
return res
|
|
751
|
-
})
|
|
752
|
-
promises.add(selfDeletingPromise)
|
|
753
|
-
result[index] = selfDeletingPromise
|
|
754
|
-
} else {
|
|
755
|
-
result[index] = resultItem
|
|
756
|
-
}
|
|
757
|
-
}
|
|
758
|
-
return promiseAll(result)
|
|
759
|
-
}
|
|
760
|
-
|
|
761
|
-
const arrayMapPool1 = function (array, mappingFunc, size) {
|
|
762
|
-
const arrayLength = array.length,
|
|
763
|
-
result = Array(arrayLength)
|
|
764
|
-
let index = -1
|
|
765
|
-
while (++index < arrayLength) {
|
|
766
|
-
const resultItem = mappingFunc(array[index])
|
|
767
|
-
if (isPromise(resultItem)) {
|
|
768
|
-
const promises = new Set()
|
|
769
|
-
const selfDeletingPromise = resultItem.then(res => {
|
|
770
|
-
promises.delete(selfDeletingPromise)
|
|
771
|
-
return res
|
|
772
|
-
})
|
|
773
|
-
promises.add(selfDeletingPromise)
|
|
774
|
-
result[index] = selfDeletingPromise
|
|
775
|
-
return asyncArrayMapPool1(
|
|
776
|
-
array, mappingFunc, size, result, index, promises)
|
|
777
|
-
}
|
|
778
|
-
result[index] = resultItem
|
|
779
|
-
}
|
|
780
|
-
return result
|
|
781
|
-
}
|
|
782
|
-
|
|
783
|
-
const setProtoAdd = Set.prototype.add
|
|
784
|
-
|
|
785
|
-
const setProtoDelete = Set.prototype.delete
|
|
786
|
-
|
|
787
|
-
const setAdd = (set, item) => setProtoAdd.call(set, item)
|
|
788
|
-
|
|
789
|
-
const setDelete = (set, item) => setProtoDelete.call(set, item)
|
|
790
|
-
|
|
791
|
-
const asyncArrayMapPool2 = async function (
|
|
792
|
-
array, mappingFunc, size, result, index, promises,
|
|
793
|
-
) {
|
|
794
|
-
const arrayLength = array.length
|
|
795
|
-
while (++index < arrayLength) {
|
|
796
|
-
if (promises.size >= size) {
|
|
797
|
-
await promiseRace(promises)
|
|
798
|
-
}
|
|
799
|
-
const resultItem = mappingFunc(array[index])
|
|
800
|
-
if (isPromise(resultItem)) {
|
|
801
|
-
const selfDeletingPromise = resultItem.then(res => {
|
|
802
|
-
setDelete(promises, selfDeletingPromise)
|
|
803
|
-
return res
|
|
804
|
-
})
|
|
805
|
-
setAdd(promises, selfDeletingPromise)
|
|
806
|
-
result[index] = selfDeletingPromise
|
|
807
|
-
} else {
|
|
808
|
-
result[index] = resultItem
|
|
809
|
-
}
|
|
810
|
-
}
|
|
811
|
-
return promiseAll(result)
|
|
812
|
-
}
|
|
813
|
-
|
|
814
|
-
const arrayMapPool2 = function (array, mappingFunc, size) {
|
|
815
|
-
const arrayLength = array.length,
|
|
816
|
-
result = Array(arrayLength)
|
|
817
|
-
let index = -1
|
|
818
|
-
while (++index < arrayLength) {
|
|
819
|
-
const resultItem = mappingFunc(array[index])
|
|
820
|
-
if (isPromise(resultItem)) {
|
|
821
|
-
const promises = new Set()
|
|
822
|
-
const selfDeletingPromise = resultItem.then(res => {
|
|
823
|
-
promises.delete(selfDeletingPromise)
|
|
824
|
-
return res
|
|
825
|
-
})
|
|
826
|
-
promises.add(selfDeletingPromise)
|
|
827
|
-
result[index] = selfDeletingPromise
|
|
828
|
-
return asyncArrayMapPool2(
|
|
829
|
-
array, mappingFunc, size, result, index, promises)
|
|
830
|
-
}
|
|
831
|
-
result[index] = resultItem
|
|
832
|
-
}
|
|
833
|
-
return result
|
|
834
|
-
}
|
|
835
|
-
|
|
836
|
-
{
|
|
837
|
-
const asyncSquare = async number => number ** 2
|
|
838
|
-
|
|
839
|
-
const range = length => Array.from({ length }, (_, i) => i + 1)
|
|
840
|
-
|
|
841
|
-
const promiseRange = length => Array.from({ length }, (_, i) => Promise.resolve(i))
|
|
842
|
-
|
|
843
|
-
// arrayMapPool1(range(5), asyncSquare, 100).then(console.log)
|
|
844
|
-
// arrayMapPool2(range(5), asyncSquare, 100).then(console.log)
|
|
845
|
-
|
|
846
|
-
// timeInLoop.async('arrayMapPool1', 1e5, () => arrayMapPool1(range(5), asyncSquare, 100))
|
|
847
|
-
// timeInLoop.async('arrayMapPool2', 1e5, () => arrayMapPool2(range(5), asyncSquare, 100))
|
|
848
|
-
}
|
|
849
|
-
|
|
850
|
-
/**
|
|
851
|
-
* @name arrayMapWithIndex
|
|
852
|
-
*
|
|
853
|
-
* @benchmark
|
|
854
|
-
* arrayMapWithIndex1: 1e+6: 29.659ms
|
|
855
|
-
* arrayMapWithIndex2: 1e+6: 31.844ms
|
|
856
|
-
*/
|
|
857
|
-
|
|
858
|
-
const arrayMapWithIndex1 = function (array, func) {
|
|
859
|
-
const arrayLength = array.length,
|
|
860
|
-
result = Array(arrayLength)
|
|
861
|
-
let index = -1, isAsync = false
|
|
862
|
-
while (++index < arrayLength) {
|
|
863
|
-
const resultItem = func(array[index], index, array)
|
|
864
|
-
if (isPromise(resultItem)) isAsync = true
|
|
865
|
-
result[index] = resultItem
|
|
866
|
-
}
|
|
867
|
-
return isAsync ? promiseAll(result) : result
|
|
868
|
-
}
|
|
869
|
-
|
|
870
|
-
const arrayMapWithIndex2 = function (array, func) {
|
|
871
|
-
const arrayLength = array.length,
|
|
872
|
-
result = Array(arrayLength)
|
|
873
|
-
let index = -1, isAsync = false
|
|
874
|
-
while (++index < arrayLength) {
|
|
875
|
-
const resultItem = func.call(null, array[index], index, array)
|
|
876
|
-
if (isPromise(resultItem)) isAsync = true
|
|
877
|
-
result[index] = resultItem
|
|
878
|
-
}
|
|
879
|
-
return isAsync ? promiseAll(result) : result
|
|
880
|
-
}
|
|
881
|
-
|
|
882
|
-
{
|
|
883
|
-
const array = [1, 2, 3, 4, 5]
|
|
884
|
-
|
|
885
|
-
const identity = value => value
|
|
886
|
-
|
|
887
|
-
// console.log(arrayMapWithIndex1(array, identity))
|
|
888
|
-
|
|
889
|
-
// timeInLoop('arrayMapWithIndex1', 1e6, () => arrayMapWithIndex1(array, identity))
|
|
890
|
-
|
|
891
|
-
// timeInLoop('arrayMapWithIndex2', 1e6, () => arrayMapWithIndex2(array, identity))
|
|
892
|
-
}
|