rubico 1.9.7 → 2.0.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.
Files changed (587) hide show
  1. package/.eslintignore +5 -0
  2. package/.eslintrc.js +3 -2
  3. package/.github/workflows/nodejs.yml +1 -1
  4. package/AggregateReducer.js +19 -0
  5. package/AggregateReducer.test.js +82 -0
  6. package/CHANGELOG.md +22 -1
  7. package/Transducer.js +75 -26
  8. package/Transducer.test.js +117 -0
  9. package/_internal/ComparisonOperator.js +68 -0
  10. package/_internal/File.js +41 -0
  11. package/_internal/FlatMappingAsyncIterator.js +4 -4
  12. package/_internal/FlatMappingIterator.js +1 -1
  13. package/_internal/TimeInLoopSuite.js +138 -0
  14. package/_internal/areAnyValuesPromises.js +23 -0
  15. package/_internal/{arrayAll.js → arrayEvery.js} +4 -4
  16. package/_internal/arrayExtend.js +3 -2
  17. package/_internal/arrayFilter.js +3 -4
  18. package/_internal/{arrayAny.js → arraySome.js} +8 -8
  19. package/_internal/{asyncIteratorAll.js → asyncIteratorEvery.js} +4 -4
  20. package/_internal/{asyncIteratorAny.js → asyncIteratorSome.js} +4 -4
  21. package/_internal/curry4.test.js +25 -0
  22. package/_internal/curry5.test.js +29 -0
  23. package/_internal/curryArgs2.js +43 -0
  24. package/_internal/curryArgs3.test.js +21 -0
  25. package/_internal/curryArgs4.js +65 -0
  26. package/_internal/curryArgs4.test.js +25 -0
  27. package/_internal/equals.js +13 -0
  28. package/_internal/findAllFilePaths.js +22 -0
  29. package/_internal/funcApply.js +2 -0
  30. package/_internal/funcCall.js +14 -0
  31. package/_internal/functionArrayAll.js +26 -0
  32. package/_internal/functionArrayAllSeries.js +55 -0
  33. package/_internal/functionObjectAll.js +32 -0
  34. package/_internal/genericReduce.js +4 -22
  35. package/_internal/genericTransform.js +15 -15
  36. package/_internal/improvedGenericTransform.js +93 -0
  37. package/_internal/{iteratorAll.js → iteratorEvery.js} +4 -4
  38. package/_internal/{iteratorAny.js → iteratorSome.js} +6 -6
  39. package/_internal/leftResolverRightResolverCompare.js +19 -0
  40. package/_internal/leftResolverRightValueCompare.js +16 -0
  41. package/_internal/leftValueRightResolverCompare.js +16 -0
  42. package/_internal/objectReduce.js +0 -1
  43. package/_internal/pathResolve.js +6 -0
  44. package/_internal/{reducerAll.js → reducerEvery.js} +4 -4
  45. package/_internal/reducerFlatMap.js +4 -4
  46. package/_internal/reducerFlatten.js +1 -1
  47. package/_internal/{reducerAny.js → reducerSome.js} +4 -4
  48. package/_internal/timeInLoop.js +37 -0
  49. package/_internal/timeInLoop.test.js +18 -0
  50. package/_internal/timeInLoopAsync.js +35 -0
  51. package/_internal/timeInLoopAsync.test.js +22 -0
  52. package/all.js +106 -40
  53. package/and.js +54 -36
  54. package/archive/{FlatMappingIteratorCool.js → FlatMappingIterator-2020-09-28.js} +1 -1
  55. package/archive/_Promise-2023-05-29.js +93 -0
  56. package/archive/arrayMap2-2023-05-29.js +73 -0
  57. package/archive/benchmarks-v1.9.7/all.js +34 -0
  58. package/archive/benchmarks-v1.9.7/and.js +24 -0
  59. package/archive/benchmarks-v1.9.7/assign.js +174 -0
  60. package/archive/benchmarks-v1.9.7/curry.js +55 -0
  61. package/archive/benchmarks-v1.9.7/eq.js +25 -0
  62. package/archive/benchmarks-v1.9.7/filter.js +1322 -0
  63. package/archive/benchmarks-v1.9.7/flatMap.js +48 -0
  64. package/archive/benchmarks-v1.9.7/get.js +44 -0
  65. package/archive/benchmarks-v1.9.7/gt.js +25 -0
  66. package/archive/benchmarks-v1.9.7/gte.js +25 -0
  67. package/archive/benchmarks-v1.9.7/lt.js +25 -0
  68. package/archive/benchmarks-v1.9.7/lte.js +25 -0
  69. package/archive/benchmarks-v1.9.7/map.js +892 -0
  70. package/archive/benchmarks-v1.9.7/omit.js +28 -0
  71. package/archive/benchmarks-v1.9.7/or.js +51 -0
  72. package/archive/benchmarks-v1.9.7/pick.js +24 -0
  73. package/archive/benchmarks-v1.9.7/pipe.js +152 -0
  74. package/archive/benchmarks-v1.9.7/reduce.js +739 -0
  75. package/archive/benchmarks-v1.9.7/switchCase.js +256 -0
  76. package/archive/benchmarks-v1.9.7/tap.js +90 -0
  77. package/archive/benchmarks-v1.9.7/transform.js +218 -0
  78. package/archive/benchmarks-v1.9.7/tryCatch.js +108 -0
  79. package/assign.js +18 -8
  80. package/bench +65 -0
  81. package/benchmark-output/v1.9.7 +268 -0
  82. package/benchmarks/all.async.js +43 -0
  83. package/benchmarks/all.js +42 -33
  84. package/benchmarks/always.js +15 -0
  85. package/benchmarks/and.async.js +25 -0
  86. package/benchmarks/and.js +20 -19
  87. package/benchmarks/assign.async.js +27 -0
  88. package/benchmarks/assign.js +20 -167
  89. package/benchmarks/curry.js +34 -54
  90. package/benchmarks/eq.async.js +23 -0
  91. package/benchmarks/eq.js +17 -19
  92. package/benchmarks/every.async.js +19 -0
  93. package/benchmarks/every.js +19 -0
  94. package/benchmarks/filter.async.js +32 -0
  95. package/benchmarks/filter.js +27 -1311
  96. package/benchmarks/flatMap.async.js +26 -0
  97. package/benchmarks/flatMap.js +26 -36
  98. package/benchmarks/get.async.js +19 -0
  99. package/benchmarks/get.js +27 -32
  100. package/benchmarks/gt.async.js +23 -0
  101. package/benchmarks/gt.js +17 -19
  102. package/benchmarks/gte.async.js +23 -0
  103. package/benchmarks/gte.js +17 -19
  104. package/benchmarks/lt.async.js +23 -0
  105. package/benchmarks/lt.js +17 -19
  106. package/benchmarks/lte.async.js +23 -0
  107. package/benchmarks/lte.js +17 -19
  108. package/benchmarks/map.async.js +43 -0
  109. package/benchmarks/map.js +24 -876
  110. package/benchmarks/misc/Promise.js +26 -0
  111. package/benchmarks/misc/isPromise.js +30 -0
  112. package/benchmarks/misc/promiseAll.js +36 -0
  113. package/benchmarks/not.js +23 -0
  114. package/benchmarks/omit.js +30 -20
  115. package/benchmarks/or.async.js +25 -0
  116. package/benchmarks/or.js +23 -49
  117. package/benchmarks/pick.js +30 -16
  118. package/benchmarks/pipe.async.js +47 -0
  119. package/benchmarks/pipe.js +46 -151
  120. package/benchmarks/reduce.async.js +32 -0
  121. package/benchmarks/reduce.js +27 -728
  122. package/benchmarks/set.async.js +19 -0
  123. package/benchmarks/set.js +41 -0
  124. package/benchmarks/some.async.js +19 -0
  125. package/benchmarks/some.js +19 -0
  126. package/benchmarks/switchCase.async.js +27 -0
  127. package/benchmarks/switchCase.js +55 -256
  128. package/benchmarks/tap.js +10 -85
  129. package/benchmarks/thunkify.js +15 -0
  130. package/benchmarks/transform.async.js +27 -0
  131. package/benchmarks/transform.js +28 -206
  132. package/benchmarks/tryCatch.async.js +25 -0
  133. package/benchmarks/tryCatch.js +24 -100
  134. package/{distributor.js → build} +50 -50
  135. package/compose.js +46 -0
  136. package/dist/__.es.js +2 -2
  137. package/dist/__.es.min.js +2 -2
  138. package/dist/__.js +2 -2
  139. package/dist/__.min.js +2 -2
  140. package/dist/__.min.mjs +2 -2
  141. package/dist/__.mjs +2 -2
  142. package/dist/all.es.js +173 -92
  143. package/dist/all.es.min.js +3 -3
  144. package/dist/all.js +173 -92
  145. package/dist/all.min.js +3 -3
  146. package/dist/all.min.mjs +3 -3
  147. package/dist/all.mjs +173 -92
  148. package/dist/always.es.js +2 -2
  149. package/dist/always.es.min.js +2 -2
  150. package/dist/always.js +2 -2
  151. package/dist/always.min.js +2 -2
  152. package/dist/always.min.mjs +2 -2
  153. package/dist/always.mjs +2 -2
  154. package/dist/and.es.js +101 -32
  155. package/dist/and.es.min.js +3 -3
  156. package/dist/and.js +101 -32
  157. package/dist/and.min.js +3 -3
  158. package/dist/and.min.mjs +3 -3
  159. package/dist/and.mjs +101 -32
  160. package/dist/assign.es.js +37 -10
  161. package/dist/assign.es.min.js +3 -3
  162. package/dist/assign.js +37 -10
  163. package/dist/assign.min.js +3 -3
  164. package/dist/assign.min.mjs +3 -3
  165. package/dist/assign.mjs +37 -10
  166. package/dist/compose.es.js +71 -0
  167. package/dist/compose.es.min.js +7 -0
  168. package/dist/compose.js +78 -0
  169. package/dist/compose.min.js +8 -0
  170. package/dist/compose.min.mjs +7 -0
  171. package/dist/compose.mjs +71 -0
  172. package/dist/curry.es.js +2 -2
  173. package/dist/curry.es.min.js +2 -2
  174. package/dist/curry.js +2 -2
  175. package/dist/curry.min.js +2 -2
  176. package/dist/curry.min.mjs +2 -2
  177. package/dist/curry.mjs +2 -2
  178. package/dist/eq.es.js +172 -49
  179. package/dist/eq.es.min.js +3 -3
  180. package/dist/eq.js +172 -49
  181. package/dist/eq.min.js +3 -3
  182. package/dist/eq.min.mjs +3 -3
  183. package/dist/eq.mjs +172 -49
  184. package/dist/every.es.js +194 -0
  185. package/dist/every.es.min.js +7 -0
  186. package/dist/every.js +201 -0
  187. package/dist/every.min.js +8 -0
  188. package/dist/every.min.mjs +7 -0
  189. package/dist/every.mjs +194 -0
  190. package/dist/filter.es.js +14 -108
  191. package/dist/filter.es.min.js +3 -3
  192. package/dist/filter.js +14 -108
  193. package/dist/filter.min.js +3 -3
  194. package/dist/filter.min.mjs +3 -3
  195. package/dist/filter.mjs +14 -108
  196. package/dist/flatMap.es.js +27 -214
  197. package/dist/flatMap.es.min.js +3 -3
  198. package/dist/flatMap.js +27 -214
  199. package/dist/flatMap.min.js +3 -3
  200. package/dist/flatMap.min.mjs +3 -3
  201. package/dist/flatMap.mjs +27 -214
  202. package/dist/{x/forEach.es.js → forEach.es.js} +52 -70
  203. package/dist/forEach.es.min.js +7 -0
  204. package/dist/{x/forEach.js → forEach.js} +52 -70
  205. package/dist/forEach.min.js +8 -0
  206. package/dist/forEach.min.mjs +7 -0
  207. package/dist/{x/forEach.mjs → forEach.mjs} +52 -70
  208. package/dist/get.es.js +60 -5
  209. package/dist/get.es.min.js +3 -3
  210. package/dist/get.js +60 -5
  211. package/dist/get.min.js +3 -3
  212. package/dist/get.min.mjs +3 -3
  213. package/dist/get.mjs +60 -5
  214. package/dist/gt.es.js +171 -48
  215. package/dist/gt.es.min.js +3 -3
  216. package/dist/gt.js +171 -48
  217. package/dist/gt.min.js +3 -3
  218. package/dist/gt.min.mjs +3 -3
  219. package/dist/gt.mjs +171 -48
  220. package/dist/gte.es.js +171 -48
  221. package/dist/gte.es.min.js +3 -3
  222. package/dist/gte.js +171 -48
  223. package/dist/gte.min.js +3 -3
  224. package/dist/gte.min.mjs +3 -3
  225. package/dist/gte.mjs +171 -48
  226. package/dist/lt.es.js +171 -48
  227. package/dist/lt.es.min.js +3 -3
  228. package/dist/lt.js +171 -48
  229. package/dist/lt.min.js +3 -3
  230. package/dist/lt.min.mjs +3 -3
  231. package/dist/lt.mjs +171 -48
  232. package/dist/lte.es.js +171 -48
  233. package/dist/lte.es.min.js +3 -3
  234. package/dist/lte.js +171 -48
  235. package/dist/lte.min.js +3 -3
  236. package/dist/lte.min.mjs +3 -3
  237. package/dist/lte.mjs +171 -48
  238. package/dist/map.es.js +12 -101
  239. package/dist/map.es.min.js +3 -3
  240. package/dist/map.js +12 -101
  241. package/dist/map.min.js +3 -3
  242. package/dist/map.min.mjs +3 -3
  243. package/dist/map.mjs +12 -101
  244. package/dist/not.es.js +75 -14
  245. package/dist/not.es.min.js +3 -3
  246. package/dist/not.js +75 -14
  247. package/dist/not.min.js +3 -3
  248. package/dist/not.min.mjs +3 -3
  249. package/dist/not.mjs +75 -14
  250. package/dist/omit.es.js +7 -2
  251. package/dist/omit.es.min.js +3 -3
  252. package/dist/omit.js +7 -2
  253. package/dist/omit.min.js +3 -3
  254. package/dist/omit.min.mjs +3 -3
  255. package/dist/omit.mjs +7 -2
  256. package/dist/or.es.js +99 -31
  257. package/dist/or.es.min.js +3 -3
  258. package/dist/or.js +99 -31
  259. package/dist/or.min.js +3 -3
  260. package/dist/or.min.mjs +3 -3
  261. package/dist/or.mjs +99 -31
  262. package/dist/pick.es.js +8 -3
  263. package/dist/pick.es.min.js +3 -3
  264. package/dist/pick.js +8 -3
  265. package/dist/pick.min.js +3 -3
  266. package/dist/pick.min.mjs +3 -3
  267. package/dist/pick.mjs +8 -3
  268. package/dist/pipe.es.js +42 -46
  269. package/dist/pipe.es.min.js +3 -3
  270. package/dist/pipe.js +42 -46
  271. package/dist/pipe.min.js +3 -3
  272. package/dist/pipe.min.mjs +3 -3
  273. package/dist/pipe.mjs +42 -46
  274. package/dist/reduce.es.js +52 -94
  275. package/dist/reduce.es.min.js +3 -3
  276. package/dist/reduce.js +52 -94
  277. package/dist/reduce.min.js +3 -3
  278. package/dist/reduce.min.mjs +3 -3
  279. package/dist/reduce.mjs +52 -94
  280. package/dist/rubico.es.js +730 -869
  281. package/dist/rubico.es.min.js +3 -3
  282. package/dist/rubico.js +730 -869
  283. package/dist/rubico.min.js +3 -3
  284. package/dist/rubico.min.mjs +3 -3
  285. package/dist/rubico.mjs +730 -869
  286. package/dist/set.es.js +18 -3
  287. package/dist/set.es.min.js +3 -3
  288. package/dist/set.js +18 -3
  289. package/dist/set.min.js +3 -3
  290. package/dist/set.min.mjs +3 -3
  291. package/dist/set.mjs +18 -3
  292. package/dist/{any.js → some.es.js} +64 -54
  293. package/dist/some.es.min.js +7 -0
  294. package/dist/{any.mjs → some.js} +72 -48
  295. package/dist/some.min.js +8 -0
  296. package/dist/some.min.mjs +7 -0
  297. package/dist/{any.es.js → some.mjs} +65 -48
  298. package/dist/switchCase.es.js +55 -5
  299. package/dist/switchCase.es.min.js +3 -3
  300. package/dist/switchCase.js +55 -5
  301. package/dist/switchCase.min.js +3 -3
  302. package/dist/switchCase.min.mjs +3 -3
  303. package/dist/switchCase.mjs +55 -5
  304. package/dist/tap.es.js +2 -9
  305. package/dist/tap.es.min.js +3 -3
  306. package/dist/tap.js +2 -9
  307. package/dist/tap.min.js +3 -3
  308. package/dist/tap.min.mjs +3 -3
  309. package/dist/tap.mjs +2 -9
  310. package/dist/thunkify.es.js +45 -2
  311. package/dist/thunkify.es.min.js +3 -3
  312. package/dist/thunkify.js +45 -2
  313. package/dist/thunkify.min.js +3 -3
  314. package/dist/thunkify.min.mjs +3 -3
  315. package/dist/thunkify.mjs +45 -2
  316. package/dist/transform.es.js +35 -71
  317. package/dist/transform.es.min.js +3 -3
  318. package/dist/transform.js +35 -71
  319. package/dist/transform.min.js +3 -3
  320. package/dist/transform.min.mjs +3 -3
  321. package/dist/transform.mjs +35 -71
  322. package/dist/tryCatch.es.js +33 -17
  323. package/dist/tryCatch.es.min.js +3 -3
  324. package/dist/tryCatch.js +33 -17
  325. package/dist/tryCatch.min.js +3 -3
  326. package/dist/tryCatch.min.mjs +3 -3
  327. package/dist/tryCatch.mjs +33 -17
  328. package/dist/x/append.es.js +2 -2
  329. package/dist/x/append.es.min.js +2 -2
  330. package/dist/x/append.js +2 -2
  331. package/dist/x/append.min.js +2 -2
  332. package/dist/x/append.min.mjs +2 -2
  333. package/dist/x/append.mjs +2 -2
  334. package/dist/x/callProp.es.js +2 -2
  335. package/dist/x/callProp.es.min.js +2 -2
  336. package/dist/x/callProp.js +2 -2
  337. package/dist/x/callProp.min.js +2 -2
  338. package/dist/x/callProp.min.mjs +2 -2
  339. package/dist/x/callProp.mjs +2 -2
  340. package/dist/x/defaultsDeep.es.js +2 -2
  341. package/dist/x/defaultsDeep.es.min.js +2 -2
  342. package/dist/x/defaultsDeep.js +2 -2
  343. package/dist/x/defaultsDeep.min.js +2 -2
  344. package/dist/x/defaultsDeep.min.mjs +2 -2
  345. package/dist/x/defaultsDeep.mjs +2 -2
  346. package/dist/x/differenceWith.es.js +7 -7
  347. package/dist/x/differenceWith.es.min.js +3 -3
  348. package/dist/x/differenceWith.js +7 -7
  349. package/dist/x/differenceWith.min.js +2 -2
  350. package/dist/x/differenceWith.min.mjs +3 -3
  351. package/dist/x/differenceWith.mjs +7 -7
  352. package/dist/x/filterOut.es.js +60 -117
  353. package/dist/x/filterOut.es.min.js +3 -3
  354. package/dist/x/filterOut.js +60 -117
  355. package/dist/x/filterOut.min.js +3 -3
  356. package/dist/x/filterOut.min.mjs +3 -3
  357. package/dist/x/filterOut.mjs +60 -117
  358. package/dist/x/find.es.js +2 -2
  359. package/dist/x/find.es.min.js +2 -2
  360. package/dist/x/find.js +2 -2
  361. package/dist/x/find.min.js +2 -2
  362. package/dist/x/find.min.mjs +2 -2
  363. package/dist/x/find.mjs +2 -2
  364. package/dist/x/findIndex.es.js +2 -2
  365. package/dist/x/findIndex.es.min.js +2 -2
  366. package/dist/x/findIndex.js +2 -2
  367. package/dist/x/findIndex.min.js +2 -2
  368. package/dist/x/findIndex.min.mjs +2 -2
  369. package/dist/x/findIndex.mjs +2 -2
  370. package/dist/x/first.es.js +2 -2
  371. package/dist/x/first.es.min.js +2 -2
  372. package/dist/x/first.js +2 -2
  373. package/dist/x/first.min.js +2 -2
  374. package/dist/x/first.min.mjs +2 -2
  375. package/dist/x/first.mjs +2 -2
  376. package/dist/x/flatten.es.js +20 -207
  377. package/dist/x/flatten.es.min.js +3 -3
  378. package/dist/x/flatten.js +20 -207
  379. package/dist/x/flatten.min.js +3 -3
  380. package/dist/x/flatten.min.mjs +3 -3
  381. package/dist/x/flatten.mjs +20 -207
  382. package/dist/x/groupBy.es.js +52 -94
  383. package/dist/x/groupBy.es.min.js +3 -3
  384. package/dist/x/groupBy.js +52 -94
  385. package/dist/x/groupBy.min.js +3 -3
  386. package/dist/x/groupBy.min.mjs +3 -3
  387. package/dist/x/groupBy.mjs +52 -94
  388. package/dist/x/has.es.js +2 -2
  389. package/dist/x/has.es.min.js +2 -2
  390. package/dist/x/has.js +2 -2
  391. package/dist/x/has.min.js +2 -2
  392. package/dist/x/has.min.mjs +2 -2
  393. package/dist/x/has.mjs +2 -2
  394. package/dist/x/identity.es.js +2 -2
  395. package/dist/x/identity.es.min.js +2 -2
  396. package/dist/x/identity.js +2 -2
  397. package/dist/x/identity.min.js +2 -2
  398. package/dist/x/identity.min.mjs +2 -2
  399. package/dist/x/identity.mjs +2 -2
  400. package/dist/x/includes.es.js +2 -2
  401. package/dist/x/includes.es.min.js +2 -2
  402. package/dist/x/includes.js +2 -2
  403. package/dist/x/includes.min.js +2 -2
  404. package/dist/x/includes.min.mjs +2 -2
  405. package/dist/x/includes.mjs +2 -2
  406. package/dist/x/isDeepEqual.es.js +2 -2
  407. package/dist/x/isDeepEqual.es.min.js +2 -2
  408. package/dist/x/isDeepEqual.js +2 -2
  409. package/dist/x/isDeepEqual.min.js +2 -2
  410. package/dist/x/isDeepEqual.min.mjs +2 -2
  411. package/dist/x/isDeepEqual.mjs +2 -2
  412. package/dist/x/isEmpty.es.js +2 -2
  413. package/dist/x/isEmpty.es.min.js +2 -2
  414. package/dist/x/isEmpty.js +2 -2
  415. package/dist/x/isEmpty.min.js +2 -2
  416. package/dist/x/isEmpty.min.mjs +2 -2
  417. package/dist/x/isEmpty.mjs +2 -2
  418. package/dist/x/isEqual.es.js +2 -2
  419. package/dist/x/isEqual.es.min.js +2 -2
  420. package/dist/x/isEqual.js +2 -2
  421. package/dist/x/isEqual.min.js +2 -2
  422. package/dist/x/isEqual.min.mjs +2 -2
  423. package/dist/x/isEqual.mjs +2 -2
  424. package/dist/x/isFunction.es.js +2 -2
  425. package/dist/x/isFunction.es.min.js +2 -2
  426. package/dist/x/isFunction.js +2 -2
  427. package/dist/x/isFunction.min.js +2 -2
  428. package/dist/x/isFunction.min.mjs +2 -2
  429. package/dist/x/isFunction.mjs +2 -2
  430. package/dist/x/isIn.es.js +2 -2
  431. package/dist/x/isIn.es.min.js +2 -2
  432. package/dist/x/isIn.js +2 -2
  433. package/dist/x/isIn.min.js +2 -2
  434. package/dist/x/isIn.min.mjs +2 -2
  435. package/dist/x/isIn.mjs +2 -2
  436. package/dist/x/isObject.es.js +2 -2
  437. package/dist/x/isObject.es.min.js +2 -2
  438. package/dist/x/isObject.js +2 -2
  439. package/dist/x/isObject.min.js +2 -2
  440. package/dist/x/isObject.min.mjs +2 -2
  441. package/dist/x/isObject.mjs +2 -2
  442. package/dist/x/isString.es.js +2 -2
  443. package/dist/x/isString.es.min.js +2 -2
  444. package/dist/x/isString.js +2 -2
  445. package/dist/x/isString.min.js +2 -2
  446. package/dist/x/isString.min.mjs +2 -2
  447. package/dist/x/isString.mjs +2 -2
  448. package/dist/x/keys.es.js +2 -2
  449. package/dist/x/keys.es.min.js +2 -2
  450. package/dist/x/keys.js +2 -2
  451. package/dist/x/keys.min.js +2 -2
  452. package/dist/x/keys.min.mjs +2 -2
  453. package/dist/x/keys.mjs +2 -2
  454. package/dist/x/last.es.js +2 -2
  455. package/dist/x/last.es.min.js +2 -2
  456. package/dist/x/last.js +2 -2
  457. package/dist/x/last.min.js +2 -2
  458. package/dist/x/last.min.mjs +2 -2
  459. package/dist/x/last.mjs +2 -2
  460. package/dist/x/maxBy.es.js +59 -6
  461. package/dist/x/maxBy.es.min.js +3 -3
  462. package/dist/x/maxBy.js +59 -6
  463. package/dist/x/maxBy.min.js +3 -3
  464. package/dist/x/maxBy.min.mjs +3 -3
  465. package/dist/x/maxBy.mjs +59 -6
  466. package/dist/x/noop.es.js +2 -2
  467. package/dist/x/noop.es.min.js +2 -2
  468. package/dist/x/noop.js +2 -2
  469. package/dist/x/noop.min.js +2 -2
  470. package/dist/x/noop.min.mjs +2 -2
  471. package/dist/x/noop.mjs +2 -2
  472. package/dist/x/pluck.es.js +32 -103
  473. package/dist/x/pluck.es.min.js +3 -3
  474. package/dist/x/pluck.js +32 -103
  475. package/dist/x/pluck.min.js +3 -3
  476. package/dist/x/pluck.min.mjs +3 -3
  477. package/dist/x/pluck.mjs +32 -103
  478. package/dist/x/prepend.es.js +2 -2
  479. package/dist/x/prepend.es.min.js +2 -2
  480. package/dist/x/prepend.js +2 -2
  481. package/dist/x/prepend.min.js +2 -2
  482. package/dist/x/prepend.min.mjs +2 -2
  483. package/dist/x/prepend.mjs +2 -2
  484. package/dist/x/size.es.js +2 -2
  485. package/dist/x/size.es.min.js +2 -2
  486. package/dist/x/size.js +2 -2
  487. package/dist/x/size.min.js +2 -2
  488. package/dist/x/size.min.mjs +2 -2
  489. package/dist/x/size.mjs +2 -2
  490. package/dist/x/trace.es.js +2 -9
  491. package/dist/x/trace.es.min.js +3 -3
  492. package/dist/x/trace.js +2 -9
  493. package/dist/x/trace.min.js +3 -3
  494. package/dist/x/trace.min.mjs +3 -3
  495. package/dist/x/trace.mjs +2 -9
  496. package/dist/x/unionWith.es.js +2 -2
  497. package/dist/x/unionWith.es.min.js +2 -2
  498. package/dist/x/unionWith.js +2 -2
  499. package/dist/x/unionWith.min.js +2 -2
  500. package/dist/x/unionWith.min.mjs +2 -2
  501. package/dist/x/unionWith.mjs +2 -2
  502. package/dist/x/uniq.es.js +2 -2
  503. package/dist/x/uniq.es.min.js +2 -2
  504. package/dist/x/uniq.js +2 -2
  505. package/dist/x/uniq.min.js +2 -2
  506. package/dist/x/uniq.min.mjs +2 -2
  507. package/dist/x/uniq.mjs +2 -2
  508. package/dist/x/unless.es.js +2 -2
  509. package/dist/x/unless.es.min.js +2 -2
  510. package/dist/x/unless.js +2 -2
  511. package/dist/x/unless.min.js +2 -2
  512. package/dist/x/unless.min.mjs +2 -2
  513. package/dist/x/unless.mjs +2 -2
  514. package/dist/x/values.es.js +2 -2
  515. package/dist/x/values.es.min.js +2 -2
  516. package/dist/x/values.js +2 -2
  517. package/dist/x/values.min.js +2 -2
  518. package/dist/x/values.min.mjs +2 -2
  519. package/dist/x/values.mjs +2 -2
  520. package/dist/x/when.es.js +2 -2
  521. package/dist/x/when.es.min.js +2 -2
  522. package/dist/x/when.js +2 -2
  523. package/dist/x/when.min.js +2 -2
  524. package/dist/x/when.min.mjs +2 -2
  525. package/dist/x/when.mjs +2 -2
  526. package/dist-test.js +9 -2042
  527. package/eq.js +21 -63
  528. package/es.js +730 -869
  529. package/every.js +94 -0
  530. package/filter.js +23 -91
  531. package/flatMap.js +75 -70
  532. package/forEach.js +82 -0
  533. package/get.js +23 -6
  534. package/global.js +6 -4
  535. package/gt.js +15 -58
  536. package/gte.js +14 -57
  537. package/index.js +730 -869
  538. package/lt.js +17 -60
  539. package/lte.js +14 -57
  540. package/map.js +9 -94
  541. package/memory-usage/reduce.js +2 -2
  542. package/not.js +27 -45
  543. package/omit.js +4 -0
  544. package/or.js +50 -33
  545. package/package.json +7 -7
  546. package/pick.js +5 -1
  547. package/pipe.js +13 -50
  548. package/reduce.js +42 -51
  549. package/rubico.js +10 -8
  550. package/set.js +43 -10
  551. package/some.js +105 -0
  552. package/switchCase.js +13 -3
  553. package/tap.js +0 -24
  554. package/test.js +847 -1096
  555. package/thunkify.js +9 -0
  556. package/transform.js +31 -16
  557. package/tryCatch.js +19 -15
  558. package/x/differenceWith.js +3 -3
  559. package/x/filterOut.test.js +6 -6
  560. package/x/flatten.js +1 -1
  561. package/x/flatten.test.js +0 -8
  562. package/x/index.js +0 -2
  563. package/x/pluck.js +18 -27
  564. package/x/pluck.test.js +3 -7
  565. package/x/timeInLoop.js +16 -25
  566. package/x/timeInLoop.test.js +8 -4
  567. package/any.js +0 -82
  568. package/dist/any.es.min.js +0 -7
  569. package/dist/any.min.js +0 -8
  570. package/dist/any.min.mjs +0 -7
  571. package/dist/fork.es.js +0 -159
  572. package/dist/fork.es.min.js +0 -7
  573. package/dist/fork.js +0 -166
  574. package/dist/fork.min.js +0 -8
  575. package/dist/fork.min.mjs +0 -7
  576. package/dist/fork.mjs +0 -159
  577. package/dist/x/forEach.es.min.js +0 -7
  578. package/dist/x/forEach.min.js +0 -8
  579. package/dist/x/forEach.min.mjs +0 -7
  580. package/fork.js +0 -101
  581. package/x/forEach.js +0 -93
  582. package/x/forEach.test.js +0 -218
  583. /package/{benchmarks → archive/benchmarks-v1.9.7}/any.js +0 -0
  584. /package/{x/forEach.benchmark.js → archive/benchmarks-v1.9.7/forEach.js} +0 -0
  585. /package/{benchmarks → archive/benchmarks-v1.9.7}/fork.js +0 -0
  586. /package/{benchmarks → archive/benchmarks-v1.9.7}/integration.js +0 -0
  587. /package/{benchmarks → archive/benchmarks-v1.9.7}/misc.js +0 -0
