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
package/.eslintignore ADDED
@@ -0,0 +1,5 @@
1
+ archive
2
+ dist
3
+ es.js
4
+ index.js
5
+ benchmarks
package/.eslintrc.js CHANGED
@@ -192,7 +192,7 @@ module.exports = {
192
192
  'allowForLoopAfterthoughts': true
193
193
  }
194
194
  ],
195
- 'no-process-env': 'error',
195
+ 'no-process-env': 'off',
196
196
  'no-process-exit': 'error',
197
197
  'no-promise-executor-return': 'off',
198
198
  'no-proto': 'error',
@@ -209,7 +209,8 @@ module.exports = {
209
209
  'no-sequences': 'off',
210
210
  'no-shadow': 'off',
211
211
  'no-spaced-func': 'error',
212
- 'no-sync': 'error',
212
+ 'no-sparse-arrays': 'off',
213
+ 'no-sync': 'off',
213
214
  'no-tabs': 'error',
214
215
  'no-template-curly-in-string': 'error',
215
216
  'no-ternary': 'off',
@@ -16,7 +16,7 @@ jobs:
16
16
 
17
17
  strategy:
18
18
  matrix:
19
- node-version: [14.x, 15.x, 16.x, 17.x, 18.x]
19
+ node-version: [16.x, 18.x, 20.x]
20
20
 
21
21
  steps:
22
22
  - uses: actions/checkout@v2
@@ -0,0 +1,19 @@
1
+ const reducerConcat = require('./_internal/reducerConcat')
2
+ const identity = require('./_internal/identity')
3
+
4
+ /**
5
+ * @name AggregateReducer
6
+ *
7
+ * @synopsis
8
+ * ```coffeescript [specscript]
9
+ * AggregateReducer(reducers Array<reducer function>) -> aggregateReducer function
10
+ * ```
11
+ */
12
+ const AggregateReducer = function (reducers) {
13
+ if (reducers.length == 0) {
14
+ return identity
15
+ }
16
+ return reducers.reduce(reducerConcat, identity)
17
+ }
18
+
19
+ module.exports = AggregateReducer
@@ -0,0 +1,82 @@
1
+ const assert = require('assert')
2
+ const reduce = require('./reduce')
3
+ const AggregateReducer = require('./AggregateReducer')
4
+
5
+ describe('AggregateReducer', () => {
6
+ it('Combines reducers', async () => {
7
+ const reducerA = (state, action) => {
8
+ if (action.type == 'A') {
9
+ return { ...state, A: true }
10
+ }
11
+ return state
12
+ }
13
+ const reducerB = (state, action) => {
14
+ if (action.type == 'B') {
15
+ return { ...state, B: true }
16
+ }
17
+ return state
18
+ }
19
+ const reducerC = (state, action) => {
20
+ if (action.type == 'C') {
21
+ return { ...state, C: true }
22
+ }
23
+ return state
24
+ }
25
+
26
+ const combinedReducer = AggregateReducer([
27
+ reducerA,
28
+ reducerB,
29
+ reducerC,
30
+ ])
31
+
32
+ const stateA = [{ type: 'A' }].reduce(combinedReducer, {})
33
+ assert.deepEqual(stateA, { A: true })
34
+
35
+ const stateAB = [{ type: 'A' }, { type: 'B' }].reduce(combinedReducer, {})
36
+ assert.deepEqual(stateAB, { A: true, B: true })
37
+
38
+ const stateABC = [{ type: 'A' }, { type: 'B' }, { type: 'C' }].reduce(combinedReducer, {})
39
+ assert.deepEqual(stateABC, { A: true, B: true, C: true })
40
+ })
41
+
42
+ it('Combines async reducers', async () => {
43
+ const reducerA = async (state, action) => {
44
+ if (action.type == 'A') {
45
+ return { ...state, A: true }
46
+ }
47
+ return state
48
+ }
49
+ const reducerB = async (state, action) => {
50
+ if (action.type == 'B') {
51
+ return { ...state, B: true }
52
+ }
53
+ return state
54
+ }
55
+ const reducerC = async (state, action) => {
56
+ if (action.type == 'C') {
57
+ return { ...state, C: true }
58
+ }
59
+ return state
60
+ }
61
+
62
+ const combinedReducer = AggregateReducer([
63
+ reducerA,
64
+ reducerB,
65
+ reducerC,
66
+ ])
67
+
68
+ const stateA = await reduce([{ type: 'A' }], combinedReducer, {})
69
+ assert.deepEqual(stateA, { A: true })
70
+
71
+ const stateAB = await reduce([{ type: 'A' }, { type: 'B' }], combinedReducer, {})
72
+ assert.deepEqual(stateAB, { A: true, B: true })
73
+
74
+ const stateABC = await reduce([{ type: 'A' }, { type: 'B' }, { type: 'C' }], combinedReducer, {})
75
+ assert.deepEqual(stateABC, { A: true, B: true, C: true })
76
+ })
77
+
78
+ it('Identity', async () => {
79
+ const identity = AggregateReducer([])
80
+ assert.equal(1, identity(1))
81
+ })
82
+ })
package/CHANGELOG.md CHANGED
@@ -1,4 +1,25 @@
1
- ## v1.9.3 - latest
1
+ ## v2.0.0
2
+ * Refactor all transducer functionality into Transducer.js from `pipe`, `map`, `filter`, and `flatMap`
3
+ * Remove GeneratorFunction and AsyncGeneratorFunction functionality in `map`, `filter`, `flatMap`, and `reduce`
4
+ * Refactor reducer chaining functionality into AggregateReducer.js from `reduce`
5
+ * Remove Duplex stream handling from `flatMap`
6
+ * Remove binary handling from `flatMap`
7
+ * Promises as arguments for all core functions
8
+ * Eager API for all core functions
9
+ * Automate benchmarks
10
+ * Remove the .sync property functions
11
+ * Remove the .withIndex property functions
12
+ * Deprecate map.own
13
+ * `fork` renamed to `all`
14
+ * `all` renamed to `every`
15
+ * `any` renamed to `some`
16
+ * new `dist-test` only validates syntax with `require`
17
+ * migrate `forEach` into core API.
18
+ * refactor transducer functionality from `forEach` into `Transducer.forEach`
19
+ * async performance improvements
20
+ * `_internal/arrayExtend` stops treating strings like arrays so `transform` creates arrays of strings as expected
21
+
22
+ ## v1.9.3
2
23
  * property value passed to set may be a resolver - [#224](https://github.com/a-synchronous/rubico/pull/224)
3
24
  * rubico/x/isIn - counterpart to includes - [#228](https://github.com/a-synchronous/rubico/pull/228) - [lulldev](https://github.com/lulldev)
4
25
  * rubico/x/maxBy - finds the item that is the max by a property denoted by path - [#229](https://github.com/a-synchronous/rubico/pull/229)
package/Transducer.js CHANGED
@@ -1,3 +1,11 @@
1
+ const funcConcat = require('./_internal/funcConcat')
2
+ const reducerMap = require('./_internal/reducerMap')
3
+ const reducerFilter = require('./_internal/reducerFilter')
4
+ const reducerFlatMap = require('./_internal/reducerFlatMap')
5
+ const reducerForEach = require('./_internal/reducerForEach')
6
+ const curry2 = require('./_internal/curry2')
7
+ const __ = require('./_internal/placeholder')
8
+
1
9
  /**
2
10
  * @name Transducer
3
11
  *
@@ -6,45 +14,39 @@
6
14
  */
7
15
  const Transducer = {}
8
16
 
9
- /**
10
- * @name Transducer.pipe
11
- *
12
- * @description
13
- * Composes transducers
14
- */
15
- Transducer.pipe = function () {}
16
-
17
17
  /**
18
18
  * @name Transducer.map
19
19
  *
20
+ * @synopsis
21
+ * ```coffeescript [specscript]
22
+ * type Reducer = (accumulator any, item any)=>(nextAccumulator Promise|any)
23
+ * type Transducer = Reducer=>Reducer
24
+ *
25
+ * Transducer.map(mapperFunc function) -> mappingTransducer Transducer
26
+ * ```
27
+ *
20
28
  * @description
21
- * Create a mapping transducer by supplying `map` with a reducer. A reducer is a variadic function that depicts a relationship between an accumulator and any number of arguments. A transducer is a function that accepts a reducer as an argument and returns another reducer.
29
+ * Creates a mapping transducer with a provided reducer. A reducer is a variadic function that depicts a relationship between an accumulator and any number of arguments. A transducer is a function that accepts a reducer as an argument and returns another reducer.
22
30
  *
23
31
  * ```coffeescript [specscript]
24
- * Reducer<T> = (any, T)=>Promise|any
32
+ * type Reducer = (accumulator any, item any)=>(nextAccumulator Promise|any)
25
33
  *
26
- * Transducer = Reducer=>Reducer
34
+ * type Transducer = Reducer=>Reducer
27
35
  * ```
28
36
  *
29
- * The transducer signature enables chaining functionality for reducers. `map` is core to this mechanism, and provides a way via transducers to transform items of reducers. To `map`, reducers are just another category.
37
+ * The transducer signature enables chaining functionality for reducers. `map` is core to this mechanism, and provides a way via transducers to transform the items of reducers.
30
38
  *
31
39
  * ```javascript [playground]
32
40
  * const square = number => number ** 2
33
41
  *
34
42
  * const concat = (array, item) => array.concat(item)
35
43
  *
36
- * const mapSquare = map(square)
37
- * // mapSquare could potentially be a transducer, but at this point, it is
38
- * // undifferentiated and not necessarily locked in to transducer behavior.
39
- *
40
- * console.log(
41
- * mapSquare([1, 2, 3, 4, 5]),
42
- * ) // [1, 4, 9, 16, 25]
44
+ * const mapSquare = Transducer.map(square)
45
+ * // mapSquare is a transducer
43
46
  *
44
47
  * const squareConcatReducer = mapSquare(concat)
45
- * // now mapSquare is passed the function concat, so it assumes transducer
46
- * // position. squareConcatReducer is a reducer with chained functionality
47
- * // square and concat.
48
+ * // now mapSquare is passed the reducer function concat; squareConcatReducer
49
+ * // is a reducer with chained functionality square and concat
48
50
  *
49
51
  * console.log(
50
52
  * [1, 2, 3, 4, 5].reduce(squareConcatReducer, []),
@@ -55,12 +57,33 @@ Transducer.pipe = function () {}
55
57
  * ) // '1491625'
56
58
  * ```
57
59
  *
60
+ * Create reducers with chained functionality by using the `Transducer.map` eager API.
61
+ *
62
+ * ```javascript [playground]
63
+ * const square = number => number ** 2
64
+ *
65
+ * const concat = (array, item) => array.concat(item)
66
+ *
67
+ * const squareConcatReducer = Transducer.map(concat, square)
68
+ * // now mapSquare is passed the reducer function concat; squareConcatReducer
69
+ * // is a reducer with chained functionality square and concat
70
+ * ```
58
71
  */
59
- Transducer.map = function map() {}
72
+ Transducer.map = function transducerMap(mapper) {
73
+ return curry2(reducerMap, __, mapper)
74
+ }
60
75
 
61
76
  /**
62
77
  * @name Transducer.filter
63
78
  *
79
+ * @synopsis
80
+ * ```coffeescript [specscript]
81
+ * type Reducer = (accumulator any, item any)=>(nextAccumulator Promise|any)
82
+ * type Transducer = Reducer=>Reducer
83
+ *
84
+ * Transducer.filter(predicate function) -> filteringTransducer Transducer
85
+ * ```
86
+ *
64
87
  * @description
65
88
  * A reducer in filterable position creates a filtering reducer - one that skips items of the reducer's reducing operation if they test falsy by the predicate. It is possible to use an asynchronous predicate when filtering a reducer, however the implementation of `reduce` must support asynchronous operations. This library provides such an implementation as `reduce`.
66
89
  *
@@ -76,14 +99,19 @@ Transducer.map = function map() {}
76
99
  * ) // [1, 3, 5]
77
100
  * ```
78
101
  */
79
- Transducer.filter = function filter() {}
102
+ Transducer.filter = function transducerFilter(predicate) {
103
+ return curry2(reducerFilter, __, predicate)
104
+ }
80
105
 
81
106
  /**
82
107
  * @name Transducer.flatMap
83
108
  *
84
109
  * @synopsis
85
110
  * ```coffeescript [specscript]
86
- * flatMap(flatMapper)(reducer) -> Reducer<T>
111
+ * type Reducer = (accumulator any, item any)=>(nextAccumulator Promise|any)
112
+ * type Transducer = Reducer=>Reducer
113
+ *
114
+ * Transducer.flatMap(flatMapper) -> flatMappingTransducer Transducer
87
115
  * ```
88
116
  *
89
117
  * @description
@@ -108,6 +136,27 @@ Transducer.filter = function filter() {}
108
136
  *
109
137
  * In the case above, each item of the array of numbers returned by `powers` is called with the reducer `arrayConcat` for flattening into the final result.
110
138
  */
111
- Transducer.flatMap = function flatMap() {}
139
+ Transducer.flatMap = function transducerFlatMap(flatMapper) {
140
+ return curry2(reducerFlatMap, __, flatMapper)
141
+ }
142
+
143
+ /**
144
+ * @name Transducer.forEach
145
+ *
146
+ * @synopsis
147
+ * ```coffeescript [specscript]
148
+ * type Reducer = (accumulator any, item any)=>(nextAccumulator Promise|any)
149
+ * type Transducer = Reducer=>Reducer
150
+ *
151
+ * Transducer.forEach(func function) -> forEachTransducer Transducer
152
+ * ```
153
+ */
154
+ Transducer.forEach = function transducerForEach(func) {
155
+ return curry2(reducerForEach, __, func)
156
+ }
157
+
158
+ Transducer.passthrough = function transducerPassthrough(reducer) {
159
+ return reducer
160
+ }
112
161
 
113
162
  module.exports = Transducer
@@ -0,0 +1,117 @@
1
+ const assert = require('assert')
2
+ const Transducer = require('./Transducer')
3
+ const compose = require('./compose')
4
+ const reduce = require('./reduce')
5
+ const transform = require('./transform')
6
+
7
+ describe('Transducer', () => {
8
+ const ade = assert.deepEqual
9
+ const ase = assert.strictEqual
10
+ const aok = assert.ok
11
+
12
+ describe('integration: transducers from Transducer.map, Transducer.filter, Transducer.flatMap', () => {
13
+ const concat = (y, xi) => y.concat(xi)
14
+ const add = (y, xi) => y + xi
15
+ const isOdd = number => number % 2 == 1
16
+
17
+ it('reduce with sync transduced reducers', async () => {
18
+ const squareOdds = compose([
19
+ Transducer.filter(isOdd),
20
+ Transducer.map(x => x ** 2),
21
+ ])
22
+ ade(
23
+ reduce(squareOdds(concat), [])([1, 2, 3, 4, 5]),
24
+ [1, 9, 25],
25
+ )
26
+ ade(
27
+ reduce(squareOdds((y, xi) => y.add(xi)), new Set())([1, 2, 3, 4, 5]),
28
+ new Set([1, 9, 25]),
29
+ )
30
+ const appendAlphas = compose([
31
+ Transducer.map(x => `${x}a`),
32
+ Transducer.map(x => `${x}b`),
33
+ Transducer.map(x => `${x}c`),
34
+ ])
35
+ ase(
36
+ reduce(appendAlphas(add), '')('123'),
37
+ '1abc2abc3abc',
38
+ )
39
+ ade(
40
+ reduce(appendAlphas(concat), [])('123'),
41
+ ['1abc', '2abc', '3abc'],
42
+ )
43
+ })
44
+
45
+ it('reduce with an async transduced reducer', async () => {
46
+ const hosWithHey = compose([
47
+ Transducer.filter(async x => x === 'ho'),
48
+ Transducer.map(x => Promise.resolve(`${x}hey`)),
49
+ ])
50
+ const hihos = { a: 'hi', b: 'ho', c: 'hi', d: 'ho', e: 'hi', f: 'ho' }
51
+ aok(reduce(hosWithHey(add), '')(hihos) instanceof Promise),
52
+ aok(reduce(hosWithHey(concat), [])(hihos) instanceof Promise),
53
+ ase(
54
+ await reduce(hosWithHey(add), '')(hihos),
55
+ 'hoheyhoheyhohey',
56
+ )
57
+ ade(
58
+ await reduce(hosWithHey(concat), [])(hihos),
59
+ ['hohey', 'hohey', 'hohey'],
60
+ )
61
+ })
62
+
63
+ it('flatMapping transducer', async () => {
64
+ const createOddMultiplesSync = compose([
65
+ Transducer.filter(isOdd),
66
+ Transducer.flatMap(number => [number * 2, number * 3]),
67
+ ])
68
+
69
+ ase(
70
+ reduce([1, 2, 3], createOddMultiplesSync(add), 0),
71
+ 2 + 3 + 6 + 9,
72
+ )
73
+ ade(
74
+ reduce([1, 2, 3], createOddMultiplesSync(concat), []),
75
+ [2, 3, 6, 9],
76
+ )
77
+
78
+ const createOddMultiplesAsync = compose([
79
+ Transducer.filter(isOdd),
80
+ Transducer.flatMap(async number => [number * 2, number * 3]),
81
+ ])
82
+
83
+ const p1 = reduce([1, 2, 3], createOddMultiplesAsync(add), 0)
84
+ aok(p1 instanceof Promise)
85
+ const p2 = reduce([1, 2, 3], createOddMultiplesAsync(concat), [])
86
+ aok(p2 instanceof Promise)
87
+ await p1.then(result => {
88
+ ase(result, 2 + 3 + 6 + 9)
89
+ })
90
+ await p2.then(result => {
91
+ ade(result, [2, 3, 6, 9])
92
+ })
93
+ })
94
+
95
+ it('forEach transducer', async () => {
96
+ let sum1 = 0
97
+ reduce([1, 2, 3, 4, 5], Transducer.forEach(number => {
98
+ sum1 += number
99
+ })(() => {}), null)
100
+ assert.equal(sum1, 15)
101
+
102
+ let sum2 = 0
103
+ await reduce([1, 2, 3, 4, 5], Transducer.forEach(async number => {
104
+ sum2 += number
105
+ })(() => {}), null)
106
+ assert.equal(sum2, 15)
107
+ })
108
+
109
+ it('passthrough transducer', async () => {
110
+ assert.deepEqual(
111
+ transform({ a: 1, b: 2, c: 3 }, Transducer.passthrough, []),
112
+ [1, 2, 3],
113
+ )
114
+ })
115
+ })
116
+
117
+ })
@@ -0,0 +1,68 @@
1
+ const isPromise = require('./isPromise')
2
+ const areAnyValuesPromises = require('./areAnyValuesPromises')
3
+ const __ = require('./placeholder')
4
+ const curry4 = require('./curry4')
5
+ const curryArgs4 = require('./curryArgs4')
6
+ const spread2 = require('./spread2')
7
+ const promiseAll = require('./promiseAll')
8
+ const leftResolverRightResolverCompare = require('./leftResolverRightResolverCompare')
9
+ const leftResolverRightValueCompare = require('./leftResolverRightValueCompare')
10
+ const leftValueRightResolverCompare = require('./leftValueRightResolverCompare')
11
+
12
+ // ComparisonOperator(comparator function) -> operator function
13
+ const ComparisonOperator = comparator => function operator(...args) {
14
+ const right = args.pop()
15
+ const left = args.pop()
16
+ const isLeftResolver = typeof left == 'function',
17
+ isRightResolver = typeof right == 'function'
18
+
19
+ if (isLeftResolver && isRightResolver) {
20
+ if (args.length == 0) {
21
+ return curryArgs4(
22
+ leftResolverRightResolverCompare, __, comparator, left, right,
23
+ )
24
+ }
25
+ if (areAnyValuesPromises(args)) {
26
+ return promiseAll(args).then(curry4(
27
+ leftResolverRightResolverCompare, __, comparator, left, right,
28
+ ))
29
+ }
30
+ return leftResolverRightResolverCompare(args, comparator, left, right)
31
+ }
32
+
33
+ if (isLeftResolver) {
34
+ if (args.length == 0) {
35
+ return curryArgs4(
36
+ leftResolverRightValueCompare, __, comparator, left, right,
37
+ )
38
+ }
39
+ if (areAnyValuesPromises(args)) {
40
+ return promiseAll(args).then(curry4(
41
+ leftResolverRightValueCompare, __, comparator, left, right,
42
+ ))
43
+ }
44
+ return leftResolverRightValueCompare(args, comparator, left, right)
45
+ }
46
+
47
+ if (isRightResolver) {
48
+ if (args.length == 0) {
49
+ return curryArgs4(
50
+ leftValueRightResolverCompare, __, comparator, left, right,
51
+ )
52
+ }
53
+ if (areAnyValuesPromises(args)) {
54
+ return promiseAll(args).then(curry4(
55
+ leftValueRightResolverCompare, __, comparator, left, right,
56
+ ))
57
+ }
58
+ return leftValueRightResolverCompare(args, comparator, left, right)
59
+ }
60
+
61
+ if (isPromise(left) || isPromise(right)) {
62
+ return promiseAll([left, right]).then(spread2(comparator))
63
+ }
64
+ return comparator(left, right)
65
+ }
66
+
67
+
68
+ module.exports = ComparisonOperator
@@ -0,0 +1,41 @@
1
+ const fs = require('fs')
2
+
3
+ /**
4
+ * @name File
5
+ *
6
+ * @synopsis
7
+ * ```coffeescript [specscript]
8
+ * new File(path string) -> File
9
+ * ```
10
+ */
11
+ const File = function (path) {
12
+ this.path = path
13
+ this.writeStream = fs.createWriteStream(path)
14
+ return this
15
+ }
16
+
17
+ /**
18
+ * @name File.prototype.write
19
+ *
20
+ * @synopsis
21
+ * ```coffeescript [specscript]
22
+ * new File(...).write(str string) -> ()
23
+ * ```
24
+ */
25
+ File.prototype.write = function (str) {
26
+ this.writeStream.write(str)
27
+ }
28
+
29
+ /**
30
+ * @name File.prototype.rm
31
+ *
32
+ * @synopsis
33
+ * ```coffeescript [specscript]
34
+ * new File(...).rm() -> Promise<>
35
+ * ```
36
+ */
37
+ File.prototype.rm = async function () {
38
+ await fs.promises.rm(this.path)
39
+ }
40
+
41
+ module.exports = File
@@ -2,7 +2,7 @@ const isPromise = require('./isPromise')
2
2
  const genericReduce = require('./genericReduce')
3
3
  const symbolAsyncIterator = require('./symbolAsyncIterator')
4
4
  const arrayPush = require('./arrayPush')
5
- const curryArgs3 = require('./curryArgs3')
5
+ const curry3 = require('./curry3')
6
6
  const __ = require('./placeholder')
7
7
  const promiseRace = require('./promiseRace')
8
8
  const sleep = require('./sleep')
@@ -55,12 +55,12 @@ const FlatMappingAsyncIterator = function (asyncIterator, flatMapper) {
55
55
  } else {
56
56
  const monad = flatMapper(value)
57
57
  if (isPromise(monad)) {
58
- const bufferLoading = monad.then(
59
- curryArgs3(genericReduce, __, arrayPush, buffer))
58
+ const bufferLoading =
59
+ monad.then(curry3(genericReduce, __, arrayPush, buffer))
60
60
  const promise = bufferLoading.then(() => promises.delete(promise))
61
61
  promises.add(promise)
62
62
  } else {
63
- const bufferLoading = genericReduce([monad], arrayPush, buffer)
63
+ const bufferLoading = genericReduce(monad, arrayPush, buffer)
64
64
  if (isPromise(bufferLoading)) {
65
65
  const promise = bufferLoading.then(() => promises.delete(promise))
66
66
  promises.add(promise)
@@ -31,7 +31,7 @@ const FlatMappingIterator = function (iterator, flatMapper) {
31
31
  return iteration
32
32
  }
33
33
  const monadAsArray = genericReduce(
34
- [flatMapper(iteration.value)],
34
+ flatMapper(iteration.value),
35
35
  arrayPush,
36
36
  []) // this will always have at least one item
37
37
  if (monadAsArray.length > 1) {