@@ -0,0 +1,739 @@
1
+ const timeInLoop = require('../x/timeInLoop')
2
+ const { reduce } = require('..')
3
+ const R = require('ramda')
4
+ const _ = require('lodash')
5
+ const _fp = require('lodash/fp')
6
+ const curry4 = require('../_internal/curry4')
7
+ const curry5 = require('../_internal/curry5')
8
+ const __ = require('../_internal/placeholder')
9
+ const sha256 = require('../_internal/sha256')
10
+
11
+ const isPromise = value => value != null && typeof value.then == 'function'
12
+
13
+ const promiseResolve = Promise.resolve.bind(Promise)
14
+
15
+ const Async = func => function asyncFunction(...args) {
16
+ return promiseResolve(func(...args))
17
+ }
18
+
19
+ /**
20
+ * @name raceAddNumbers
21
+ *
22
+ * @benchmark
23
+ * rubico.reduce(add, 0)(numbers): 1e+6: 21.505ms
24
+ * ramda.reduce(add, 0)(numbers): 1e+6: 400.881ms
25
+ * lodash.fp.reduce(add, 0)(numbers): 1e+6: 256.675ms
26
+ * lodash.reduce(numbers, add, 0): 1e+6: 26.885ms
27
+ * lodash.reduce(numbers, add, 0) handicap: 1e+6: 26.512ms
28
+ *
29
+ * @note Bo5
30
+ */
31
+
32
+ {
33
+ const numbers = [1, 2, 3, 4, 5]
34
+
35
+ const add = (a, b) => a + b
36
+
37
+ const rubicoReducing = reduce(add, 0)
38
+
39
+ const ramdaReducing = R.reduce(add, 0)
40
+
41
+ const _reduce = _.reduce
42
+
43
+ const lodashFPReducing = _fp.reduce(add, 0)
44
+
45
+ const lodashReducing = numbers => _reduce(numbers, add, 0)
46
+
47
+ const lodashBoostedReducing = () => _reduce(numbers, add, 0)
48
+
49
+ // console.log(rubicoReducing(numbers))
50
+ // console.log(ramdaReducing(numbers))
51
+ // console.log(lodashFPReducing(numbers))
52
+ // console.log(lodashReducing(numbers))
53
+ // console.log(lodashBoostedReducing(numbers))
54
+
55
+ // timeInLoop('rubico.reduce(add, 0)(numbers)', 1e6, () => rubicoReducing(numbers))
56
+
57
+ // timeInLoop('ramda.reduce(add, 0)(numbers)', 1e6, () => ramdaReducing(numbers))
58
+
59
+ // timeInLoop('lodash.fp.reduce(add, 0)(numbers)', 1e6, () => lodashFPReducing(numbers))
60
+
61
+ // timeInLoop('lodash.reduce(numbers, add, 0)', 1e6, () => lodashReducing(numbers))
62
+
63
+ // timeInLoop('lodash.reduce(numbers, add, 0) handicap', 1e6, () => lodashBoostedReducing(numbers))
64
+ }
65
+
66
+ /**
67
+ * @name raceAddNumbersSet
68
+ *
69
+ * @benchmark
70
+ * rubico.reduce(add, 0)(numbers): 1e+6: 90.938ms
71
+ * ramda.reduce(add, 0)(numbers): 1e+6: 560.897ms
72
+ *
73
+ * @note Bo5
74
+ */
75
+
76
+ {
77
+ const numbers = new Set([1, 2, 3, 4, 5])
78
+
79
+ const add = (a, b) => a + b
80
+
81
+ const rubicoReducing = reduce(add, 0)
82
+
83
+ const ramdaReducing = R.reduce(add, 0)
84
+
85
+ const _reduce = _.reduce
86
+
87
+ const lodashFPReducing = _fp.reduce(add, 0)
88
+
89
+ const lodashReducing = numbers => _reduce(numbers, add, 0)
90
+
91
+ const lodashBoostedReducing = () => _reduce(numbers, add, 0)
92
+
93
+ // console.log(rubicoReducing(numbers))
94
+ // console.log(ramdaReducing(numbers))
95
+
96
+ // timeInLoop('rubico.reduce(add, 0)(numbers)', 1e6, () => rubicoReducing(numbers))
97
+
98
+ // timeInLoop('ramda.reduce(add, 0)(numbers)', 1e6, () => ramdaReducing(numbers))
99
+ }
100
+
101
+ const asyncArrayReduce = async function (array, reducer, result, index) {
102
+ const arrayLength = array.length
103
+ while (++index < arrayLength) {
104
+ result = await reducer(result, array[index])
105
+ }
106
+ return result
107
+ }
108
+
109
+ const asyncArrayReduceResultResolver = (
110
+ array, reducer, index,
111
+ ) => function resolver(result) {
112
+ return asyncArrayReduce(array, reducer, result, index)
113
+ }
114
+
115
+ const arrayReduce1 = function (array, reducer, result) {
116
+ const arrayLength = array.length
117
+ let index = -1
118
+ if (result === undefined) {
119
+ result = array[++index]
120
+ }
121
+ while (++index < arrayLength) {
122
+ result = reducer(result, array[index])
123
+ if (isPromise(result)) {
124
+ return result.then(
125
+ asyncArrayReduceResultResolver(array, reducer, index))
126
+ }
127
+ }
128
+ return result
129
+ }
130
+
131
+ asyncArrayReduce.checkPromises = async function (array, reducer, result, index) {
132
+ const arrayLength = array.length
133
+ while (++index < arrayLength) {
134
+ const intermediate = reducer(result, array[index])
135
+ result = isPromise(intermediate) ? await intermediate : intermediate
136
+ }
137
+ return result
138
+ }
139
+
140
+ asyncArrayReduceResultResolver.checkPromises = (
141
+ array, reducer, index,
142
+ ) => function resolver(result) {
143
+ return asyncArrayReduce.checkPromises(array, reducer, result, index)
144
+ }
145
+
146
+ const arrayReduce2 = function (array, reducer, result) {
147
+ const arrayLength = array.length
148
+ let index = -1
149
+ if (result === undefined) {
150
+ result = array[++index]
151
+ }
152
+ while (++index < arrayLength) {
153
+ result = reducer(result, array[index])
154
+ if (isPromise(result)) {
155
+ return result.then(
156
+ asyncArrayReduceResultResolver.checkPromises(array, reducer, index))
157
+ }
158
+ }
159
+ return result
160
+ }
161
+
162
+ /**
163
+ * @name arrayReduce
164
+ *
165
+ * @benchmark
166
+ * arrayReduce1: 1e+6: 17.136ms
167
+ * arrayReduce2: 1e+6: 17.105ms
168
+ *
169
+ * -- async
170
+ * arrayReduce1: 1e+6: 759.37ms
171
+ * arrayReduce2: 1e+6: 768.136ms
172
+ *
173
+ * @remarks
174
+ * It seems await doesn't really make a difference here when it comes to async
175
+ */
176
+
177
+ {
178
+ const numbers = [1, 2, 3, 4, 5]
179
+
180
+ const add = (a, b) => a + b
181
+
182
+ const asyncAdd = async (a, b) => a + b
183
+
184
+ // console.log(arrayReduce1(numbers, add, 0))
185
+ // console.log(arrayReduce2(numbers, add, 0))
186
+ // arrayReduce1(numbers, asyncAdd, 0).then(console.log)
187
+ // arrayReduce2(numbers, asyncAdd, 0).then(console.log)
188
+
189
+ // timeInLoop('arrayReduce1', 1e6, () => arrayReduce1(numbers, add, 0))
190
+
191
+ // timeInLoop('arrayReduce2', 1e6, () => arrayReduce2(numbers, add, 0))
192
+
193
+ // timeInLoop.async('arrayReduce1', 1e6, () => arrayReduce1(numbers, asyncAdd, 0))
194
+
195
+ // timeInLoop.async('arrayReduce2', 1e6, () => arrayReduce2(numbers, asyncAdd, 0))
196
+ }
197
+
198
+ const asyncIteratorReduce1 = async function (asyncIterator, reducer, result) {
199
+ let iteration = await asyncIterator.next()
200
+ if (iteration.done) {
201
+ return result
202
+ }
203
+ if (result === undefined) {
204
+ result = iteration.value
205
+ iteration = await asyncIterator.next()
206
+ }
207
+ while (!iteration.done) {
208
+ result = await reducer(result, iteration.value)
209
+ iteration = await asyncIterator.next()
210
+ }
211
+ return result
212
+ }
213
+
214
+ /**
215
+ * @name asyncIteratorReduce
216
+ *
217
+ * @benchmark
218
+ * asyncIteratorReduce1: 1e+5: 242.883ms
219
+ */
220
+
221
+ {
222
+ const add = (a, b) => a + b
223
+
224
+ const numbers = async function* () { yield 1; yield 2; yield 3; yield 4; yield 5 }
225
+
226
+ // asyncIteratorReduce1(numbers(), add, 0).then(console.log)
227
+
228
+ // timeInLoop.async('asyncIteratorReduce1', 1e5, () => asyncIteratorReduce1(numbers(), add, 0))
229
+ }
230
+
231
+ const asyncIteratorReduce = async function (asyncIterator, reducer, result) {
232
+ let iteration = await asyncIterator.next()
233
+ if (iteration.done) {
234
+ return result
235
+ }
236
+ if (result === undefined) {
237
+ result = iteration.value
238
+ iteration = await asyncIterator.next()
239
+ }
240
+ while (!iteration.done) {
241
+ result = await reducer(result, iteration.value)
242
+ iteration = await asyncIterator.next()
243
+ }
244
+ return result
245
+ }
246
+
247
+ const asyncIteratorReduceResultResolver = (
248
+ asyncIterator, reducer,
249
+ ) => function resolver(result) {
250
+ return asyncIteratorReduce(asyncIterator, reducer, result)
251
+ }
252
+
253
+ const iteratorReduce1 = function (iterator, reducer, result) {
254
+ let iteration = iterator.next()
255
+ if (iteration.done) {
256
+ return result
257
+ }
258
+ if (result === undefined) {
259
+ result = iteration.value
260
+ iteration = iterator.next()
261
+ }
262
+ while (!iteration.done) {
263
+ result = reducer(result, iteration.value)
264
+ if (isPromise(result)) {
265
+ return result.then(
266
+ asyncIteratorReduceResultResolver(iterator, reducer))
267
+ }
268
+ iteration = iterator.next()
269
+ }
270
+ return result
271
+ }
272
+
273
+ /**
274
+ * @name iteratorReduce
275
+ *
276
+ * @benchmark
277
+ * iteratorReduce1: 1e+5: 39.735ms
278
+ *
279
+ * -- async
280
+ * iteratorReduce1: 1e+5: 177.672ms
281
+ */
282
+
283
+ {
284
+ const add = (a, b) => a + b
285
+
286
+ const asyncAdd = async (a, b) => a + b
287
+
288
+ const numbers = function* () { yield 1; yield 2; yield 3; yield 4; yield 5 }
289
+
290
+ // console.log(iteratorReduce1(numbers(), add, 0))
291
+ // iteratorReduce1(numbers(), asyncAdd, 0).then(console.log)
292
+
293
+ // timeInLoop('iteratorReduce1', 1e5, () => iteratorReduce1(numbers(), add, 0))
294
+
295
+ // timeInLoop.async('iteratorReduce1', 1e5, () => iteratorReduce1(numbers(), asyncAdd, 0))
296
+ }
297
+
298
+ const iteratorReduce = function (iterator, reducer, result) {
299
+ let iteration = iterator.next()
300
+ if (iteration.done) {
301
+ return result
302
+ }
303
+ if (result === undefined) {
304
+ result = iteration.value
305
+ iteration = iterator.next()
306
+ }
307
+ while (!iteration.done) {
308
+ result = reducer(result, iteration.value)
309
+ if (isPromise(result)) {
310
+ return result.then(
311
+ asyncIteratorReduceResultResolver(iterator, reducer))
312
+ }
313
+ iteration = iterator.next()
314
+ }
315
+ return result
316
+ }
317
+
318
+ const objectValuesIterator = function* (object) {
319
+ for (const key in object) {
320
+ yield object[key]
321
+ }
322
+ }
323
+
324
+ const objectReduce1 = (object, reducer, result) => iteratorReduce(
325
+ objectValuesIterator(object), reducer, result)
326
+
327
+ const objectValues = Object.values
328
+
329
+ const objectReduce2 = (object, reducer, result) => arrayReduce1(
330
+ objectValues(object), reducer, result)
331
+
332
+ const objectKeys = Object.keys
333
+
334
+ const objectReduce3Async = async function (object, reducer, result, keys, index) {
335
+ const keysLength = keys.length
336
+ while (++index < keysLength) {
337
+ const key = keys[index]
338
+ result = reducer(result, object[key], key, object)
339
+ if (isPromise(result)) {
340
+ result = await result
341
+ }
342
+ }
343
+ return result
344
+ }
345
+
346
+ const objectReduce3 = function (object, reducer, result) {
347
+ const keys = objectKeys(object),
348
+ keysLength = keys.length
349
+ let index = -1
350
+ if (result === undefined) {
351
+ result = object[keys[++index]]
352
+ }
353
+ while (++index < keysLength) {
354
+ const key = keys[index]
355
+ result = reducer(result, object[key], key, object)
356
+ if (isPromise(result)) {
357
+ return result.then(curry5(objectReduce3Async, object, reducer, __, keys, index))
358
+ }
359
+ }
360
+ return result
361
+ }
362
+
363
+ /**
364
+ * @name objectReduce
365
+ *
366
+ * @benchmark
367
+ * // numbers5
368
+ * objectReduce1: 1e+6: 377.995ms
369
+ * objectReduce2: 1e+6: 288.279ms
370
+ * objectReduce3: 1e+6: 121.555ms
371
+ *
372
+ * // numbers10
373
+ * objectReduce1: 1e+6: 634.794ms
374
+ * objectReduce2: 1e+6: 422.544ms
375
+ * objectReduce3: 1e+6: 238.916ms
376
+ *
377
+ * // numericObject10
378
+ * objectReduce1: 1e+5: 121.482ms
379
+ * objectReduce2: 1e+5: 45.423ms
380
+ * objectReduce3: 1e+5: 57.031ms
381
+ *
382
+ * // hashObject10
383
+ * objectReduce1: 1e+5: 83.197ms
384
+ * objectReduce2: 1e+5: 58.986ms
385
+ * objectReduce3: 1e+5: 36.719ms
386
+ *
387
+ * // hashObject100
388
+ * objectReduce1: 1e+4: 115.869ms
389
+ * objectReduce2: 1e+4: 200.251ms
390
+ * objectReduce3: 1e+4: 62.409ms
391
+ *
392
+ * // numericObject50
393
+ * objectReduce1: 1e+5: 451.518ms
394
+ * objectReduce2: 1e+5: 86.637ms
395
+ * objectReduce3: 1e+5: 170.327ms
396
+ *
397
+ * // numericObject100
398
+ * objectReduce1: 1e+4: 100.247ms
399
+ * objectReduce2: 1e+4: 26.077ms
400
+ * objectReduce3: 1e+4: 42.457ms
401
+ *
402
+ * // numericObject1000
403
+ * objectReduce1: 1e+4: 800.712ms
404
+ * objectReduce2: 1e+4: 123.687ms
405
+ * objectReduce3: 1e+4: 305.151ms
406
+ *
407
+ * // numericObject1e4
408
+ * objectReduce1: 1e+3: 819.551ms
409
+ * objectReduce2: 1e+3: 115.656ms
410
+ * objectReduce3: 1e+3: 303.498ms
411
+ *
412
+ * // numericObject1e5
413
+ * objectReduce1: 1e+2: 1.699s
414
+ * objectReduce2: 1e+2: 179.696ms
415
+ * objectReduce3: 1e+2: 1.035s
416
+ *
417
+ * // numericObject1e6
418
+ * objectReduce1: 1e+0: 256.155ms
419
+ * objectReduce2: 1e+0: 22.112ms
420
+ * objectReduce3: 1e+0: 180.417ms
421
+ *
422
+ * // empty
423
+ * objectReduce1 - empty: 1e+6: 74.931ms
424
+ * objectReduce2: 1e+6: 25.596ms
425
+ * objectReduce3: 1e+6: 24.173ms
426
+ *
427
+ * // async numbers5
428
+ * objectReduce1: 1e+5: 194.493ms
429
+ * objectReduce2: 1e+5: 123.184ms
430
+ * objectReduce3: 1e+5: 179.193ms
431
+ *
432
+ * @remarks
433
+ * Object.keys + arrayReduce is faster than newer syntax with iterators
434
+ *
435
+ * For regular objects (not numeric ones) we progress by 3
436
+ */
437
+
438
+ {
439
+ const numbers5 = { a: 1, b: 2, c: 3, d: 4, e: 5 }
440
+
441
+ const numbers10 = {
442
+ a: 1, b: 2, c: 3, d: 4, e: 5,
443
+ f: 6, g: 7, h: 8, i: 9, j: 10,
444
+ }
445
+
446
+ const HashObject = function (size) {
447
+ const result = {}
448
+ let index = -1
449
+ while (++index < size) {
450
+ result[sha256(String(index))] = index
451
+ }
452
+ return result
453
+ }
454
+
455
+ const NumericObject = function (size) {
456
+ const result = {}
457
+ let index = -1
458
+ while (++index < size) {
459
+ result[`${index}`] = index
460
+ }
461
+ return result
462
+ }
463
+
464
+ const empty = {}
465
+
466
+ const add = (a, b) => a + b
467
+
468
+ const asyncAdd = async (a, b) => a + b
469
+
470
+ // console.log(objectReduce1(numbers5, add, 0))
471
+ // objectReduce1(numbers5, asyncAdd, 0).then(console.log)
472
+ // console.log(objectReduce2(numbers5, add, 0))
473
+ // objectReduce2(numbers5, asyncAdd, 0).then(console.log)
474
+ // console.log(objectReduce3(numbers5, add, 0))
475
+ // objectReduce3(numbers5, asyncAdd, 0).then(console.log)
476
+ // const hashObject100 = HashObject(100)
477
+ // console.log(objectReduce1(hashObject100, add, 0))
478
+ // objectReduce1(hashObject100, asyncAdd, 0).then(console.log)
479
+ // console.log(objectReduce2(hashObject100, add, 0))
480
+ // objectReduce2(hashObject100, asyncAdd, 0).then(console.log)
481
+ // console.log(objectReduce3(hashObject100, add, 0))
482
+ // objectReduce3(hashObject100, asyncAdd, 0).then(console.log)
483
+
484
+ // numbers5
485
+ // timeInLoop('objectReduce1', 1e6, () => objectReduce1(numbers5, add, 0))
486
+ // timeInLoop('objectReduce2', 1e6, () => objectReduce2(numbers5, add, 0))
487
+ // timeInLoop('objectReduce3', 1e6, () => objectReduce3(numbers5, add, 0))
488
+
489
+ // numbers10
490
+ // timeInLoop('objectReduce1', 1e6, () => objectReduce1(numbers10, add, 0))
491
+ // timeInLoop('objectReduce2', 1e6, () => objectReduce2(numbers10, add, 0))
492
+ // timeInLoop('objectReduce3', 1e6, () => objectReduce3(numbers10, add, 0))
493
+
494
+ // hashObject10
495
+ // const hashObject10 = HashObject(10)
496
+ // timeInLoop('objectReduce1', 1e5, () => objectReduce1(hashObject10, add, 0))
497
+ // timeInLoop('objectReduce2', 1e5, () => objectReduce2(hashObject10, add, 0))
498
+ // timeInLoop('objectReduce3', 1e5, () => objectReduce3(hashObject10, add, 0))
499
+
500
+ // hashObject100
501
+ // const hashObject100 = HashObject(100)
502
+ // timeInLoop('objectReduce1', 1e4, () => objectReduce1(hashObject100, add, 0))
503
+ // timeInLoop('objectReduce2', 1e4, () => objectReduce2(hashObject100, add, 0))
504
+ // timeInLoop('objectReduce3', 1e4, () => objectReduce3(hashObject100, add, 0))
505
+
506
+ // numericObject10
507
+ // const numericObject10 = NumericObject(10)
508
+ // timeInLoop('objectReduce1', 1e5, () => objectReduce1(numericObject10, add, 0))
509
+ // timeInLoop('objectReduce2', 1e5, () => objectReduce2(numericObject10, add, 0))
510
+ // timeInLoop('objectReduce3', 1e5, () => objectReduce3(numericObject10, add, 0))
511
+
512
+ // numericObject50
513
+ // const numericObject50 = NumericObject(50)
514
+ // timeInLoop('objectReduce1', 1e5, () => objectReduce1(numericObject50, add, 0))
515
+ // timeInLoop('objectReduce2', 1e5, () => objectReduce2(numericObject50, add, 0))
516
+ // timeInLoop('objectReduce3', 1e5, () => objectReduce3(numericObject50, add, 0))
517
+
518
+ // numericObject100
519
+ // const numericObject100 = NumericObject(100)
520
+ // timeInLoop('objectReduce1', 1e4, () => objectReduce1(numericObject100, add, 0))
521
+ // timeInLoop('objectReduce2', 1e4, () => objectReduce2(numericObject100, add, 0))
522
+ // timeInLoop('objectReduce3', 1e4, () => objectReduce3(numericObject100, add, 0))
523
+
524
+ // numericObject1000
525
+ // const numericObject1000 = NumericObject(1000)
526
+ // timeInLoop('objectReduce1', 1e4, () => objectReduce1(numericObject1000, add, 0))
527
+ // timeInLoop('objectReduce2', 1e4, () => objectReduce2(numericObject1000, add, 0))
528
+ // timeInLoop('objectReduce3', 1e4, () => objectReduce3(numericObject1000, add, 0))
529
+
530
+ // numericObject1e4
531
+ // const numericObject1e4 = NumericObject(1e4)
532
+ // timeInLoop('objectReduce1', 1e3, () => objectReduce1(numericObject1e4, add, 0))
533
+ // timeInLoop('objectReduce2', 1e3, () => objectReduce2(numericObject1e4, add, 0))
534
+ // timeInLoop('objectReduce3', 1e3, () => objectReduce3(numericObject1e4, add, 0))
535
+
536
+ // numericObject1e5
537
+ // const numericObject1e5 = NumericObject(1e5)
538
+ // timeInLoop('objectReduce1', 1e2, () => objectReduce1(numericObject1e5, add, 0))
539
+ // timeInLoop('objectReduce2', 1e2, () => objectReduce2(numericObject1e5, add, 0))
540
+ // timeInLoop('objectReduce3', 1e2, () => objectReduce3(numericObject1e5, add, 0))
541
+
542
+ // numericObject1e6
543
+ // const numericObject1e6 = NumericObject(1e6)
544
+ // timeInLoop('objectReduce1', 1, () => objectReduce1(numericObject1e6, add, 0))
545
+ // timeInLoop('objectReduce2', 1, () => objectReduce2(numericObject1e6, add, 0))
546
+ // timeInLoop('objectReduce3', 1, () => objectReduce3(numericObject1e6, add, 0))
547
+
548
+ // empty
549
+ // timeInLoop('objectReduce1', 1e6, () => objectReduce1(empty, add, 0))
550
+ // timeInLoop('objectReduce2', 1e6, () => objectReduce2(empty, add, 0))
551
+ // timeInLoop('objectReduce3', 1e6, () => objectReduce3(empty, add, 0))
552
+
553
+ // async numbers
554
+ // timeInLoop.async('objectReduce1', 1e5, () => objectReduce1(numbers, asyncAdd, 0))
555
+ // timeInLoop.async('objectReduce2', 1e5, () => objectReduce2(numbers, asyncAdd, 0))
556
+ // timeInLoop.async('objectReduce3', 1e5, () => objectReduce3(numbers, asyncAdd, 0))
557
+ }
558
+
559
+ // maybe dust this off for concurrent reduce
560
+ const mapReduceForEach = function (map, reducer, result) {
561
+ }
562
+
563
+ const mapReduceEntriesAsync = async function (
564
+ map, reducer, result, mapEntriesIter,
565
+ ) {
566
+ for (const [key, value] of mapEntriesIter) {
567
+ result = reducer(result, value, key, map)
568
+ if (isPromise(result)) {
569
+ result = await result
570
+ }
571
+ }
572
+ return result
573
+ }
574
+
575
+ const mapReduceEntries = function (map, reducer, result) {
576
+ const mapEntriesIter = map.entries()
577
+ if (result === undefined) {
578
+ const firstIteration = mapEntriesIter.next()
579
+ if (firstIteration.done) {
580
+ return result
581
+ }
582
+ result = firstIteration.value[1]
583
+ }
584
+ for (const [key, value] of mapEntriesIter) {
585
+ result = reducer(result, value, key, map)
586
+ if (isPromise(result)) {
587
+ return result.then(curry4(
588
+ mapReduceEntriesAsync, map, reducer, __, mapEntriesIter))
589
+ }
590
+ }
591
+ return result
592
+ }
593
+
594
+ const mapReduceEntriesArrayAsync = async function (
595
+ map, reducer, result, mapEntriesArray, index,
596
+ ) {
597
+ const mapEntriesArrayLength = mapEntriesArray.length
598
+ while (++index < mapEntriesArrayLength) {
599
+ const [key, value] = mapEntriesArray[index]
600
+ result = reducer(result, value, key, map)
601
+ if (isPromise(result)) {
602
+ result = await result
603
+ }
604
+ }
605
+ return result
606
+ }
607
+
608
+ const mapReduceEntriesArray = function (map, reducer, result) {
609
+ const mapEntriesArray = [...map.entries()],
610
+ mapEntriesArrayLength = mapEntriesArray.length
611
+ let index = -1
612
+ if (result === undefined) {
613
+ if (mapEntriesArrayLength == 0) {
614
+ return result
615
+ }
616
+ result = mapEntriesArray[++index][1]
617
+ }
618
+ while (++index < mapEntriesArrayLength) {
619
+ const [key, value] = mapEntriesArray[index]
620
+ result = reducer(result, value, key, map)
621
+ if (isPromise(result)) {
622
+ return result.then(curry5(
623
+ mapReduceEntriesArrayAsync, map, reducer, __, mapEntriesArray, index))
624
+ }
625
+ }
626
+ return result
627
+ }
628
+
629
+ /**
630
+ * @name mapReduce
631
+ *
632
+ * @benchmark
633
+ * # stringNumberMap5
634
+ * mapReduceEntries: 1e+6: 99.731ms
635
+ * mapReduceEntriesArray: 1e+6: 98.929ms
636
+ *
637
+ * # stringNumberMap10
638
+ * mapReduceEntries: 1e+6: 167.5ms
639
+ * mapReduceEntriesArray: 1e+6: 165.228ms
640
+ *
641
+ * # stringNumberMap50
642
+ * mapReduceEntries: 1e+5: 90.172ms
643
+ * mapReduceEntriesArray: 1e+5: 91.254ms
644
+ *
645
+ * # stringObjectMap5
646
+ * mapReduceEntries: 1e+6: 98.921ms
647
+ * mapReduceEntriesArray: 1e+6: 482.66ms
648
+ *
649
+ * # stringObjectMap10
650
+ * mapReduceEntries: 1e+5: 34.198ms
651
+ * mapReduceEntriesArray: 1e+5: 96.555ms
652
+ *
653
+ * # stringObjectMap50
654
+ * mapReduceEntries: 1e+5: 93.92ms
655
+ * mapReduceEntriesArray: 1e+5: 351.628ms
656
+ */
657
+
658
+ {
659
+ const add = (a, b) => a + b
660
+ const addValue = (a, b) => a + b.value
661
+
662
+ const StringNumberMap = function (size) {
663
+ const result = new Map()
664
+ let index = -1
665
+ while (++index < size) {
666
+ result.set(sha256(String(index)), index)
667
+ }
668
+ return result
669
+ }
670
+
671
+ const StringObjectMap = function (size) {
672
+ const result = new Map()
673
+ let index = -1
674
+ while (++index < size) {
675
+ const hash = sha256(String(index))
676
+ result.set(hash, { value: index })
677
+ }
678
+ return result
679
+ }
680
+
681
+ const stringNumberMap5 = StringNumberMap(5)
682
+ const stringNumberMap10 = StringNumberMap(10)
683
+ const stringNumberMap50 = StringNumberMap(50)
684
+ const stringObjectMap5 = StringObjectMap(5)
685
+ const stringObjectMap10 = StringObjectMap(10)
686
+ const stringObjectMap50 = StringObjectMap(50)
687
+ // console.log(mapReduceEntries(stringNumberMap5, add, 0))
688
+ // console.log(mapReduceEntries(stringNumberMap5, add))
689
+ // console.log(mapReduceEntriesArray(stringNumberMap5, add, 0))
690
+ // console.log(mapReduceEntriesArray(stringNumberMap5, add))
691
+ // console.log(mapReduceEntries(stringObjectMap5, addValue, 0))
692
+
693
+ // timeInLoop('mapReduceEntries', 1e6, () => mapReduceEntries(stringNumberMap5, add, 0))
694
+ // timeInLoop('mapReduceEntriesArray', 1e6, () => mapReduceEntries(stringNumberMap5, add, 0))
695
+ // timeInLoop('mapReduceEntries', 1e6, () => mapReduceEntries(stringNumberMap10, add, 0))
696
+ // timeInLoop('mapReduceEntriesArray', 1e6, () => mapReduceEntries(stringNumberMap10, add, 0))
697
+ // timeInLoop('mapReduceEntries', 1e5, () => mapReduceEntries(stringNumberMap50, add, 0))
698
+ // timeInLoop('mapReduceEntriesArray', 1e5, () => mapReduceEntries(stringNumberMap50, add, 0))
699
+
700
+ // timeInLoop('mapReduceEntries', 1e6, () => mapReduceEntries(stringObjectMap5, addValue, 0))
701
+ // timeInLoop('mapReduceEntriesArray', 1e6, () => mapReduceEntriesArray(stringObjectMap5, addValue, 0))
702
+ // timeInLoop('mapReduceEntries', 1e5, () => mapReduceEntries(stringObjectMap10, addValue, 0))
703
+ // timeInLoop('mapReduceEntriesArray', 1e5, () => mapReduceEntriesArray(stringObjectMap10, addValue, 0))
704
+ // timeInLoop('mapReduceEntries', 1e5, () => mapReduceEntries(stringObjectMap50, addValue, 0))
705
+ // timeInLoop('mapReduceEntriesArray', 1e5, () => mapReduceEntriesArray(stringObjectMap50, addValue, 0))
706
+ }
707
+
708
+ /**
709
+ * @name combinedReducer
710
+ *
711
+ * @benchmark
712
+ * combinedReducingFunction1: 1e+6: 420.432ms
713
+ * combinedReducingFunction2: 1e+6: 418.762ms
714
+ */
715
+
716
+ {
717
+ const reducers = [
718
+ (state, action) => action.type == 'A' ? { ...state, A: true } : state,
719
+ (state, action) => action.type == 'B' ? { ...state, B: true } : state,
720
+ (state, action) => action.type == 'C' ? { ...state, C: true } : state,
721
+ ]
722
+ const combinedReducingFunction1 = reduce(
723
+ (reducingFunc, reducer) => reducingFunc(reducer),
724
+ () => reduce(result => result, () => ({})),
725
+ )(reducers)
726
+
727
+ const combinedReducingFunction2 = reduce(
728
+ result => result, () => ({}),
729
+ )(...reducers)
730
+
731
+ const actions = [{ type: 'A' }, { type: 'B' }, { type: 'C' }]
732
+
733
+ // console.log(combinedReducingFunction1(actions))
734
+ // console.log(combinedReducingFunction2(actions))
735
+
736
+ // timeInLoop('combinedReducingFunction1', 1e6, () => combinedReducingFunction1(actions))
737
+
738
+ // timeInLoop('combinedReducingFunction2', 1e6, () => combinedReducingFunction2(actions))
739
+ }