rubico 1.9.7 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (593) 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/README.md +158 -81
  8. package/Transducer.js +75 -26
  9. package/Transducer.test.js +117 -0
  10. package/_internal/ComparisonOperator.js +68 -0
  11. package/_internal/File.js +41 -0
  12. package/_internal/FlatMappingAsyncIterator.js +4 -4
  13. package/_internal/FlatMappingIterator.js +1 -1
  14. package/_internal/TimeInLoopSuite.js +138 -0
  15. package/_internal/areAnyValuesPromises.js +23 -0
  16. package/_internal/{arrayAll.js → arrayEvery.js} +4 -4
  17. package/_internal/arrayExtend.js +3 -2
  18. package/_internal/arrayFilter.js +3 -4
  19. package/_internal/{arrayAny.js → arraySome.js} +8 -8
  20. package/_internal/{asyncIteratorAll.js → asyncIteratorEvery.js} +4 -4
  21. package/_internal/{asyncIteratorAny.js → asyncIteratorSome.js} +4 -4
  22. package/_internal/curry4.test.js +25 -0
  23. package/_internal/curry5.test.js +29 -0
  24. package/_internal/curryArgs2.js +43 -0
  25. package/_internal/curryArgs3.test.js +21 -0
  26. package/_internal/curryArgs4.js +65 -0
  27. package/_internal/curryArgs4.test.js +25 -0
  28. package/_internal/equals.js +13 -0
  29. package/_internal/findAllFilePaths.js +22 -0
  30. package/_internal/funcApply.js +2 -0
  31. package/_internal/funcCall.js +14 -0
  32. package/_internal/functionArrayAll.js +26 -0
  33. package/_internal/functionArrayAllSeries.js +55 -0
  34. package/_internal/functionObjectAll.js +32 -0
  35. package/_internal/genericReduce.js +4 -22
  36. package/_internal/genericTransform.js +15 -15
  37. package/_internal/improvedGenericTransform.js +93 -0
  38. package/_internal/{iteratorAll.js → iteratorEvery.js} +4 -4
  39. package/_internal/{iteratorAny.js → iteratorSome.js} +6 -6
  40. package/_internal/leftResolverRightResolverCompare.js +19 -0
  41. package/_internal/leftResolverRightValueCompare.js +16 -0
  42. package/_internal/leftValueRightResolverCompare.js +16 -0
  43. package/_internal/objectReduce.js +0 -1
  44. package/_internal/pathResolve.js +6 -0
  45. package/_internal/{reducerAll.js → reducerEvery.js} +4 -4
  46. package/_internal/reducerFlatMap.js +4 -4
  47. package/_internal/reducerFlatten.js +1 -1
  48. package/_internal/{reducerAny.js → reducerSome.js} +4 -4
  49. package/_internal/timeInLoop.js +37 -0
  50. package/_internal/timeInLoop.test.js +18 -0
  51. package/_internal/timeInLoopAsync.js +35 -0
  52. package/_internal/timeInLoopAsync.test.js +22 -0
  53. package/all.js +106 -40
  54. package/and.js +54 -36
  55. package/archive/{FlatMappingIteratorCool.js → FlatMappingIterator-2020-09-28.js} +1 -1
  56. package/archive/_Promise-2023-05-29.js +93 -0
  57. package/archive/arrayMap2-2023-05-29.js +73 -0
  58. package/archive/benchmarks-v1.9.7/all.js +34 -0
  59. package/archive/benchmarks-v1.9.7/and.js +24 -0
  60. package/archive/benchmarks-v1.9.7/assign.js +174 -0
  61. package/archive/benchmarks-v1.9.7/curry.js +55 -0
  62. package/archive/benchmarks-v1.9.7/eq.js +25 -0
  63. package/archive/benchmarks-v1.9.7/filter.js +1322 -0
  64. package/archive/benchmarks-v1.9.7/flatMap.js +48 -0
  65. package/archive/benchmarks-v1.9.7/get.js +44 -0
  66. package/archive/benchmarks-v1.9.7/gt.js +25 -0
  67. package/archive/benchmarks-v1.9.7/gte.js +25 -0
  68. package/archive/benchmarks-v1.9.7/lt.js +25 -0
  69. package/archive/benchmarks-v1.9.7/lte.js +25 -0
  70. package/archive/benchmarks-v1.9.7/map.js +892 -0
  71. package/archive/benchmarks-v1.9.7/omit.js +28 -0
  72. package/archive/benchmarks-v1.9.7/or.js +51 -0
  73. package/archive/benchmarks-v1.9.7/pick.js +24 -0
  74. package/archive/benchmarks-v1.9.7/pipe.js +152 -0
  75. package/archive/benchmarks-v1.9.7/reduce.js +739 -0
  76. package/archive/benchmarks-v1.9.7/switchCase.js +256 -0
  77. package/archive/benchmarks-v1.9.7/tap.js +90 -0
  78. package/archive/benchmarks-v1.9.7/transform.js +218 -0
  79. package/archive/benchmarks-v1.9.7/tryCatch.js +108 -0
  80. package/assign.js +18 -8
  81. package/bench +65 -0
  82. package/benchmark-output/v1.9.7 +268 -0
  83. package/benchmarks/all.async.js +43 -0
  84. package/benchmarks/all.js +42 -33
  85. package/benchmarks/always.js +15 -0
  86. package/benchmarks/and.async.js +25 -0
  87. package/benchmarks/and.js +20 -19
  88. package/benchmarks/assign.async.js +27 -0
  89. package/benchmarks/assign.js +20 -167
  90. package/benchmarks/curry.js +34 -54
  91. package/benchmarks/eq.async.js +23 -0
  92. package/benchmarks/eq.js +17 -19
  93. package/benchmarks/every.async.js +19 -0
  94. package/benchmarks/every.js +19 -0
  95. package/benchmarks/filter.async.js +32 -0
  96. package/benchmarks/filter.js +27 -1311
  97. package/benchmarks/flatMap.async.js +26 -0
  98. package/benchmarks/flatMap.js +26 -36
  99. package/benchmarks/get.async.js +19 -0
  100. package/benchmarks/get.js +27 -32
  101. package/benchmarks/gt.async.js +23 -0
  102. package/benchmarks/gt.js +17 -19
  103. package/benchmarks/gte.async.js +23 -0
  104. package/benchmarks/gte.js +17 -19
  105. package/benchmarks/lt.async.js +23 -0
  106. package/benchmarks/lt.js +17 -19
  107. package/benchmarks/lte.async.js +23 -0
  108. package/benchmarks/lte.js +17 -19
  109. package/benchmarks/map.async.js +43 -0
  110. package/benchmarks/map.js +24 -876
  111. package/benchmarks/misc/Promise.js +26 -0
  112. package/benchmarks/misc/isPromise.js +30 -0
  113. package/benchmarks/misc/promiseAll.js +36 -0
  114. package/benchmarks/not.js +23 -0
  115. package/benchmarks/omit.js +30 -20
  116. package/benchmarks/or.async.js +25 -0
  117. package/benchmarks/or.js +23 -49
  118. package/benchmarks/pick.js +30 -16
  119. package/benchmarks/pipe.async.js +47 -0
  120. package/benchmarks/pipe.js +46 -151
  121. package/benchmarks/reduce.async.js +32 -0
  122. package/benchmarks/reduce.js +27 -728
  123. package/benchmarks/set.async.js +19 -0
  124. package/benchmarks/set.js +41 -0
  125. package/benchmarks/some.async.js +19 -0
  126. package/benchmarks/some.js +19 -0
  127. package/benchmarks/switchCase.async.js +27 -0
  128. package/benchmarks/switchCase.js +55 -256
  129. package/benchmarks/tap.js +10 -85
  130. package/benchmarks/thunkify.js +15 -0
  131. package/benchmarks/transform.async.js +27 -0
  132. package/benchmarks/transform.js +28 -206
  133. package/benchmarks/tryCatch.async.js +25 -0
  134. package/benchmarks/tryCatch.js +24 -100
  135. package/build +472 -0
  136. package/compose.js +46 -0
  137. package/dist/Transducer.es.js +481 -0
  138. package/dist/Transducer.es.min.js +7 -0
  139. package/dist/Transducer.js +488 -0
  140. package/dist/Transducer.min.js +8 -0
  141. package/dist/Transducer.mjs +481 -0
  142. package/dist/__.es.js +2 -2
  143. package/dist/__.es.min.js +2 -2
  144. package/dist/__.js +2 -2
  145. package/dist/__.min.js +2 -2
  146. package/dist/__.mjs +2 -2
  147. package/dist/all.es.js +173 -92
  148. package/dist/all.es.min.js +3 -3
  149. package/dist/all.js +173 -92
  150. package/dist/all.min.js +3 -3
  151. package/dist/all.mjs +173 -92
  152. package/dist/always.es.js +2 -2
  153. package/dist/always.es.min.js +2 -2
  154. package/dist/always.js +2 -2
  155. package/dist/always.min.js +2 -2
  156. package/dist/always.mjs +2 -2
  157. package/dist/and.es.js +101 -32
  158. package/dist/and.es.min.js +3 -3
  159. package/dist/and.js +101 -32
  160. package/dist/and.min.js +3 -3
  161. package/dist/and.mjs +101 -32
  162. package/dist/assign.es.js +37 -10
  163. package/dist/assign.es.min.js +3 -3
  164. package/dist/assign.js +37 -10
  165. package/dist/assign.min.js +3 -3
  166. package/dist/assign.mjs +37 -10
  167. package/dist/compose.es.js +71 -0
  168. package/dist/compose.es.min.js +7 -0
  169. package/dist/compose.js +78 -0
  170. package/dist/compose.min.js +8 -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.mjs +2 -2
  177. package/dist/eq.es.js +172 -49
  178. package/dist/eq.es.min.js +3 -3
  179. package/dist/eq.js +172 -49
  180. package/dist/eq.min.js +3 -3
  181. package/dist/eq.mjs +172 -49
  182. package/dist/every.es.js +194 -0
  183. package/dist/every.es.min.js +7 -0
  184. package/dist/every.js +201 -0
  185. package/dist/every.min.js +8 -0
  186. package/dist/every.mjs +194 -0
  187. package/dist/filter.es.js +14 -108
  188. package/dist/filter.es.min.js +3 -3
  189. package/dist/filter.js +14 -108
  190. package/dist/filter.min.js +3 -3
  191. package/dist/filter.mjs +14 -108
  192. package/dist/flatMap.es.js +27 -214
  193. package/dist/flatMap.es.min.js +3 -3
  194. package/dist/flatMap.js +27 -214
  195. package/dist/flatMap.min.js +3 -3
  196. package/dist/flatMap.mjs +27 -214
  197. package/dist/{x/forEach.es.js → forEach.es.js} +52 -70
  198. package/dist/forEach.es.min.js +7 -0
  199. package/dist/{x/forEach.js → forEach.js} +52 -70
  200. package/dist/forEach.min.js +8 -0
  201. package/dist/{x/forEach.mjs → forEach.mjs} +52 -70
  202. package/dist/get.es.js +60 -5
  203. package/dist/get.es.min.js +3 -3
  204. package/dist/get.js +60 -5
  205. package/dist/get.min.js +3 -3
  206. package/dist/get.mjs +60 -5
  207. package/dist/gt.es.js +171 -48
  208. package/dist/gt.es.min.js +3 -3
  209. package/dist/gt.js +171 -48
  210. package/dist/gt.min.js +3 -3
  211. package/dist/gt.mjs +171 -48
  212. package/dist/gte.es.js +171 -48
  213. package/dist/gte.es.min.js +3 -3
  214. package/dist/gte.js +171 -48
  215. package/dist/gte.min.js +3 -3
  216. package/dist/gte.mjs +171 -48
  217. package/dist/lt.es.js +171 -48
  218. package/dist/lt.es.min.js +3 -3
  219. package/dist/lt.js +171 -48
  220. package/dist/lt.min.js +3 -3
  221. package/dist/lt.mjs +171 -48
  222. package/dist/lte.es.js +171 -48
  223. package/dist/lte.es.min.js +3 -3
  224. package/dist/lte.js +171 -48
  225. package/dist/lte.min.js +3 -3
  226. package/dist/lte.mjs +171 -48
  227. package/dist/map.es.js +12 -101
  228. package/dist/map.es.min.js +3 -3
  229. package/dist/map.js +12 -101
  230. package/dist/map.min.js +3 -3
  231. package/dist/map.mjs +12 -101
  232. package/dist/not.es.js +75 -14
  233. package/dist/not.es.min.js +3 -3
  234. package/dist/not.js +75 -14
  235. package/dist/not.min.js +3 -3
  236. package/dist/not.mjs +75 -14
  237. package/dist/omit.es.js +7 -2
  238. package/dist/omit.es.min.js +3 -3
  239. package/dist/omit.js +7 -2
  240. package/dist/omit.min.js +3 -3
  241. package/dist/omit.mjs +7 -2
  242. package/dist/or.es.js +99 -31
  243. package/dist/or.es.min.js +3 -3
  244. package/dist/or.js +99 -31
  245. package/dist/or.min.js +3 -3
  246. package/dist/or.mjs +99 -31
  247. package/dist/pick.es.js +8 -3
  248. package/dist/pick.es.min.js +3 -3
  249. package/dist/pick.js +8 -3
  250. package/dist/pick.min.js +3 -3
  251. package/dist/pick.mjs +8 -3
  252. package/dist/pipe.es.js +42 -46
  253. package/dist/pipe.es.min.js +3 -3
  254. package/dist/pipe.js +42 -46
  255. package/dist/pipe.min.js +3 -3
  256. package/dist/pipe.mjs +42 -46
  257. package/dist/reduce.es.js +52 -94
  258. package/dist/reduce.es.min.js +3 -3
  259. package/dist/reduce.js +52 -94
  260. package/dist/reduce.min.js +3 -3
  261. package/dist/reduce.mjs +52 -94
  262. package/dist/rubico.es.js +762 -883
  263. package/dist/rubico.es.min.js +3 -3
  264. package/dist/rubico.global.js +2794 -0
  265. package/dist/rubico.global.min.js +8 -0
  266. package/dist/rubico.js +739 -869
  267. package/dist/rubico.min.js +3 -3
  268. package/dist/rubico.mjs +762 -883
  269. package/dist/set.es.js +18 -3
  270. package/dist/set.es.min.js +3 -3
  271. package/dist/set.js +18 -3
  272. package/dist/set.min.js +3 -3
  273. package/dist/set.mjs +18 -3
  274. package/dist/{any.js → some.es.js} +64 -54
  275. package/dist/some.es.min.js +7 -0
  276. package/dist/{any.mjs → some.js} +72 -48
  277. package/dist/some.min.js +8 -0
  278. package/dist/{any.es.js → some.mjs} +65 -48
  279. package/dist/switchCase.es.js +55 -5
  280. package/dist/switchCase.es.min.js +3 -3
  281. package/dist/switchCase.js +55 -5
  282. package/dist/switchCase.min.js +3 -3
  283. package/dist/switchCase.mjs +55 -5
  284. package/dist/tap.es.js +2 -9
  285. package/dist/tap.es.min.js +3 -3
  286. package/dist/tap.js +2 -9
  287. package/dist/tap.min.js +3 -3
  288. package/dist/tap.mjs +2 -9
  289. package/dist/thunkify.es.js +45 -2
  290. package/dist/thunkify.es.min.js +3 -3
  291. package/dist/thunkify.js +45 -2
  292. package/dist/thunkify.min.js +3 -3
  293. package/dist/thunkify.mjs +45 -2
  294. package/dist/transform.es.js +35 -71
  295. package/dist/transform.es.min.js +3 -3
  296. package/dist/transform.js +35 -71
  297. package/dist/transform.min.js +3 -3
  298. package/dist/transform.mjs +35 -71
  299. package/dist/tryCatch.es.js +33 -17
  300. package/dist/tryCatch.es.min.js +3 -3
  301. package/dist/tryCatch.js +33 -17
  302. package/dist/tryCatch.min.js +3 -3
  303. package/dist/tryCatch.mjs +33 -17
  304. package/dist/x/append.es.js +2 -2
  305. package/dist/x/append.es.min.js +2 -2
  306. package/dist/x/append.js +2 -2
  307. package/dist/x/append.min.js +2 -2
  308. package/dist/x/append.mjs +2 -2
  309. package/dist/x/callProp.es.js +2 -2
  310. package/dist/x/callProp.es.min.js +2 -2
  311. package/dist/x/callProp.js +2 -2
  312. package/dist/x/callProp.min.js +2 -2
  313. package/dist/x/callProp.mjs +2 -2
  314. package/dist/x/defaultsDeep.es.js +2 -2
  315. package/dist/x/defaultsDeep.es.min.js +2 -2
  316. package/dist/x/defaultsDeep.js +2 -2
  317. package/dist/x/defaultsDeep.min.js +2 -2
  318. package/dist/x/defaultsDeep.mjs +2 -2
  319. package/dist/x/differenceWith.es.js +7 -7
  320. package/dist/x/differenceWith.es.min.js +3 -3
  321. package/dist/x/differenceWith.js +7 -7
  322. package/dist/x/differenceWith.min.js +2 -2
  323. package/dist/x/differenceWith.mjs +7 -7
  324. package/dist/x/filterOut.es.js +60 -117
  325. package/dist/x/filterOut.es.min.js +3 -3
  326. package/dist/x/filterOut.js +60 -117
  327. package/dist/x/filterOut.min.js +3 -3
  328. package/dist/x/filterOut.mjs +60 -117
  329. package/dist/x/find.es.js +2 -2
  330. package/dist/x/find.es.min.js +2 -2
  331. package/dist/x/find.js +2 -2
  332. package/dist/x/find.min.js +2 -2
  333. package/dist/x/find.mjs +2 -2
  334. package/dist/x/findIndex.es.js +2 -2
  335. package/dist/x/findIndex.es.min.js +2 -2
  336. package/dist/x/findIndex.js +2 -2
  337. package/dist/x/findIndex.min.js +2 -2
  338. package/dist/x/findIndex.mjs +2 -2
  339. package/dist/x/first.es.js +2 -2
  340. package/dist/x/first.es.min.js +2 -2
  341. package/dist/x/first.js +2 -2
  342. package/dist/x/first.min.js +2 -2
  343. package/dist/x/first.mjs +2 -2
  344. package/dist/x/flatten.es.js +20 -207
  345. package/dist/x/flatten.es.min.js +3 -3
  346. package/dist/x/flatten.js +20 -207
  347. package/dist/x/flatten.min.js +3 -3
  348. package/dist/x/flatten.mjs +20 -207
  349. package/dist/x/groupBy.es.js +52 -94
  350. package/dist/x/groupBy.es.min.js +3 -3
  351. package/dist/x/groupBy.js +52 -94
  352. package/dist/x/groupBy.min.js +3 -3
  353. package/dist/x/groupBy.mjs +52 -94
  354. package/dist/x/has.es.js +2 -2
  355. package/dist/x/has.es.min.js +2 -2
  356. package/dist/x/has.js +2 -2
  357. package/dist/x/has.min.js +2 -2
  358. package/dist/x/has.mjs +2 -2
  359. package/dist/x/identity.es.js +2 -2
  360. package/dist/x/identity.es.min.js +2 -2
  361. package/dist/x/identity.js +2 -2
  362. package/dist/x/identity.min.js +2 -2
  363. package/dist/x/identity.mjs +2 -2
  364. package/dist/x/includes.es.js +2 -2
  365. package/dist/x/includes.es.min.js +2 -2
  366. package/dist/x/includes.js +2 -2
  367. package/dist/x/includes.min.js +2 -2
  368. package/dist/x/includes.mjs +2 -2
  369. package/dist/x/isDeepEqual.es.js +2 -2
  370. package/dist/x/isDeepEqual.es.min.js +2 -2
  371. package/dist/x/isDeepEqual.js +2 -2
  372. package/dist/x/isDeepEqual.min.js +2 -2
  373. package/dist/x/isDeepEqual.mjs +2 -2
  374. package/dist/x/isEmpty.es.js +2 -2
  375. package/dist/x/isEmpty.es.min.js +2 -2
  376. package/dist/x/isEmpty.js +2 -2
  377. package/dist/x/isEmpty.min.js +2 -2
  378. package/dist/x/isEmpty.mjs +2 -2
  379. package/dist/x/isEqual.es.js +2 -2
  380. package/dist/x/isEqual.es.min.js +2 -2
  381. package/dist/x/isEqual.js +2 -2
  382. package/dist/x/isEqual.min.js +2 -2
  383. package/dist/x/isEqual.mjs +2 -2
  384. package/dist/x/isFunction.es.js +2 -2
  385. package/dist/x/isFunction.es.min.js +2 -2
  386. package/dist/x/isFunction.js +2 -2
  387. package/dist/x/isFunction.min.js +2 -2
  388. package/dist/x/isFunction.mjs +2 -2
  389. package/dist/x/isIn.es.js +2 -2
  390. package/dist/x/isIn.es.min.js +2 -2
  391. package/dist/x/isIn.js +2 -2
  392. package/dist/x/isIn.min.js +2 -2
  393. package/dist/x/isIn.mjs +2 -2
  394. package/dist/x/isObject.es.js +2 -2
  395. package/dist/x/isObject.es.min.js +2 -2
  396. package/dist/x/isObject.js +2 -2
  397. package/dist/x/isObject.min.js +2 -2
  398. package/dist/x/isObject.mjs +2 -2
  399. package/dist/x/isString.es.js +2 -2
  400. package/dist/x/isString.es.min.js +2 -2
  401. package/dist/x/isString.js +2 -2
  402. package/dist/x/isString.min.js +2 -2
  403. package/dist/x/isString.mjs +2 -2
  404. package/dist/x/keys.es.js +2 -2
  405. package/dist/x/keys.es.min.js +2 -2
  406. package/dist/x/keys.js +2 -2
  407. package/dist/x/keys.min.js +2 -2
  408. package/dist/x/keys.mjs +2 -2
  409. package/dist/x/last.es.js +2 -2
  410. package/dist/x/last.es.min.js +2 -2
  411. package/dist/x/last.js +2 -2
  412. package/dist/x/last.min.js +2 -2
  413. package/dist/x/last.mjs +2 -2
  414. package/dist/x/maxBy.es.js +59 -6
  415. package/dist/x/maxBy.es.min.js +3 -3
  416. package/dist/x/maxBy.js +59 -6
  417. package/dist/x/maxBy.min.js +3 -3
  418. package/dist/x/maxBy.mjs +59 -6
  419. package/dist/x/noop.es.js +2 -2
  420. package/dist/x/noop.es.min.js +2 -2
  421. package/dist/x/noop.js +2 -2
  422. package/dist/x/noop.min.js +2 -2
  423. package/dist/x/noop.mjs +2 -2
  424. package/dist/x/pluck.es.js +32 -103
  425. package/dist/x/pluck.es.min.js +3 -3
  426. package/dist/x/pluck.js +32 -103
  427. package/dist/x/pluck.min.js +3 -3
  428. package/dist/x/pluck.mjs +32 -103
  429. package/dist/x/prepend.es.js +2 -2
  430. package/dist/x/prepend.es.min.js +2 -2
  431. package/dist/x/prepend.js +2 -2
  432. package/dist/x/prepend.min.js +2 -2
  433. package/dist/x/prepend.mjs +2 -2
  434. package/dist/x/size.es.js +2 -2
  435. package/dist/x/size.es.min.js +2 -2
  436. package/dist/x/size.js +2 -2
  437. package/dist/x/size.min.js +2 -2
  438. package/dist/x/size.mjs +2 -2
  439. package/dist/x/trace.es.js +2 -9
  440. package/dist/x/trace.es.min.js +3 -3
  441. package/dist/x/trace.js +2 -9
  442. package/dist/x/trace.min.js +3 -3
  443. package/dist/x/trace.mjs +2 -9
  444. package/dist/x/unionWith.es.js +2 -2
  445. package/dist/x/unionWith.es.min.js +2 -2
  446. package/dist/x/unionWith.js +2 -2
  447. package/dist/x/unionWith.min.js +2 -2
  448. package/dist/x/unionWith.mjs +2 -2
  449. package/dist/x/uniq.es.js +2 -2
  450. package/dist/x/uniq.es.min.js +2 -2
  451. package/dist/x/uniq.js +2 -2
  452. package/dist/x/uniq.min.js +2 -2
  453. package/dist/x/uniq.mjs +2 -2
  454. package/dist/x/unless.es.js +2 -2
  455. package/dist/x/unless.es.min.js +2 -2
  456. package/dist/x/unless.js +2 -2
  457. package/dist/x/unless.min.js +2 -2
  458. package/dist/x/unless.mjs +2 -2
  459. package/dist/x/values.es.js +2 -2
  460. package/dist/x/values.es.min.js +2 -2
  461. package/dist/x/values.js +2 -2
  462. package/dist/x/values.min.js +2 -2
  463. package/dist/x/values.mjs +2 -2
  464. package/dist/x/when.es.js +2 -2
  465. package/dist/x/when.es.min.js +2 -2
  466. package/dist/x/when.js +2 -2
  467. package/dist/x/when.min.js +2 -2
  468. package/dist/x/when.mjs +2 -2
  469. package/dist-test.js +31 -2042
  470. package/eq.js +21 -63
  471. package/es.js +739 -869
  472. package/every.js +94 -0
  473. package/filter.js +23 -91
  474. package/flatMap.js +75 -70
  475. package/forEach.js +82 -0
  476. package/get.js +23 -6
  477. package/global.js +6 -4
  478. package/gt.js +15 -58
  479. package/gte.js +14 -57
  480. package/index.js +739 -869
  481. package/lt.js +17 -60
  482. package/lte.js +14 -57
  483. package/map.js +9 -94
  484. package/memory-usage/reduce.js +2 -2
  485. package/not.js +27 -45
  486. package/omit.js +4 -0
  487. package/or.js +50 -33
  488. package/package.json +7 -7
  489. package/pick.js +5 -1
  490. package/pipe.js +13 -50
  491. package/reduce.js +42 -51
  492. package/rubico.js +22 -11
  493. package/set.js +43 -10
  494. package/some.js +105 -0
  495. package/switchCase.js +13 -3
  496. package/tap.js +0 -24
  497. package/test.js +847 -1096
  498. package/thunkify.js +9 -0
  499. package/tmp.js +1 -0
  500. package/transform.js +31 -16
  501. package/tryCatch.js +19 -15
  502. package/x/differenceWith.js +3 -3
  503. package/x/filterOut.test.js +6 -6
  504. package/x/flatten.js +1 -1
  505. package/x/flatten.test.js +0 -8
  506. package/x/index.js +0 -2
  507. package/x/pluck.js +18 -27
  508. package/x/pluck.test.js +3 -7
  509. package/x/timeInLoop.js +16 -25
  510. package/x/timeInLoop.test.js +8 -4
  511. package/any.js +0 -82
  512. package/dist/__.min.mjs +0 -7
  513. package/dist/all.min.mjs +0 -7
  514. package/dist/always.min.mjs +0 -7
  515. package/dist/and.min.mjs +0 -7
  516. package/dist/any.es.min.js +0 -7
  517. package/dist/any.min.js +0 -8
  518. package/dist/any.min.mjs +0 -7
  519. package/dist/assign.min.mjs +0 -7
  520. package/dist/curry.min.mjs +0 -7
  521. package/dist/eq.min.mjs +0 -7
  522. package/dist/filter.min.mjs +0 -7
  523. package/dist/flatMap.min.mjs +0 -7
  524. package/dist/fork.es.js +0 -159
  525. package/dist/fork.es.min.js +0 -7
  526. package/dist/fork.js +0 -166
  527. package/dist/fork.min.js +0 -8
  528. package/dist/fork.min.mjs +0 -7
  529. package/dist/fork.mjs +0 -159
  530. package/dist/get.min.mjs +0 -7
  531. package/dist/gt.min.mjs +0 -7
  532. package/dist/gte.min.mjs +0 -7
  533. package/dist/lt.min.mjs +0 -7
  534. package/dist/lte.min.mjs +0 -7
  535. package/dist/map.min.mjs +0 -7
  536. package/dist/not.min.mjs +0 -7
  537. package/dist/omit.min.mjs +0 -7
  538. package/dist/or.min.mjs +0 -7
  539. package/dist/pick.min.mjs +0 -7
  540. package/dist/pipe.min.mjs +0 -7
  541. package/dist/reduce.min.mjs +0 -7
  542. package/dist/rubico.min.mjs +0 -7
  543. package/dist/set.min.mjs +0 -7
  544. package/dist/switchCase.min.mjs +0 -7
  545. package/dist/tap.min.mjs +0 -7
  546. package/dist/thunkify.min.mjs +0 -7
  547. package/dist/transform.min.mjs +0 -7
  548. package/dist/tryCatch.min.mjs +0 -7
  549. package/dist/x/append.min.mjs +0 -7
  550. package/dist/x/callProp.min.mjs +0 -7
  551. package/dist/x/defaultsDeep.min.mjs +0 -7
  552. package/dist/x/differenceWith.min.mjs +0 -7
  553. package/dist/x/filterOut.min.mjs +0 -7
  554. package/dist/x/find.min.mjs +0 -7
  555. package/dist/x/findIndex.min.mjs +0 -7
  556. package/dist/x/first.min.mjs +0 -7
  557. package/dist/x/flatten.min.mjs +0 -7
  558. package/dist/x/forEach.es.min.js +0 -7
  559. package/dist/x/forEach.min.js +0 -8
  560. package/dist/x/forEach.min.mjs +0 -7
  561. package/dist/x/groupBy.min.mjs +0 -7
  562. package/dist/x/has.min.mjs +0 -7
  563. package/dist/x/identity.min.mjs +0 -7
  564. package/dist/x/includes.min.mjs +0 -7
  565. package/dist/x/isDeepEqual.min.mjs +0 -7
  566. package/dist/x/isEmpty.min.mjs +0 -7
  567. package/dist/x/isEqual.min.mjs +0 -7
  568. package/dist/x/isFunction.min.mjs +0 -7
  569. package/dist/x/isIn.min.mjs +0 -7
  570. package/dist/x/isObject.min.mjs +0 -7
  571. package/dist/x/isString.min.mjs +0 -7
  572. package/dist/x/keys.min.mjs +0 -7
  573. package/dist/x/last.min.mjs +0 -7
  574. package/dist/x/maxBy.min.mjs +0 -7
  575. package/dist/x/noop.min.mjs +0 -7
  576. package/dist/x/pluck.min.mjs +0 -7
  577. package/dist/x/prepend.min.mjs +0 -7
  578. package/dist/x/size.min.mjs +0 -7
  579. package/dist/x/trace.min.mjs +0 -7
  580. package/dist/x/unionWith.min.mjs +0 -7
  581. package/dist/x/uniq.min.mjs +0 -7
  582. package/dist/x/unless.min.mjs +0 -7
  583. package/dist/x/values.min.mjs +0 -7
  584. package/dist/x/when.min.mjs +0 -7
  585. package/distributor.js +0 -495
  586. package/fork.js +0 -101
  587. package/x/forEach.js +0 -93
  588. package/x/forEach.test.js +0 -218
  589. /package/{benchmarks → archive/benchmarks-v1.9.7}/any.js +0 -0
  590. /package/{x/forEach.benchmark.js → archive/benchmarks-v1.9.7/forEach.js} +0 -0
  591. /package/{benchmarks → archive/benchmarks-v1.9.7}/fork.js +0 -0
  592. /package/{benchmarks → archive/benchmarks-v1.9.7}/integration.js +0 -0
  593. /package/{benchmarks → archive/benchmarks-v1.9.7}/misc.js +0 -0
package/test.js CHANGED
@@ -3,18 +3,20 @@ const assert = require('assert')
3
3
  const stream = require('stream')
4
4
  const path = require('path')
5
5
  const fs = require('fs')
6
+ const { Readable, Writable } = require('stream')
7
+ const util = require('util')
8
+ const Transducer = require('./Transducer')
6
9
  const rubico = require('./rubico')
7
10
  const isDeepEqual = require('./x/isDeepEqual')
8
- const { Readable, Writable } = require('stream')
9
11
  const mapFrom = require('./_internal/mapFrom')
10
12
  const sha256 = require('./_internal/sha256')
11
13
 
12
14
  const {
13
- pipe, tap,
15
+ pipe, compose, tap,
14
16
  tryCatch, switchCase,
15
- fork, assign, get, set, pick, omit,
16
- map, filter, reduce, transform, flatMap,
17
- any, all, and, or, not,
17
+ all, assign, get, set, pick, omit,
18
+ map, filter, flatMap, forEach, reduce, transform,
19
+ some, every, and, or, not,
18
20
  eq, gt, lt, gte, lte,
19
21
  thunkify, always,
20
22
  curry, __,
@@ -70,20 +72,6 @@ const asyncMult = (y, xi) => new Promise(resolve => {
70
72
  setImmediate(() => resolve(y * xi))
71
73
  })
72
74
 
73
- const asyncArrayReduce = (fn, x0) => async x => {
74
- if (x.length < 2) throw new Error('array must have length >= 2')
75
- let y, i
76
- if (x0 === undefined || x0 === null) {
77
- y = await fn(x[0], x[1])
78
- i = 2
79
- } else {
80
- y = await fn(x0, x[0])
81
- i = 1
82
- }
83
- while (i < x.length) { y = await fn(y, x[i]); i += 1 }
84
- return y
85
- }
86
-
87
75
  const constructReadStream = iterable => {
88
76
  const y = new stream.Readable({ objectMode: true })
89
77
  y._read = () => {}
@@ -109,8 +97,11 @@ const consumeReadStreamPush = s => new Promise((resolve, reject) => {
109
97
  const consumeReadStreamPull = s => new Promise((resolve, reject) => {
110
98
  let y = ''
111
99
  s.on('readable', () => {
112
- let chunk
113
- while (chunk = s.read()) y += `${chunk}`
100
+ let chunk = s.read()
101
+ while (chunk != null) {
102
+ y += `${chunk}`
103
+ chunk = s.read()
104
+ }
114
105
  })
115
106
  s.on('end', () => resolve(y))
116
107
  s.on('error', err => reject(err))
@@ -281,13 +272,16 @@ describe('rubico', () => {
281
272
  ])
282
273
  assert.deepEqual(array, [3, 6, 9])
283
274
  })
275
+ it('behaves eagerly and resolves any amount of Promise arguments before the array of functions', async () => {
276
+ const array = await pipe(Promise.resolve(1), 2, Promise.resolve(3), [
277
+ Array.of,
278
+ numbers => numbers.map(number => number * 3),
279
+ ])
280
+ assert.deepEqual(array, [3, 6, 9])
281
+ })
284
282
  it('chains async and regular functions together', async () => {
285
283
  ase(await pipe([hi, ho, asyncHey])('yo'), 'yohihohey')
286
284
  })
287
- it('chains functions in reverse if passed a function (very contrived)', async () => {
288
- ase(await pipe([hi, ho, asyncHey])((y, xi) => y + xi), '(y, xi) => y + xiheyhohi')
289
- ase(await pipe([asyncHey, ho, hi])((y, xi) => y + xi), '(y, xi) => y + xihihohey')
290
- })
291
285
  it('does something without arguments', async () => {
292
286
  ase(await pipe([hi, ho, asyncHey])(), 'undefinedhihohey')
293
287
  })
@@ -359,13 +353,13 @@ describe('rubico', () => {
359
353
  new TypeError('funcB is not a function'),
360
354
  )
361
355
  })
362
- it('handles sync errors good', async () => {
356
+ it('handles sync errors', async () => {
363
357
  assert.throws(
364
358
  () => pipe([hi, hi, x => { throw new Error(`throwing ${x}`) }])('yo'),
365
359
  new Error('throwing yohihi'),
366
360
  )
367
361
  })
368
- it('handles async errors good', async () => {
362
+ it('handles async errors', async () => {
369
363
  assert.rejects(
370
364
  () => pipe([hi, asyncHey, x => { throw new Error(`throwing ${x}`) }])('yo'),
371
365
  new Error('throwing yohihey'),
@@ -373,82 +367,236 @@ describe('rubico', () => {
373
367
  })
374
368
  })
375
369
 
376
- describe('pipe.sync', () => {
377
- it('chains regular functions together', async () => {
378
- ase(pipe.sync([hi, ho])('yo'), 'yohiho')
370
+ describe('compose', () => {
371
+ it('chains functions in reverse', async () => {
372
+ ade(
373
+ compose([1, 2, 3, 4, 5], [
374
+ map(number => number ** 2),
375
+ map(number => number + 2),
376
+ filter(number => number % 2 == 1)
377
+ ]),
378
+ [9, 25, 49],
379
+ )
380
+
381
+ ade(
382
+ compose([
383
+ map(number => number ** 2),
384
+ map(number => number + 2),
385
+ filter(number => number % 2 == 1)
386
+ ])([1, 2, 3, 4, 5]),
387
+ [9, 25, 49],
388
+ )
389
+
390
+ ade(
391
+ await compose([
392
+ map(async number => number ** 2),
393
+ map(number => number + 2),
394
+ filter(async number => number % 2 == 1)
395
+ ])([1, 2, 3, 4, 5]),
396
+ [9, 25, 49],
397
+ )
398
+
399
+ ade(
400
+ await compose(Promise.resolve([1, 2, 3, 4, 5]), [
401
+ map(number => number ** 2),
402
+ map(number => number + 2),
403
+ filter(number => number % 2 == 1)
404
+ ]),
405
+ [9, 25, 49],
406
+ )
379
407
  })
380
408
  })
381
409
 
382
- describe('fork', () => {
410
+ describe('all', () => {
411
+ it('API coverage', async () => {
412
+ ade(
413
+ all(1, 2, 3, [
414
+ Array.of,
415
+ Array.of,
416
+ Array.of,
417
+ ]),
418
+ [
419
+ [1, 2, 3],
420
+ [1, 2, 3],
421
+ [1, 2, 3],
422
+ ],
423
+ )
424
+
425
+ ade(
426
+ all([
427
+ Array.of,
428
+ Array.of,
429
+ Array.of,
430
+ ])(1, 2, 3),
431
+ [
432
+ [1, 2, 3],
433
+ [1, 2, 3],
434
+ [1, 2, 3],
435
+ ],
436
+ )
437
+
438
+ ade(
439
+ await all(Promise.resolve(1), 2, Promise.resolve(3), [
440
+ Array.of,
441
+ Array.of,
442
+ Array.of,
443
+ ]),
444
+ [
445
+ [1, 2, 3],
446
+ [1, 2, 3],
447
+ [1, 2, 3],
448
+ ],
449
+ )
450
+
451
+ ade(
452
+ all(1, 2, 3, {
453
+ a: Array.of,
454
+ b: Array.of,
455
+ c: Array.of,
456
+ }),
457
+ {
458
+ a: [1, 2, 3],
459
+ b: [1, 2, 3],
460
+ c: [1, 2, 3],
461
+ },
462
+ )
463
+
464
+ ade(
465
+ all({
466
+ a: Array.of,
467
+ b: Array.of,
468
+ c: Array.of,
469
+ })(1, 2, 3),
470
+ {
471
+ a: [1, 2, 3],
472
+ b: [1, 2, 3],
473
+ c: [1, 2, 3],
474
+ },
475
+ )
476
+
477
+ ade(
478
+ await all(Promise.resolve(1), 2, Promise.resolve(3), {
479
+ a: Array.of,
480
+ b: Array.of,
481
+ c: Array.of,
482
+ }),
483
+ {
484
+ a: [1, 2, 3],
485
+ b: [1, 2, 3],
486
+ c: [1, 2, 3],
487
+ },
488
+ )
489
+ })
383
490
  it('maps input to array of sync functions', async () => {
384
- ade(fork([hi, hi, hi])('yo'), ['yohi', 'yohi', 'yohi'])
491
+ ade(all([hi, hi, hi])('yo'), ['yohi', 'yohi', 'yohi'])
385
492
  })
386
493
  it('maps input to object of sync functions', async () => {
387
494
  ade(
388
- fork({ a: hi, b: hi, c: hi })('yo'),
495
+ all({ a: hi, b: hi, c: hi })('yo'),
389
496
  { a: 'yohi', b: 'yohi', c: 'yohi' },
390
497
  )
391
498
  })
392
499
  it('maps input to array of async functions', async () => {
393
- aok(fork([asyncHey, asyncHey, asyncHey])('yo') instanceof Promise)
500
+ aok(all([asyncHey, asyncHey, asyncHey])('yo') instanceof Promise)
394
501
  ade(
395
- await fork([asyncHey, asyncHey, asyncHey])('yo'),
502
+ await all([asyncHey, asyncHey, asyncHey])('yo'),
396
503
  ['yohey', 'yohey', 'yohey'],
397
504
  )
398
505
  })
399
506
  it('maps input to object of async functions', async () => {
400
- aok(fork({ a: asyncHey, b: asyncHey, c: asyncHey })('yo') instanceof Promise)
507
+ aok(all({ a: asyncHey, b: asyncHey, c: asyncHey })('yo') instanceof Promise)
401
508
  ade(
402
- await fork({ a: asyncHey, b: asyncHey, c: asyncHey })('yo'),
509
+ await all({ a: asyncHey, b: asyncHey, c: asyncHey })('yo'),
403
510
  { a: 'yohey', b: 'yohey', c: 'yohey' },
404
511
  )
405
512
  })
406
513
  it('any functions async => Promise', async () => {
407
- aok(fork([asyncHey, asyncHey, hi])('yo') instanceof Promise)
514
+ aok(all([asyncHey, asyncHey, hi])('yo') instanceof Promise)
408
515
  ade(
409
- await fork([asyncHey, asyncHey, hi])('yo'),
516
+ await all([asyncHey, asyncHey, hi])('yo'),
410
517
  ['yohey', 'yohey', 'yohi'],
411
518
  )
412
519
  })
413
- it('fork([])() -> []', async () => {
414
- ade(fork([])(), [])
415
- ade(fork([])('hey'), [])
520
+ it('all([])() -> []', async () => {
521
+ ade(all([])(), [])
522
+ ade(all([])('hey'), [])
416
523
  })
417
- it('fork({})() -> {}', async () => {
418
- ade(fork({})(), {})
419
- ade(fork({})('hey'), {})
524
+ it('all({})() -> {}', async () => {
525
+ ade(all({})(), {})
526
+ ade(all({})('hey'), {})
420
527
  })
421
- it('TypeError for fork([\'hey\'])()', async () => {
528
+ it('TypeError for all([\'hey\'])()', async () => {
422
529
  assert.throws(
423
- () => fork(['hey'])(),
530
+ () => all(['hey'])(),
424
531
  new TypeError('funcs[funcsIndex] is not a function'),
425
532
  )
426
533
  })
427
- it('throws TypeError for fork({ a: nonFunction })', async () => {
534
+ it('throws TypeError for all({ a: nonFunction })', async () => {
428
535
  assert.throws(
429
- () => fork({ a: 'hey' })(),
536
+ () => all({ a: 'hey' })(),
430
537
  new TypeError('funcs[key] is not a function'),
431
538
  )
432
539
  })
433
540
  it('throws TypeError for String', async () => {
434
541
  assert.throws(
435
- () => fork('ayelmao')(),
542
+ () => all('ayelmao')(),
436
543
  new TypeError('funcs[key] is not a function'),
437
544
  )
438
545
  })
439
546
  it('{} for Set<[func]>; no functions exposed via in', async () => {
440
- assert.deepEqual(fork(new Set([() => 'yo']))('hey'), {})
547
+ assert.deepEqual(all(new Set([() => 'yo']))('hey'), {})
441
548
  })
442
549
  it('{} for Map<[[1, func]]>', async () => {
443
- assert.deepEqual(fork(new Map([[1, () => 'yo']]))('hey'), {})
550
+ assert.deepEqual(all(new Map([[1, () => 'yo']]))('hey'), {})
444
551
  })
445
552
  })
446
553
 
447
- describe('fork.series', () => {
448
- it('syncly forks into array of functions', async () => {
554
+ describe('all.series', () => {
555
+ it('API coverage', async () => {
556
+ ade(
557
+ all.series(1, 2, 3, [
558
+ Array.of,
559
+ Array.of,
560
+ Array.of,
561
+ ]),
562
+ [
563
+ [1, 2, 3],
564
+ [1, 2, 3],
565
+ [1, 2, 3],
566
+ ],
567
+ )
568
+
569
+ ade(
570
+ all.series([
571
+ Array.of,
572
+ Array.of,
573
+ Array.of,
574
+ ])(1, 2, 3),
575
+ [
576
+ [1, 2, 3],
577
+ [1, 2, 3],
578
+ [1, 2, 3],
579
+ ],
580
+ )
581
+
582
+ ade(
583
+ await all.series(Promise.resolve(1), 2, Promise.resolve(3), [
584
+ Array.of,
585
+ Array.of,
586
+ Array.of,
587
+ ]),
588
+ [
589
+ [1, 2, 3],
590
+ [1, 2, 3],
591
+ [1, 2, 3],
592
+ ],
593
+ )
594
+ })
595
+
596
+ it('evaluates input against array of functions in series (sync)', async () => {
449
597
  const arr = []
450
598
  ade(
451
- fork.series([
599
+ all.series([
452
600
  () => { arr.push(1); return 'a' },
453
601
  () => { arr.push(2); return 'b' },
454
602
  () => { arr.push(3); return 'c' },
@@ -457,9 +605,9 @@ describe('rubico', () => {
457
605
  )
458
606
  ade(arr, [1, 2, 3])
459
607
  })
460
- it('asyncly forks into array of functions, running each function in series', async () => {
608
+ it('evaluates input against array of functions in series (async)', async () => {
461
609
  const arr = []
462
- const staggeredPush = fork.series([
610
+ const staggeredPush = all.series([
463
611
  () => sleep(10).then(() => { arr.push(1); return 'a' }),
464
612
  () => sleep(5).then(() => { arr.push(2); return 'b' }),
465
613
  () => { arr.push(3); return 'c' },
@@ -468,7 +616,7 @@ describe('rubico', () => {
468
616
  ade(await staggeredPush, ['a', 'b', 'c'])
469
617
  ade(arr, [1, 2, 3])
470
618
  const arr2 = []
471
- const parallelPush = fork([
619
+ const parallelPush = all([
472
620
  () => sleep(10).then(() => { arr2.push(1); return 'a' }),
473
621
  () => sleep(5).then(() => { arr2.push(2); return 'b' }),
474
622
  () => { arr2.push(3); return 'c' },
@@ -477,18 +625,37 @@ describe('rubico', () => {
477
625
  ade(await parallelPush, ['a', 'b', 'c'])
478
626
  ade(arr2, [3, 2, 1])
479
627
  })
480
- it('throws TypeError for fork([])', async () => {
481
- assert.deepEqual(fork.series([])(), [])
628
+ it('throws TypeError for all([])', async () => {
629
+ assert.deepEqual(all.series([])(), [])
482
630
  })
483
- it('throws TypeError for fork([nonFunction])', async () => {
631
+ it('throws TypeError for all([nonFunction])', async () => {
484
632
  assert.throws(
485
- () => fork.series(['hey'])(),
633
+ () => all.series(['hey'])(),
486
634
  new TypeError('funcs[funcsIndex] is not a function')
487
635
  )
488
636
  })
489
637
  })
490
638
 
491
639
  describe('assign', () => {
640
+ it('API coverage', async () => {
641
+ ade(assign({}, {
642
+ a: () => 1,
643
+ b: () => 2,
644
+ c: () => 3,
645
+ }), { a: 1, b: 2, c: 3 })
646
+
647
+ ade(assign({
648
+ a: () => 1,
649
+ b: () => 2,
650
+ c: () => 3,
651
+ })({}), { a: 1, b: 2, c: 3 })
652
+
653
+ ade(await assign(Promise.resolve({}), {
654
+ a: () => 1,
655
+ b: () => 2,
656
+ c: () => 3,
657
+ }), { a: 1, b: 2, c: 3 })
658
+ })
492
659
  it('maps input to object of sync functions then merges', async () => {
493
660
  ade(
494
661
  assign({
@@ -589,6 +756,21 @@ describe('rubico', () => {
589
756
  assert.equal(sum, 6)
590
757
  })
591
758
 
759
+ it('behaves eagerly when supplied any amount of Promise arguments before the tryer and catcher', async () => {
760
+ const add = (a, b) => a + b
761
+
762
+ let sum = null
763
+
764
+ await tryCatch(Promise.resolve(1), 2, Promise.resolve(3), function throwSum(...numbers) {
765
+ const sum = numbers.reduce(add)
766
+ throw new Error(`${sum}`)
767
+ }, function logErrorMessage(error) {
768
+ sum = Number(error.message)
769
+ })
770
+
771
+ assert.equal(sum, 6)
772
+ })
773
+
592
774
  it('async eager tryCatch', async () => {
593
775
  const add = (a, b) => a + b
594
776
 
@@ -614,6 +796,7 @@ describe('rubico', () => {
614
796
  ase(e1.message, '1')
615
797
  ase(e1.x, 1)
616
798
  })
799
+
617
800
  it('tries an async function and catches with a sync function', async () => {
618
801
  const errProp = (err, x) => { err.x = x; return err }
619
802
  const asyncThrowError = async x => { throw new Error(x) }
@@ -678,6 +861,25 @@ describe('rubico', () => {
678
861
  })
679
862
 
680
863
  describe('switchCase', () => {
864
+ it('API coverage', async () => {
865
+ ase(
866
+ switchCase(1, [
867
+ x => x === 1, () => 'hi',
868
+ x => x === 2, () => 'ho',
869
+ () => 'hey',
870
+ ]),
871
+ 'hi',
872
+ )
873
+
874
+ ase(
875
+ await switchCase(Promise.resolve(1), [
876
+ x => x === 1, () => 'hi',
877
+ x => x === 2, () => 'ho',
878
+ () => 'hey',
879
+ ]),
880
+ 'hi',
881
+ )
882
+ })
681
883
  it('switches on values (including Promises), evaluating eagerly', async () => {
682
884
  ase(switchCase([true, 'hey', 'ho']), 'hey')
683
885
  ase(await switchCase([
@@ -807,10 +1009,16 @@ describe('rubico', () => {
807
1009
  })
808
1010
 
809
1011
  describe('map', () => {
810
- it('eager', async () => {
1012
+ it('API coverage', async () => {
811
1013
  const myArray = [1, 2, 3]
812
- const mappedArray = map(myArray, number => number ** 2)
813
- assert.deepEqual(mappedArray, [1, 4, 9])
1014
+ assert.deepEqual(
1015
+ map(myArray, number => number ** 2),
1016
+ [1, 4, 9]
1017
+ )
1018
+ assert.deepEqual(
1019
+ await map(Promise.resolve(myArray), number => number ** 2),
1020
+ [1, 4, 9]
1021
+ )
814
1022
  })
815
1023
 
816
1024
  it('Test', Test('map', map(number => number ** 2))
@@ -900,15 +1108,6 @@ describe('rubico', () => {
900
1108
  })
901
1109
  })
902
1110
 
903
- describe('map(func A=>B)(GeneratorFunction<A>) -> GeneratorFunction<B>', () => {
904
- it('func A=>B; B', async () => {
905
- const numbers = function* () { let i = 0; while (++i < 6) yield i }
906
- const squares = map(number => number ** 2)(numbers)
907
- assert.equal(objectToString(squares), '[object GeneratorFunction]')
908
- assert.deepEqual([...squares()], [1, 4, 9, 16, 25])
909
- })
910
- })
911
-
912
1111
  describe('map(func A=>B)(Iterator<A>) -> Iterator<B>', () => {
913
1112
  it('func A=>B; B', async () => {
914
1113
  const numbers = function* () { let i = 0; while (++i < 6) yield i }
@@ -919,25 +1118,6 @@ describe('rubico', () => {
919
1118
  })
920
1119
  })
921
1120
 
922
- describe('map(func A=>Promise|B)(AsyncGeneratorFunction<A>) -> AsyncGeneratorFunction<B>', () => {
923
- it('func A=>B; B', async () => {
924
- const asyncNumbers = async function* () { let i = 0; while (++i < 6) yield i }
925
- const asyncSquares = map(number => number ** 2)(asyncNumbers)
926
- assert.equal(objectToString(asyncSquares), '[object AsyncGeneratorFunction]')
927
- const squaresArray = []
928
- for await (const number of asyncSquares()) squaresArray.push(number)
929
- assert.deepEqual(squaresArray, [1, 4, 9, 16, 25])
930
- })
931
- it('func A=>Promise<B>; Promise<B>', async () => {
932
- const asyncNumbers = async function* () { let i = 0; while (++i < 6) yield i }
933
- const asyncSquares = map(async number => number ** 2)(asyncNumbers)
934
- assert.equal(objectToString(asyncSquares), '[object AsyncGeneratorFunction]')
935
- const squaresArray = []
936
- for await (const number of asyncSquares()) squaresArray.push(number)
937
- assert.deepEqual(squaresArray, [1, 4, 9, 16, 25])
938
- })
939
- })
940
-
941
1121
  describe('map(func A=>Promise|B)(AsyncIterator<A>) -> AsyncIterator<B>', () => {
942
1122
  it('func A=>B; AsyncIterator<B>', async () => {
943
1123
  const asyncNumbers = async function* () { let i = 0; while (++i < 6) yield i }
@@ -961,13 +1141,13 @@ describe('rubico', () => {
961
1141
  it('func A=>B; Reducer<B>', async () => {
962
1142
  const add = (a, b) => a + b
963
1143
  assert.strictEqual(
964
- [1, 2, 3, 4, 5].reduce(map(number => number ** 2)(add), 0),
1144
+ [1, 2, 3, 4, 5].reduce(Transducer.map(number => number ** 2)(add), 0),
965
1145
  55,
966
1146
  )
967
1147
  })
968
1148
  it('func A=>B; async Reducer<A>; Reducer<B>', async () => {
969
1149
  const asyncAdd = async (a, b) => a + b
970
- const asyncReducer = map(number => number ** 2)(asyncAdd)
1150
+ const asyncReducer = Transducer.map(number => number ** 2)(asyncAdd)
971
1151
  let total = 0
972
1152
  for (const number of [1, 2, 3, 4, 5]) {
973
1153
  total = await asyncReducer(total, number)
@@ -976,7 +1156,7 @@ describe('rubico', () => {
976
1156
  })
977
1157
  it('func A=>Promise<B>; Reducer<B>', async () => {
978
1158
  const add = (a, b) => a + b
979
- const asyncReducer = map(async number => number ** 2)(add)
1159
+ const asyncReducer = Transducer.map(async number => number ** 2)(add)
980
1160
  let total = 0
981
1161
  for (const number of [1, 2, 3, 4, 5]) {
982
1162
  total = await asyncReducer(total, number)
@@ -1135,7 +1315,6 @@ describe('rubico', () => {
1135
1315
  assert.deepEqual(map.pool(1, asyncSquare)([]), [])
1136
1316
  })
1137
1317
  it('works for arrays of undefined values', async () => {
1138
- ade(await map.pool(1, x => x)([,,,,, ]), Array(5).fill(undefined))
1139
1318
  ade(await map.pool(1, x => x)(Array(5)), Array(5).fill(undefined))
1140
1319
  ade(await map.pool(1, x => x)(Array(5).fill(null)), Array(5).fill(null))
1141
1320
  })
@@ -1163,7 +1342,9 @@ describe('rubico', () => {
1163
1342
  })
1164
1343
  it('abides by asynchronous limit for arrays and sets', async () => {
1165
1344
  const numbers = [1, 2, 3, 4, 5, 6]
1166
- let i = 0, maxi = 0, period = 10
1345
+ const period = 10
1346
+ let i = 0
1347
+ let maxi = 0
1167
1348
  const plusSleepMinus = n => (async () => {
1168
1349
  i += 1
1169
1350
  maxi = Math.max(maxi, i)
@@ -1207,107 +1388,6 @@ then(() => {
1207
1388
  })
1208
1389
  })
1209
1390
 
1210
- describe('map.withIndex', () => {
1211
- it('[sync] applies a function to each item of array with index and reference to array', async () => {
1212
- const numbers = [100, 100, 100, 100, 100]
1213
- ade(
1214
- map.withIndex((xi, i, x) => xi + i - x[i])(numbers),
1215
- [0, 1, 2, 3, 4],
1216
- )
1217
- })
1218
- it('[async] applies a function to each item of array with index and reference to array', async () => {
1219
- const numbers = [100, 100, 100, 100, 100]
1220
- aok(map.withIndex(async (xi, i, x) => xi + i - x[i])(numbers) instanceof Promise)
1221
- ade(
1222
- await map.withIndex(async (xi, i, x) => xi + i - x[i])(numbers),
1223
- [0, 1, 2, 3, 4],
1224
- )
1225
- })
1226
- xit('[sync] applies a function to each character of a string with index and value of string', async () => {
1227
- ase(
1228
- map.withIndex((xi, i, x) => xi + i + x[i])('abc'),
1229
- 'a0ab1bc2c',
1230
- )
1231
- })
1232
- xit('[async] applies a function to each character of a string with index and value of string', async () => {
1233
- aok(
1234
- map.withIndex(async (xi, i, x) => xi + i + x[i])('abc') instanceof Promise
1235
- )
1236
- ase(
1237
- await map.withIndex(async (xi, i, x) => xi + i + x[i])('abc'),
1238
- 'a0ab1bc2c',
1239
- )
1240
- })
1241
- it('throws a TypeError on map.withIndex(nonFunction)', async () => {
1242
- assert.throws(
1243
- () => map.withIndex({})([1, 2, 3]),
1244
- new TypeError('mapper is not a function'),
1245
- )
1246
- })
1247
- it('throws a TypeError on map.withIndex(...)(null)', async () => {
1248
- assert.throws(
1249
- () => map.withIndex(() => 'hi')(null),
1250
- new TypeError('null is not an Array')
1251
- )
1252
- })
1253
- })
1254
-
1255
- describe('map.own', () => {
1256
- describe('map.own(mapper A=>B)(Object<A>) -> Object<B>', () => {
1257
- it('maps an objects own properties', async () => {
1258
- const Person = function (name) {
1259
- this.name = name
1260
- }
1261
-
1262
- Person.prototype.greet = function () {
1263
- console.log(`Hello, my name is ${this.name}`)
1264
- }
1265
-
1266
- const david = new Person('david')
1267
-
1268
- david.a = 1
1269
- david.b = 2
1270
- david.c = 3
1271
-
1272
- const square = number => number ** 2
1273
-
1274
- const mappedOwn = map.own(square)(david)
1275
- assert.deepStrictEqual(mappedOwn, { name: NaN, a: 1, b: 4, c: 9 });
1276
- })
1277
-
1278
- it('maps a functions own properties', async () => {
1279
- const someFunctionWithProperties = () => null
1280
-
1281
- someFunctionWithProperties.a = 1
1282
- someFunctionWithProperties.b = 2
1283
- someFunctionWithProperties.c = 3
1284
-
1285
- const cube = number => number ** 3
1286
-
1287
- const mappedOwn = map.own(cube)(someFunctionWithProperties)
1288
- assert.deepStrictEqual(mappedOwn, { a: 1, b: 8, c: 27 });
1289
- })
1290
-
1291
- it('throws a TypeError if value argument is not an object', async () => {
1292
- assert.throws(
1293
- () => {
1294
- map.own(() => true)('invalid')
1295
- },
1296
- new TypeError('invalid is not an Object')
1297
- )
1298
- })
1299
-
1300
- it('throws a TypeError if value argument is an array', async () => {
1301
- assert.throws(
1302
- () => {
1303
- map.own(() => true)([])
1304
- },
1305
- new TypeError(' is not an Object')
1306
- )
1307
- })
1308
- })
1309
- })
1310
-
1311
1391
  describe('filter', () => {
1312
1392
  it('eager', async () => {
1313
1393
  const numbers = [1, 2, 3]
@@ -1341,11 +1421,6 @@ then(() => {
1341
1421
  [3, 5],
1342
1422
  )
1343
1423
  })
1344
- it('does not provide index or reference to original array', async () => {
1345
- let total = 0
1346
- filter((...args) => args.forEach(arg => (total += arg)))([1, 2, 3])
1347
- assert.equal(total, 6)
1348
- })
1349
1424
  })
1350
1425
 
1351
1426
  describe('filter(predicate T=>Promise|boolean)(Set<T>) -> Promise|Set<T>', () => {
@@ -1466,15 +1541,6 @@ then(() => {
1466
1541
  )
1467
1542
  })
1468
1543
  })
1469
- describe('filter(predicate T=>boolean)(GeneratorFunction<args, T>) -> GeneratorFunction<args, T>', () => {
1470
- it('predicate T=>boolean', async () => {
1471
- const numbers = function* () { let i = 0; while (++i < 6) yield i }
1472
- const isOdd = number => number % 2 == 1
1473
- const oddNumbers = filter(isOdd)(numbers)
1474
- assert.equal(objectToString(oddNumbers), '[object GeneratorFunction]')
1475
- assert.deepEqual([...oddNumbers()], [1, 3, 5])
1476
- })
1477
- })
1478
1544
  describe('filter(predicate T=>boolean)(Iterator<T>) -> Iterator<T>', () => {
1479
1545
  it('predicate T=>boolean', async () => {
1480
1546
  const numbers = function* () { let i = 0; while (++i < 6) yield i }
@@ -1484,33 +1550,6 @@ then(() => {
1484
1550
  assert.deepEqual([...oddNumbersIterator], [1, 3, 5])
1485
1551
  })
1486
1552
  })
1487
- describe('filter(predicate T=>Promise|boolean)(AsyncGeneratorFunction<args, T>) -> AsyncGeneratorFunction<args, T>', () => {
1488
- const asyncNumbers = async function* () { let i = 0; while (++i < 6) yield i }
1489
- it('predicate T=>boolean', async () => {
1490
- const isOdd = number => number % 2 == 1
1491
- const asyncOddNumbers = filter(isOdd)(asyncNumbers)
1492
- assert.equal(objectToString(asyncOddNumbers), '[object AsyncGeneratorFunction]')
1493
- const oddNumbersArray = []
1494
- for await (const number of asyncOddNumbers()) oddNumbersArray.push(number)
1495
- assert.deepEqual(oddNumbersArray, [1, 3, 5])
1496
- })
1497
- it('predicate T=>Promise<boolean>', async () => {
1498
- const asyncIsOdd = async number => number % 2 == 1
1499
- const asyncOddNumbers = filter(asyncIsOdd)(asyncNumbers)
1500
- assert.equal(objectToString(asyncOddNumbers), '[object AsyncGeneratorFunction]')
1501
- const oddNumbersArray = []
1502
- for await (const number of asyncOddNumbers()) oddNumbersArray.push(number)
1503
- assert.deepEqual(oddNumbersArray, [1, 3, 5])
1504
- })
1505
- it('predicate T=>Promise|boolean', async () => {
1506
- const variadicAsyncIsOdd = number => number % 2 == 1 ? Promise.resolve(true) : false
1507
- const asyncOddNumbers = filter(variadicAsyncIsOdd)(asyncNumbers)
1508
- assert.equal(objectToString(asyncOddNumbers), '[object AsyncGeneratorFunction]')
1509
- const oddNumbersArray = []
1510
- for await (const number of asyncOddNumbers()) oddNumbersArray.push(number)
1511
- assert.deepEqual(oddNumbersArray, [1, 3, 5])
1512
- })
1513
- })
1514
1553
  describe('filter(predicate T=>Promise|boolean)(AsyncIterator<T>) -> AsyncIterator<T>', () => {
1515
1554
  const asyncNumbers = async function* () { let i = 0; while (++i < 6) yield i }
1516
1555
  it('predicate T=>boolean', async () => {
@@ -1521,33 +1560,17 @@ then(() => {
1521
1560
  for await (const number of asyncOddNumbersIterator) oddNumbersArray.push(number)
1522
1561
  assert.deepEqual(oddNumbersArray, [1, 3, 5])
1523
1562
  })
1524
- it('predicate T=>Promise<boolean>', async () => {
1525
- const asyncIsOdd = async number => number % 2 == 1
1526
- const asyncOddNumbers = filter(asyncIsOdd)(asyncNumbers)
1527
- assert.equal(objectToString(asyncOddNumbers), '[object AsyncGeneratorFunction]')
1528
- const oddNumbersArray = []
1529
- for await (const number of asyncOddNumbers()) oddNumbersArray.push(number)
1530
- assert.deepEqual(oddNumbersArray, [1, 3, 5])
1531
- })
1532
- it('predicate T=>Promise|boolean', async () => {
1533
- const variadicAsyncIsOdd = number => number % 2 == 1 ? Promise.resolve(true) : false
1534
- const asyncOddNumbers = filter(variadicAsyncIsOdd)(asyncNumbers)
1535
- assert.equal(objectToString(asyncOddNumbers), '[object AsyncGeneratorFunction]')
1536
- const oddNumbersArray = []
1537
- for await (const number of asyncOddNumbers()) oddNumbersArray.push(number)
1538
- assert.deepEqual(oddNumbersArray, [1, 3, 5])
1539
- })
1540
1563
  })
1541
1564
  describe('filter(predicate T=>Promise|boolean)(Reducer<T>) -> Reducer<T>', () => {
1542
1565
  const concat = (array, values) => array.concat(values)
1543
1566
  it('predicate T=>boolean', async () => {
1544
1567
  const isOdd = number => number % 2 == 1
1545
- const concatOdds = filter(isOdd)(concat)
1568
+ const concatOdds = Transducer.filter(isOdd)(concat)
1546
1569
  assert.deepEqual([1, 2, 3, 4, 5].reduce(concatOdds, []), [1, 3, 5])
1547
1570
  })
1548
1571
  it('predicate T=>Promise<boolean>', async () => {
1549
1572
  const asyncIsOdd = async number => number % 2 == 1
1550
- const concatOdds = filter(asyncIsOdd)(concat)
1573
+ const concatOdds = Transducer.filter(asyncIsOdd)(concat)
1551
1574
  let oddNumbers = []
1552
1575
  for (const number of [1, 2, 3, 4, 5]) {
1553
1576
  oddNumbers = await concatOdds(oddNumbers, number)
@@ -1556,7 +1579,7 @@ then(() => {
1556
1579
  })
1557
1580
  it('predicate T=>Promise|boolean', async () => {
1558
1581
  const variadicAsyncIsOdd = number => number % 2 == 1 ? Promise.resolve(true) : false
1559
- const concatOdds = filter(variadicAsyncIsOdd)(concat)
1582
+ const concatOdds = Transducer.filter(variadicAsyncIsOdd)(concat)
1560
1583
  let oddNumbers = []
1561
1584
  for (const number of [1, 2, 3, 4, 5]) {
1562
1585
  oddNumbers = await concatOdds(oddNumbers, number)
@@ -1591,77 +1614,33 @@ then(() => {
1591
1614
  })
1592
1615
  })
1593
1616
 
1594
- describe('filter.withIndex', () => {
1595
- describe('filter.withIndex(predicate T=>Promise|boolean)(value Array<T>) -> Array<T>', () => {
1596
- it('predicate T=>boolean', async () => {
1597
- const shellUniq = filter.withIndex(
1598
- (item, index, array) => item !== array[index + 1])
1599
- assert.deepEqual(
1600
- shellUniq([1, 1, 1, 2, 2, 3, 3, 3, 4, 5, 5, 5]),
1601
- [1, 2, 3, 4, 5])
1602
- })
1603
- it('predicate T=>Promise<boolean>', async () => {
1604
- const asyncShellUniq = filter.withIndex(
1605
- async (item, index, array) => item !== array[index + 1])
1606
- assert.deepEqual(
1607
- await asyncShellUniq([1, 1, 1, 2, 2, 3, 3, 3, 4, 5, 5, 5]),
1608
- [1, 2, 3, 4, 5])
1609
- })
1610
- it('predicate T=>Promise|boolean', async () => {
1611
- const variadicAsyncShellUniq = filter.withIndex(
1612
- (item, index, array) => item !== array[index + 1] ? Promise.resolve(true) : false)
1613
- assert.deepEqual(
1614
- await variadicAsyncShellUniq([1, 1, 1, 2, 2, 3, 3, 3, 4, 5, 5, 5]),
1615
- [1, 2, 3, 4, 5])
1616
- assert.deepEqual(
1617
- await variadicAsyncShellUniq([2, 2, 3, 3, 3, 4, 5, 5, 5, 6]),
1618
- [2, 3, 4, 5, 6])
1619
- })
1620
- })
1621
-
1622
- describe('filter.withIndex(predicate T=>Promise|boolean)(value !Array)', () => {
1623
- it('value Object', async () => {
1624
- assert.throws(
1625
- () => filter.withIndex(() => true)({}),
1626
- new TypeError('[object Object] is not an Array'),
1627
- )
1628
- })
1629
- it('value string', async () => {
1630
- assert.throws(
1631
- () => filter.withIndex(() => true)('hey'),
1632
- new TypeError('hey is not an Array'),
1633
- )
1634
- })
1635
- it('value function', async () => {
1636
- assert.throws(
1637
- () => filter.withIndex(() => true)(() => false),
1638
- new TypeError('() => false is not an Array'),
1639
- )
1640
- })
1641
- it('value null', async () => {
1642
- assert.throws(
1643
- () => filter.withIndex(() => true)(null),
1644
- new TypeError('null is not an Array'),
1645
- )
1646
- })
1647
- it('value undefined', async () => {
1648
- assert.throws(
1649
- () => filter.withIndex(() => true)(undefined),
1650
- new TypeError('undefined is not an Array'),
1651
- )
1652
- })
1653
- })
1654
- })
1655
-
1656
1617
  describe('reduce', () => {
1657
1618
  it('eager', async () => {
1658
1619
  const numbers = [1, 2, 3, 4, 5]
1659
1620
  const sum1 = reduce(numbers, (a, b) => a + b)
1660
1621
  const sum2 = reduce(numbers, (a, b) => a + b, 0)
1661
1622
  const sum3 = reduce(numbers, (a, b) => a + b, () => 0)
1623
+ const sum4 = await reduce(numbers, (a, b) => a + b, async () => 0)
1624
+ const sum5 = await reduce(numbers, (a, b) => a + b, Promise.resolve(0))
1662
1625
  assert.equal(sum1, 15)
1663
1626
  assert.equal(sum2, 15)
1664
1627
  assert.equal(sum3, 15)
1628
+ assert.equal(sum4, 15)
1629
+ assert.equal(sum5, 15)
1630
+ })
1631
+
1632
+ it('eager Promise arguments', async () => {
1633
+ const numbers = Promise.resolve([1, 2, 3, 4, 5])
1634
+ const sum1 = await reduce(numbers, (a, b) => a + b)
1635
+ const sum2 = await reduce(numbers, (a, b) => a + b, 0)
1636
+ const sum3 = await reduce(numbers, (a, b) => a + b, () => 0)
1637
+ const sum4 = await reduce(numbers, (a, b) => a + b, async () => 0)
1638
+ const sum5 = await reduce(numbers, (a, b) => a + b, Promise.resolve(0))
1639
+ assert.equal(sum1, 15)
1640
+ assert.equal(sum2, 15)
1641
+ assert.equal(sum3, 15)
1642
+ assert.equal(sum4, 15)
1643
+ assert.equal(sum5, 15)
1665
1644
  })
1666
1645
 
1667
1646
  describe(`
@@ -1791,42 +1770,6 @@ reduce(
1791
1770
  assert.strictEqual(
1792
1771
  await reduce(variadicAsyncAdd, 0)(numbers()), 0)
1793
1772
  })
1794
- it('collection ()=>Generator<...[number]>', async () => {
1795
- const numbers = function* () { yield 1; }
1796
- assert.strictEqual(
1797
- reduce(add, 0)(numbers)(), 1)
1798
- assert.strictEqual(
1799
- await reduce(asyncAdd, 0)(numbers)(), 1)
1800
- assert.strictEqual(
1801
- await reduce(variadicAsyncAdd, 0)(numbers)(), 1)
1802
- })
1803
- it('collection ()=>Generator<number>', async () => {
1804
- const numbers = function* () { yield 1; yield 2; yield 3; yield 4; yield 5 }
1805
- assert.strictEqual(
1806
- reduce(add, 0)(numbers)(), 15)
1807
- assert.strictEqual(
1808
- await reduce(asyncAdd, 0)(numbers)(), 15)
1809
- assert.strictEqual(
1810
- await reduce(variadicAsyncAdd, 0)(numbers)(), 15)
1811
- })
1812
- it('collection ()=>Generator<number>', async () => {
1813
- const numbers = function* () { yield 1; yield 2; yield 3; yield 4; yield 5 }
1814
- assert.strictEqual(
1815
- reduce(add)(numbers)(), 15)
1816
- assert.strictEqual(
1817
- await reduce(asyncAdd)(numbers)(), 15)
1818
- assert.strictEqual(
1819
- await reduce(variadicAsyncAdd)(numbers)(), 15)
1820
- })
1821
- it('collection ()=>Generator<>', async () => {
1822
- const numbers = function* () {}
1823
- assert.strictEqual(
1824
- reduce(add, 0)(numbers)(), 0)
1825
- assert.strictEqual(
1826
- reduce(asyncAdd, 0)(numbers)(), 0)
1827
- assert.strictEqual(
1828
- reduce(variadicAsyncAdd, 0)(numbers)(), 0)
1829
- })
1830
1773
  it('collection AsyncGenerator<number>', async () => {
1831
1774
  const numbers = async function* () { yield 1; yield 2; yield 3; yield 4; yield 5 }
1832
1775
  assert.strictEqual(
@@ -1846,24 +1789,6 @@ reduce(
1846
1789
  assert.strictEqual(
1847
1790
  await reduce(variadicAsyncAdd, 0)(numbers()), 0)
1848
1791
  })
1849
- it('collection ()=>AsyncGenerator<number>', async () => {
1850
- const numbers = async function* () { yield 1; yield 2; yield 3; yield 4; yield 5 }
1851
- assert.strictEqual(
1852
- await reduce(add, 0)(numbers)(), 15)
1853
- assert.strictEqual(
1854
- await reduce(asyncAdd, 0)(numbers)(), 15)
1855
- assert.strictEqual(
1856
- await reduce(variadicAsyncAdd, 0)(numbers)(), 15)
1857
- })
1858
- it('collection ()=>AsyncGenerator<>', async () => {
1859
- const numbers = async function* () {}
1860
- assert.strictEqual(
1861
- await reduce(add, 0)(numbers)(), 0)
1862
- assert.strictEqual(
1863
- await reduce(asyncAdd, 0)(numbers)(), 0)
1864
- assert.strictEqual(
1865
- await reduce(variadicAsyncAdd, 0)(numbers)(), 0)
1866
- })
1867
1792
  it('collection Reducible<number>', async () => {
1868
1793
  const reducible = {
1869
1794
  reduce(reducer, init) {
@@ -1913,127 +1838,6 @@ reduce(
1913
1838
  assert.equal(await reduce(asyncAdd, async () => 0)(stringNumberMap5), 10)
1914
1839
  assert.equal(reduce(add)(stringNumberMap5), 10)
1915
1840
  })
1916
- it('collection Reducer<number>', async () => {
1917
- const reducers = [
1918
- (a, b) => a + b,
1919
- ]
1920
- const combinedReducingFunction = reduce(
1921
- (reducingFunc, reducer) => reducingFunc(reducer),
1922
- () => reduce(result => result, 0),
1923
- )(reducers)
1924
- assert.strictEqual(combinedReducingFunction([1, 2, 3, 4, 5]), 15)
1925
- })
1926
- it('reduce meta concatenation', async () => {
1927
- const reducers = [
1928
- (state, action) => action.type == 'A' ? { ...state, A: true } : state,
1929
- (state, action) => action.type == 'B' ? { ...state, B: true } : state,
1930
- (state, action) => action.type == 'C' ? { ...state, C: true } : state,
1931
- ]
1932
- const combinedReducingFunction = reduce(
1933
- (reducingFunc, reducer) => reducingFunc(reducer),
1934
- () => reduce(result => result, () => ({})),
1935
- )(reducers)
1936
- assert.deepEqual(combinedReducingFunction([
1937
- { type: 'A' }, { type: 'B' }, { type: 'C' },
1938
- ]), { A: true, B: true, C: true })
1939
- assert.deepEqual(combinedReducingFunction([
1940
- { type: 'A' }, { type: 'B' },
1941
- ]), { A: true, B: true })
1942
- assert.deepEqual(combinedReducingFunction([
1943
- { type: 'A' },
1944
- ]), { A: true })
1945
- assert.deepEqual(combinedReducingFunction([
1946
- ]), {})
1947
- assert.deepEqual(combinedReducingFunction([
1948
- { type: 'A' }, { type: 'C' },
1949
- ]), { A: true, C: true })
1950
- })
1951
- it('multiple reducers as arguments', async () => {
1952
- const reducers = [
1953
- (state, action) => action.type == 'A' ? { ...state, A: true } : state,
1954
- (state, action) => action.type == 'B' ? { ...state, B: true } : state,
1955
- (state, action) => action.type == 'C' ? { ...state, C: true } : state,
1956
- ]
1957
- const combinedReducingFunction = reduce(
1958
- result => result, () => ({}),
1959
- )(...reducers)
1960
- assert.deepEqual(combinedReducingFunction([
1961
- { type: 'A' }, { type: 'B' }, { type: 'C' },
1962
- ]), { A: true, B: true, C: true })
1963
- assert.deepEqual(combinedReducingFunction([
1964
- { type: 'A' }, { type: 'B' },
1965
- ]), { A: true, B: true })
1966
- assert.deepEqual(combinedReducingFunction([
1967
- { type: 'A' },
1968
- ]), { A: true })
1969
- assert.deepEqual(combinedReducingFunction([
1970
- ]), {})
1971
- assert.deepEqual(combinedReducingFunction([
1972
- { type: 'A' }, { type: 'C' },
1973
- ]), { A: true, C: true })
1974
- })
1975
- it('collection (<object>, object)=>Promise<object>', async () => {
1976
- const reducers = [
1977
- async (state, action) => action.type == 'A' ? { ...state, A: true } : state,
1978
- async (state, action) => action.type == 'B' ? { ...state, B: true } : state,
1979
- async (state, action) => action.type == 'C' ? { ...state, C: true } : state,
1980
- ]
1981
- const combinedReducingFunction = reduce(
1982
- (reducingFunc, reducer) => reducingFunc(reducer),
1983
- () => reduce(result => result, () => ({})),
1984
- )(reducers)
1985
- assert.deepEqual(await combinedReducingFunction([
1986
- { type: 'A' }, { type: 'B' }, { type: 'C' },
1987
- ]), { A: true, B: true, C: true })
1988
- assert.deepEqual(await combinedReducingFunction([
1989
- { type: 'A' }, { type: 'B' },
1990
- ]), { A: true, B: true })
1991
- assert.deepEqual(await combinedReducingFunction([
1992
- { type: 'A' },
1993
- ]), { A: true })
1994
- assert.deepEqual(await combinedReducingFunction([
1995
- ]), {})
1996
- assert.deepEqual(await combinedReducingFunction([
1997
- { type: 'A' }, { type: 'C' },
1998
- ]), { A: true, C: true })
1999
- })
2000
- it('collection (<object>, object)=>Promise|object', async () => {
2001
- const reducers = [
2002
- (state, action) => action.type == 'A' ? { ...state, A: true } : state,
2003
- async (state, action) => action.type == 'B' ? { ...state, B: true } : state,
2004
- async (state, action) => action.type == 'C' ? { ...state, C: true } : state,
2005
- ]
2006
- const combinedReducingFunction = reduce(
2007
- (reducingFunc, reducer) => reducingFunc(reducer),
2008
- () => reduce(result => result, () => ({})),
2009
- )(reducers)
2010
- assert.deepEqual(await combinedReducingFunction([
2011
- { type: 'A' }, { type: 'B' }, { type: 'C' },
2012
- ]), { A: true, B: true, C: true })
2013
- assert.deepEqual(await combinedReducingFunction([
2014
- { type: 'A' }, { type: 'B' },
2015
- ]), { A: true, B: true })
2016
- assert.deepEqual(await combinedReducingFunction([
2017
- { type: 'A' },
2018
- ]), { A: true })
2019
- assert.deepEqual(await combinedReducingFunction([
2020
- ]), {})
2021
- assert.deepEqual(await combinedReducingFunction([
2022
- { type: 'A' }, { type: 'C' },
2023
- ]), { A: true, C: true })
2024
- assert(typeof combinedReducingFunction([
2025
- { type: 'A' },
2026
- ]).then == 'function')
2027
- assert.deepEqual(await combinedReducingFunction([
2028
- { type: 'A' },
2029
- ]), { A: true })
2030
- assert(typeof combinedReducingFunction([
2031
- { type: 'B' },
2032
- ]).then == 'function')
2033
- assert.deepEqual(await combinedReducingFunction([
2034
- { type: 'B' },
2035
- ]), { B: true })
2036
- })
2037
1841
  it('collection atomic', async () => {
2038
1842
  assert.strictEqual(
2039
1843
  reduce((a, b) => a + b, 0)(10),
@@ -2212,55 +2016,6 @@ reduce(
2212
2016
  })
2213
2017
  })
2214
2018
 
2215
- describe('integration: transducers from pipe, map, filter, reduce', () => {
2216
- const concat = (y, xi) => y.concat(xi)
2217
- const add = (y, xi) => y + xi
2218
- it('reduce with sync transduced reducers', async () => {
2219
- const squareOdds = pipe([
2220
- filter(isOdd),
2221
- map(x => x ** 2),
2222
- ])
2223
- ade(
2224
- reduce(squareOdds(concat), [])([1, 2, 3, 4, 5]),
2225
- [1, 9, 25],
2226
- )
2227
- ade(
2228
- reduce(squareOdds((y, xi) => y.add(xi)), new Set())([1, 2, 3, 4, 5]),
2229
- new Set([1, 9, 25]),
2230
- )
2231
- const appendAlphas = pipe([
2232
- map(x => `${x}a`),
2233
- map(x => `${x}b`),
2234
- map(x => `${x}c`),
2235
- ])
2236
- ase(
2237
- reduce(appendAlphas(add), '')('123'),
2238
- '1abc2abc3abc',
2239
- )
2240
- ade(
2241
- reduce(appendAlphas(concat), [])('123'),
2242
- ['1abc', '2abc', '3abc'],
2243
- )
2244
- })
2245
- it('reduce with an async transduced reducer', async () => {
2246
- const hosWithHey = pipe([
2247
- filter(async x => x === 'ho'),
2248
- map(x => Promise.resolve(`${x}hey`)),
2249
- ])
2250
- const hihos = { a: 'hi', b: 'ho', c: 'hi', d: 'ho', e: 'hi', f: 'ho' }
2251
- aok(reduce(hosWithHey(add), '')(hihos) instanceof Promise),
2252
- aok(reduce(hosWithHey(concat), [])(hihos) instanceof Promise),
2253
- ase(
2254
- await reduce(hosWithHey(add), '')(hihos),
2255
- 'hoheyhoheyhohey',
2256
- )
2257
- ade(
2258
- await reduce(hosWithHey(concat), [])(hihos),
2259
- ['hohey', 'hohey', 'hohey'],
2260
- )
2261
- })
2262
- })
2263
-
2264
2019
  describe('transform', () => {
2265
2020
  describe(`
2266
2021
  transform(
@@ -2307,125 +2062,146 @@ transform(
2307
2062
  `, () => {
2308
2063
  describe('collection x init', () => {
2309
2064
  const square = number => number ** 2
2065
+ it('API coverage', async () => {
2066
+ assert.deepEqual(
2067
+ transform([1, 2, 3, 4, 5], Transducer.map(square), []),
2068
+ [1, 4, 9, 16, 25],
2069
+ )
2070
+ assert.deepEqual(
2071
+ transform([1, 2, 3, 4, 5], Transducer.map(square), () => []),
2072
+ [1, 4, 9, 16, 25],
2073
+ )
2074
+ assert.deepEqual(
2075
+ await transform([1, 2, 3, 4, 5], Transducer.map(square), async () => []),
2076
+ [1, 4, 9, 16, 25],
2077
+ )
2078
+ assert.deepEqual(
2079
+ await transform([1, 2, 3, 4, 5], Transducer.map(square), Promise.resolve([])),
2080
+ [1, 4, 9, 16, 25],
2081
+ )
2082
+ assert.deepEqual(
2083
+ await transform(Promise.resolve([1, 2, 3, 4, 5]), Transducer.map(square), []),
2084
+ [1, 4, 9, 16, 25],
2085
+ )
2086
+ })
2310
2087
  it('init []|() => []', async () => {
2311
2088
  assert.deepEqual(
2312
- transform(map(square), [])([1, 2, 3, 4, 5]),
2089
+ transform(Transducer.map(square), [])([1, 2, 3, 4, 5]),
2313
2090
  [1, 4, 9, 16, 25],
2314
2091
  )
2315
2092
  assert.deepEqual(
2316
- transform(map(square), () => [])([1, 2, 3, 4, 5]),
2093
+ await transform(Transducer.map(square), Promise.resolve([]))([1, 2, 3, 4, 5]),
2317
2094
  [1, 4, 9, 16, 25],
2318
2095
  )
2319
2096
  assert.deepEqual(
2320
- await transform(map(square), async () => [])([1, 2, 3, 4, 5]),
2097
+ transform(Transducer.map(square), () => [])([1, 2, 3, 4, 5]),
2321
2098
  [1, 4, 9, 16, 25],
2322
2099
  )
2323
2100
  assert.deepEqual(
2324
- transform(map(square), (array, ...rest) => array.concat(rest))(
2325
- [1, 2, 3, 4, 5], 0, 0),
2326
- [1, 2, 3, 4, 5, 0, 0, 1, 4, 9, 16, 25]
2101
+ await transform(Transducer.map(square), async () => [])([1, 2, 3, 4, 5]),
2102
+ [1, 4, 9, 16, 25],
2327
2103
  )
2328
2104
  assert.deepEqual(
2329
- transform(map(square), [])([1, 2, 3, 4, 5][Symbol.iterator]()),
2105
+ transform(Transducer.map(square), [])([1, 2, 3, 4, 5][Symbol.iterator]()),
2330
2106
  [1, 4, 9, 16, 25],
2331
2107
  )
2332
2108
  const duplicate = item => [item, item]
2333
2109
  assert.deepEqual(
2334
- transform(map(duplicate), [])([1, 2, 3, 4, 5]),
2110
+ transform(Transducer.map(duplicate), [])([1, 2, 3, 4, 5]),
2335
2111
  [1, 1, 2, 2, 3, 3, 4, 4, 5, 5],
2336
2112
  )
2337
2113
  assert.deepEqual(
2338
- transform(map(duplicate), () => [])([1, 2, 3, 4, 5]),
2114
+ transform(Transducer.map(duplicate), () => [])([1, 2, 3, 4, 5]),
2339
2115
  [1, 1, 2, 2, 3, 3, 4, 4, 5, 5],
2340
2116
  )
2341
2117
  assert.deepEqual(
2342
- await transform(map(async number => duplicate(number)), async () => [])([1, 2, 3, 4, 5]),
2118
+ await transform(Transducer.map(async number => duplicate(number)), async () => [])([1, 2, 3, 4, 5]),
2343
2119
  [1, 1, 2, 2, 3, 3, 4, 4, 5, 5],
2344
2120
  )
2345
2121
  })
2346
2122
  it('init \'\'|(()=>\'\')', async () => {
2347
2123
  assert.strictEqual(
2348
- transform(map(square), '')([1, 2, 3, 4, 5]),
2124
+ transform(Transducer.map(square), '')([1, 2, 3, 4, 5]),
2349
2125
  '1491625',
2350
2126
  )
2351
2127
  assert.strictEqual(
2352
- transform(map(square), () => '')([1, 2, 3, 4, 5]),
2128
+ transform(Transducer.map(square), () => '')([1, 2, 3, 4, 5]),
2353
2129
  '1491625',
2354
2130
  )
2355
2131
  assert.strictEqual(
2356
- await transform(map(async number => number ** 2), async () => '')([1, 2, 3, 4, 5]),
2132
+ await transform(Transducer.map(async number => number ** 2), async () => '')([1, 2, 3, 4, 5]),
2357
2133
  '1491625',
2358
2134
  )
2359
2135
  })
2360
2136
  it('init Set|()=>Set', async () => {
2361
2137
  assert.deepEqual(
2362
- transform(map(square), new Set())([1, 2, 3, 4, 5]),
2138
+ transform(Transducer.map(square), new Set())([1, 2, 3, 4, 5]),
2363
2139
  new Set([1, 4, 9, 16, 25]),
2364
2140
  )
2365
2141
  assert.deepEqual(
2366
- transform(map(square), () => new Set())([1, 2, 3, 4, 5]),
2142
+ transform(Transducer.map(square), () => new Set())([1, 2, 3, 4, 5]),
2367
2143
  new Set([1, 4, 9, 16, 25]),
2368
2144
  )
2369
2145
  assert.deepEqual(
2370
- await transform(map(square), async () => new Set())([1, 2, 3, 4, 5]),
2146
+ await transform(Transducer.map(square), async () => new Set())([1, 2, 3, 4, 5]),
2371
2147
  new Set([1, 4, 9, 16, 25]),
2372
2148
  )
2373
2149
  const SetWithSquare = number => new Set([number, number ** 2])
2374
2150
  assert.deepEqual(
2375
- transform(map(SetWithSquare), new Set())([1, 2, 3, 4, 5]),
2151
+ transform(Transducer.map(SetWithSquare), new Set())([1, 2, 3, 4, 5]),
2376
2152
  new Set([1, 2, 4, 3, 9, 4, 16, 5, 25]),
2377
2153
  )
2378
2154
  assert.deepEqual(
2379
- transform(map(SetWithSquare), () => new Set())([1, 2, 3, 4, 5]),
2155
+ transform(Transducer.map(SetWithSquare), () => new Set())([1, 2, 3, 4, 5]),
2380
2156
  new Set([1, 2, 4, 3, 9, 4, 16, 5, 25]),
2381
2157
  )
2382
2158
  assert.deepEqual(
2383
- await transform(map(async number => SetWithSquare(number)), async () => new Set())([1, 2, 3, 4, 5]),
2159
+ await transform(Transducer.map(async number => SetWithSquare(number)), async () => new Set())([1, 2, 3, 4, 5]),
2384
2160
  new Set([1, 2, 4, 3, 9, 4, 16, 5, 25]),
2385
2161
  )
2386
2162
  })
2387
2163
  it('init TypedArray|()=>TypedArray', async () => {
2388
2164
  for (const constructor of numberTypedArrayConstructors) {
2389
2165
  assert.deepEqual(
2390
- transform(map(square), new constructor())([1, 2, 3, 4, 5]),
2166
+ transform(Transducer.map(square), new constructor())([1, 2, 3, 4, 5]),
2391
2167
  new constructor([1, 4, 9, 16, 25])
2392
2168
  )
2393
2169
  assert.deepEqual(
2394
- transform(map(square), () => new constructor())([1, 2, 3, 4, 5]),
2170
+ transform(Transducer.map(square), () => new constructor())([1, 2, 3, 4, 5]),
2395
2171
  new constructor([1, 4, 9, 16, 25])
2396
2172
  )
2397
2173
  assert.deepEqual(
2398
- await transform(map(async number => number ** 2), async () => new constructor())([1, 2, 3, 4, 5]),
2174
+ await transform(Transducer.map(async number => number ** 2), async () => new constructor())([1, 2, 3, 4, 5]),
2399
2175
  new constructor([1, 4, 9, 16, 25])
2400
2176
  )
2401
2177
  assert.deepEqual(
2402
- transform(map(number => new constructor([number ** 2])), () => new constructor())([1, 2, 3, 4, 5]),
2178
+ transform(Transducer.map(number => new constructor([number ** 2])), () => new constructor())([1, 2, 3, 4, 5]),
2403
2179
  new constructor([1, 4, 9, 16, 25])
2404
2180
  )
2405
2181
  assert.deepEqual(
2406
- await transform(map(async number => new constructor([number ** 2])), async () => new constructor())([1, 2, 3, 4, 5]),
2182
+ await transform(Transducer.map(async number => new constructor([number ** 2])), async () => new constructor())([1, 2, 3, 4, 5]),
2407
2183
  new constructor([1, 4, 9, 16, 25])
2408
2184
  )
2409
2185
  }
2410
2186
  for (const constructor of bigIntTypedArrayConstructors) {
2411
2187
  assert.deepEqual(
2412
- transform(map(number => number ** 2n), new constructor())([1n, 2n, 3n, 4n, 5n]),
2188
+ transform(Transducer.map(number => number ** 2n), new constructor())([1n, 2n, 3n, 4n, 5n]),
2413
2189
  new constructor([1n, 4n, 9n, 16n, 25n])
2414
2190
  )
2415
2191
  assert.deepEqual(
2416
- transform(map(number => number ** 2n), () => new constructor())([1n, 2n, 3n, 4n, 5n]),
2192
+ transform(Transducer.map(number => number ** 2n), () => new constructor())([1n, 2n, 3n, 4n, 5n]),
2417
2193
  new constructor([1n, 4n, 9n, 16n, 25n])
2418
2194
  )
2419
2195
  assert.deepEqual(
2420
- await transform(map(async number => number ** 2n), async () => new constructor())([1n, 2n, 3n, 4n, 5n]),
2196
+ await transform(Transducer.map(async number => number ** 2n), async () => new constructor())([1n, 2n, 3n, 4n, 5n]),
2421
2197
  new constructor([1n, 4n, 9n, 16n, 25n])
2422
2198
  )
2423
2199
  assert.deepEqual(
2424
- transform(map(number => new constructor([number ** 2n])), () => new constructor())([1n, 2n, 3n, 4n, 5n]),
2200
+ transform(Transducer.map(number => new constructor([number ** 2n])), () => new constructor())([1n, 2n, 3n, 4n, 5n]),
2425
2201
  new constructor([1n, 4n, 9n, 16n, 25n])
2426
2202
  )
2427
2203
  assert.deepEqual(
2428
- await transform(map(async number => new constructor([number ** 2n])), async () => new constructor())([1n, 2n, 3n, 4n, 5n]),
2204
+ await transform(Transducer.map(async number => new constructor([number ** 2n])), async () => new constructor())([1n, 2n, 3n, 4n, 5n]),
2429
2205
  new constructor([1n, 4n, 9n, 16n, 25n])
2430
2206
  )
2431
2207
  }
@@ -2440,39 +2216,39 @@ transform(
2440
2216
  : Math.max(this.number, otherMax))
2441
2217
  }
2442
2218
  assert.deepEqual(
2443
- transform(map(number => number ** 2), new Max(-Infinity))([1, 2, 3, 4, 5]),
2219
+ transform(Transducer.map(number => number ** 2), new Max(-Infinity))([1, 2, 3, 4, 5]),
2444
2220
  new Max(25),
2445
2221
  )
2446
2222
  assert.deepEqual(
2447
- transform(map(number => number ** 2), () => new Max(-Infinity))([1, 2, 3, 4, 5]),
2223
+ transform(Transducer.map(number => number ** 2), () => new Max(-Infinity))([1, 2, 3, 4, 5]),
2448
2224
  new Max(25),
2449
2225
  )
2450
2226
  assert.deepEqual(
2451
- await transform(map(async number => number ** 2), async () => new Max(-Infinity))([1, 2, 3, 4, 5]),
2227
+ await transform(Transducer.map(async number => number ** 2), async () => new Max(-Infinity))([1, 2, 3, 4, 5]),
2452
2228
  new Max(25),
2453
2229
  )
2454
2230
  })
2455
2231
  it('init { write: function }|()=>({ write: function })', async () => {
2456
2232
  assert.deepEqual(
2457
- transform(map(number => number ** 2), new MockWritable([]))([1, 2, 3, 4, 5]),
2233
+ transform(Transducer.map(number => number ** 2), new MockWritable([]))([1, 2, 3, 4, 5]),
2458
2234
  new MockWritable([1, 4, 9, 16, 25]),
2459
2235
  )
2460
2236
  assert.deepEqual(
2461
- transform(map(number => number ** 2), () => new MockWritable([]))([1, 2, 3, 4, 5]),
2237
+ transform(Transducer.map(number => number ** 2), () => new MockWritable([]))([1, 2, 3, 4, 5]),
2462
2238
  new MockWritable([1, 4, 9, 16, 25]),
2463
2239
  )
2464
2240
  assert.deepEqual(
2465
- await transform(map(async number => number ** 2), async () => new MockWritable([]))([1, 2, 3, 4, 5]),
2241
+ await transform(Transducer.map(async number => number ** 2), async () => new MockWritable([]))([1, 2, 3, 4, 5]),
2466
2242
  new MockWritable([1, 4, 9, 16, 25]),
2467
2243
  )
2468
2244
  const numberToSquaredReadable = number => binaryToReadableStream(Buffer.from([number ** 2]))
2469
2245
  assert.deepEqual(
2470
- await transform(map(numberToSquaredReadable), new MockWritable([]))([1, 2, 3, 4, 5]),
2246
+ await transform(Transducer.map(numberToSquaredReadable), new MockWritable([]))([1, 2, 3, 4, 5]),
2471
2247
  new MockWritable([1, 4, 9, 16, 25].map(number => new Uint8Array([number]))),
2472
2248
  )
2473
2249
  const numberToNumberObjectReadable = number => arrayToObjectReadableStream([{ number }])
2474
2250
  assert.deepEqual(
2475
- await transform(map(numberToNumberObjectReadable), new MockWritable([]))([1, 2, 3, 4, 5]),
2251
+ await transform(Transducer.map(numberToNumberObjectReadable), new MockWritable([]))([1, 2, 3, 4, 5]),
2476
2252
  new MockWritable([
2477
2253
  { number: 1 },
2478
2254
  { number: 2 },
@@ -2483,12 +2259,12 @@ transform(
2483
2259
  )
2484
2260
  const numberToDuplicateString = number => `${number}${number}`
2485
2261
  assert.deepEqual(
2486
- await transform(map(numberToDuplicateString), new MockWritable([]))([1, 2, 3, 4, 5]),
2262
+ await transform(Transducer.map(numberToDuplicateString), new MockWritable([]))([1, 2, 3, 4, 5]),
2487
2263
  new MockWritable(['11', '22', '33', '44', '55']),
2488
2264
  )
2489
2265
  const numberToDuplicateUint8Array = number => new Uint8Array([number, number])
2490
2266
  assert.deepEqual(
2491
- transform(map(numberToDuplicateUint8Array), new MockWritable([]))([1, 2, 3, 4, 5]),
2267
+ transform(Transducer.map(numberToDuplicateUint8Array), new MockWritable([]))([1, 2, 3, 4, 5]),
2492
2268
  new MockWritable([
2493
2269
  new Uint8Array([1, 1]),
2494
2270
  new Uint8Array([2, 2]),
@@ -2499,7 +2275,7 @@ transform(
2499
2275
  )
2500
2276
  const numberToObjectNumber = number => ({ number })
2501
2277
  assert.deepEqual(
2502
- transform(map(numberToObjectNumber), new MockWritable([]))([1, 2, 3, 4, 5]),
2278
+ transform(Transducer.map(numberToObjectNumber), new MockWritable([]))([1, 2, 3, 4, 5]),
2503
2279
  new MockWritable([
2504
2280
  { number: 1 },
2505
2281
  { number: 2 },
@@ -2510,16 +2286,16 @@ transform(
2510
2286
  )
2511
2287
  const toNull = () => null
2512
2288
  assert.deepEqual(
2513
- transform(map(toNull), new MockWritable([]))([1, 2, 3, 4, 5]),
2289
+ transform(Transducer.map(toNull), new MockWritable([]))([1, 2, 3, 4, 5]),
2514
2290
  new MockWritable([null, null, null, null, null]),
2515
2291
  )
2516
2292
  const getEmptyReadable = () => binaryToReadableStream(Buffer.from([]))
2517
2293
  assert.deepEqual(
2518
- await transform(map(getEmptyReadable), new MockWritable([]))([1, 2, 3, 4, 5]),
2294
+ await transform(Transducer.map(getEmptyReadable), new MockWritable([]))([1, 2, 3, 4, 5]),
2519
2295
  new MockWritable([]),
2520
2296
  )
2521
2297
  assert.throws(
2522
- () => transform(map(function () {
2298
+ () => transform(Transducer.map(function () {
2523
2299
  throw new Error('hey')
2524
2300
  }), new MockWritable([]))([1, 2, 3, 4, 5]),
2525
2301
  new Error('hey'),
@@ -2527,21 +2303,21 @@ transform(
2527
2303
  })
2528
2304
  it('init 3', async () => {
2529
2305
  assert.strictEqual(
2530
- transform(map(square), 3)([1, 2, 3, 4, 5]),
2306
+ transform(Transducer.map(square), 3)([1, 2, 3, 4, 5]),
2531
2307
  3,
2532
2308
  )
2533
2309
  })
2534
2310
  it('init null|undefined', async () => {
2535
2311
  assert.strictEqual(
2536
- transform(map(square), null)([1, 2, 3, 4, 5]),
2312
+ transform(Transducer.map(square), null)([1, 2, 3, 4, 5]),
2537
2313
  null,
2538
2314
  )
2539
2315
  assert.strictEqual(
2540
- transform(map(square), undefined)([1, 2, 3, 4, 5]),
2316
+ transform(Transducer.map(square), undefined)([1, 2, 3, 4, 5]),
2541
2317
  undefined,
2542
2318
  )
2543
2319
  assert.strictEqual(
2544
- transform(map(square))([1, 2, 3, 4, 5]),
2320
+ transform(Transducer.map(square))([1, 2, 3, 4, 5]),
2545
2321
  undefined,
2546
2322
  )
2547
2323
  })
@@ -2549,23 +2325,23 @@ transform(
2549
2325
  })
2550
2326
  })
2551
2327
 
2552
- describe('transform - v1.5.11 regression', () => {
2553
- const squareOdds = pipe([filter(isOdd), map(square)])
2554
- const asyncEvens = filter(asyncIsEven)
2328
+ describe('transform - misc', () => {
2329
+ const squareOdds = compose([Transducer.filter(isOdd), Transducer.map(square)])
2330
+ const asyncEvens = Transducer.filter(asyncIsEven)
2555
2331
  const bigNumbers = [1n, 2n, 3n, 4n, 5n]
2556
- const squareOddsToString = pipe([
2557
- filter(isOdd),
2558
- map(pipe([square, x => `${x}`])),
2332
+ const squareOddsToString = compose([
2333
+ Transducer.filter(isOdd),
2334
+ Transducer.map(pipe([square, x => `${x}`])),
2559
2335
  ])
2560
2336
  it('sync transforms iterable to null', async () => {
2561
2337
  let y = ''
2562
- ase(transform(map(tap(x => { y += x })), null)([1, 2, 3, 4, 5]), null)
2338
+ ase(transform(Transducer.map(tap(x => { y += x })), null)([1, 2, 3, 4, 5]), null)
2563
2339
  ase(y, '12345')
2564
2340
  })
2565
2341
  it('async transforms iterable to null', async () => {
2566
2342
  let y = ''
2567
- aok(transform(map(tap(async () => {})), null)([1, 2, 3, 4, 5]) instanceof Promise)
2568
- ase(await transform(map(tap(async x => { y += x })), null)([1, 2, 3, 4, 5]), null)
2343
+ aok(transform(Transducer.map(tap(async () => {})), null)([1, 2, 3, 4, 5]) instanceof Promise)
2344
+ ase(await transform(Transducer.map(tap(async x => { y += x })), null)([1, 2, 3, 4, 5]), null)
2569
2345
  ase(y, '12345')
2570
2346
  })
2571
2347
  it('sync transforms iterable to array', async () => {
@@ -2596,24 +2372,24 @@ transform(
2596
2372
  for (const constructor of numberTypedArrayConstructors) {
2597
2373
  ade(
2598
2374
  transform(squareOddsToString, new constructor(0))([1, 2, 3, 4, 5]),
2599
- new constructor([1, 9, 2, 5]),
2375
+ new constructor([1, 9, 25]),
2600
2376
  )
2601
2377
  }
2602
2378
  ade(
2603
2379
  transform(squareOddsToString, Buffer.alloc(0))([1, 2, 3, 4, 5]),
2604
- Buffer.from([1, 9, 2, 5]),
2380
+ Buffer.from([1, 9, 25]),
2605
2381
  )
2606
2382
  })
2607
2383
  it('coerces booleans to 0 and 1', async () => {
2608
2384
  for (const constructor of numberTypedArrayConstructors) {
2609
2385
  assert.deepEqual(
2610
- transform(map(x => x), new constructor(0))([true, false, false]),
2386
+ transform(Transducer.map(x => x), new constructor(0))([true, false, false]),
2611
2387
  new constructor([1, 0, 0])
2612
2388
  )
2613
2389
  }
2614
2390
  for (const constructor of bigIntTypedArrayConstructors) {
2615
2391
  assert.deepEqual(
2616
- transform(map(x => x), new constructor(0))([true, false, false]),
2392
+ transform(Transducer.map(x => x), new constructor(0))([true, false, false]),
2617
2393
  new constructor([1n, 0n, 0n])
2618
2394
  )
2619
2395
  }
@@ -2629,7 +2405,7 @@ transform(
2629
2405
  it('sync transforms iterable to a bigint TypedArray', async () => {
2630
2406
  const isBigOdd = x => (x % 2n === 1n)
2631
2407
  const bigSquare = x => x ** 2n
2632
- const squareBigOdds = pipe([filter(isBigOdd), map(bigSquare)])
2408
+ const squareBigOdds = compose([Transducer.filter(isBigOdd), Transducer.map(bigSquare)])
2633
2409
  for (const constructor of bigIntTypedArrayConstructors) {
2634
2410
  ade(
2635
2411
  transform(squareBigOdds, new constructor(0))(bigNumbers),
@@ -2639,7 +2415,7 @@ transform(
2639
2415
  })
2640
2416
  it('async transforms iterable to a bigint TypedArray', async () => {
2641
2417
  const asyncIsBigEven = async x => (x % 2n === 0n)
2642
- const asyncBigEvens = filter(asyncIsBigEven)
2418
+ const asyncBigEvens = Transducer.filter(asyncIsBigEven)
2643
2419
  for (const constructor of bigIntTypedArrayConstructors) {
2644
2420
  const buffer99 = new constructor([9n, 9n])
2645
2421
  const buffer9924 = transform(asyncBigEvens, buffer99)(bigNumbers)
@@ -2659,9 +2435,9 @@ transform(
2659
2435
  await fs.promises.unlink('./tmp')
2660
2436
  })
2661
2437
  it('async transforms iterable to writeable stream', async () => {
2662
- const asyncEvensToString = pipe([
2663
- filter(asyncIsEven),
2664
- map(x => `${x}`)
2438
+ const asyncEvensToString = compose([
2439
+ Transducer.filter(asyncIsEven),
2440
+ Transducer.map(x => `${x}`)
2665
2441
  ])
2666
2442
  const tmpWriter = fs.createWriteStream(path.join(__dirname, './tmp'))
2667
2443
  tmpWriter.write('99')
@@ -2678,42 +2454,42 @@ transform(
2678
2454
  })
2679
2455
  it('sync transforms an iterable to an object', async () => {
2680
2456
  ade(
2681
- transform(map(n => ({ [n]: n })), {})([1, 2, 3, 4, 5]),
2457
+ transform(Transducer.map(n => ({ [n]: n })), {})([1, 2, 3, 4, 5]),
2682
2458
  { '1': 1, '2': 2, '3': 3, '4': 4, '5': 5 },
2683
2459
  )
2684
2460
  })
2685
2461
  it('async transforms an iterable to an object', async () => {
2686
2462
  aok(
2687
- transform(map(async n => [n, n]), {})([1, 2, 3, 4, 5]) instanceof Promise,
2463
+ transform(Transducer.map(async n => [n, n]), {})([1, 2, 3, 4, 5]) instanceof Promise,
2688
2464
  )
2689
2465
  aok(
2690
- transform(map(async n => ({ [n]: n })), {})([1, 2, 3, 4, 5]) instanceof Promise,
2466
+ transform(Transducer.map(async n => ({ [n]: n })), {})([1, 2, 3, 4, 5]) instanceof Promise,
2691
2467
  )
2692
2468
  ade(
2693
- await transform(map(async n => ({ [n]: n })), {})([1, 2, 3, 4, 5]),
2469
+ await transform(Transducer.map(async n => ({ [n]: n })), {})([1, 2, 3, 4, 5]),
2694
2470
  { '1': 1, '2': 2, '3': 3, '4': 4, '5': 5 },
2695
2471
  )
2696
2472
  })
2697
2473
  it('initial value can be a function', async () => {
2698
2474
  const square = x => x ** 2
2699
2475
  ade(
2700
- transform(map(square), () => [])([1, 2, 3]),
2476
+ transform(Transducer.map(square), () => [])([1, 2, 3]),
2701
2477
  [1, 4, 9],
2702
2478
  )
2703
2479
  })
2704
2480
  it('initial value can be an async function', async () => {
2705
2481
  const square = x => x ** 2
2706
2482
  aok(
2707
- transform(map(square), async () => [])([1, 2, 3]) instanceof Promise,
2483
+ transform(Transducer.map(square), async () => [])([1, 2, 3]) instanceof Promise,
2708
2484
  )
2709
2485
  ade(
2710
- await transform(map(square), async () => [])([1, 2, 3]),
2486
+ await transform(Transducer.map(square), async () => [])([1, 2, 3]),
2711
2487
  [1, 4, 9],
2712
2488
  )
2713
2489
  })
2714
- it('referential initial values are unsafe', async () => {
2490
+ it('nonfunction initial values can be unsafe', async () => {
2715
2491
  const square = x => x ** 2
2716
- const unsafeSquareAllTransform = transform(map(square), [])
2492
+ const unsafeSquareAllTransform = transform(Transducer.map(square), [])
2717
2493
  ade(
2718
2494
  unsafeSquareAllTransform([1, 2, 3]),
2719
2495
  [1, 4, 9],
@@ -2722,7 +2498,7 @@ transform(
2722
2498
  unsafeSquareAllTransform([1, 2, 3]),
2723
2499
  [1, 4, 9, 1, 4, 9],
2724
2500
  )
2725
- const safeSquareAllTransform = transform(map(square), () => [])
2501
+ const safeSquareAllTransform = transform(Transducer.map(square), () => [])
2726
2502
  ade(
2727
2503
  safeSquareAllTransform([1, 2, 3]),
2728
2504
  [1, 4, 9],
@@ -2735,12 +2511,12 @@ transform(
2735
2511
  it('=> [] for initial () => [] and input []', async () => {
2736
2512
  const square = x => x ** 2
2737
2513
  ade(
2738
- transform(map(square), () => [])([]),
2514
+ transform(Transducer.map(square), () => [])([]),
2739
2515
  [],
2740
2516
  )
2741
2517
  const emptyAsyncIterator = (async function*(){})()
2742
2518
  ade(
2743
- await transform(map(square), () => [])(emptyAsyncIterator),
2519
+ await transform(Transducer.map(square), () => [])(emptyAsyncIterator),
2744
2520
  [],
2745
2521
  )
2746
2522
  })
@@ -2748,36 +2524,34 @@ transform(
2748
2524
 
2749
2525
  describe('flatMap', () => {
2750
2526
  describe(`
2751
- DuplexStream = { read: function, write: function }
2752
-
2753
- Monad = Array|String|Set
2754
- |TypedArray|DuplexStream|Iterator|AsyncIterator
2755
- |{ chain: function }|{ flatMap: function }|Object
2756
-
2757
- Foldable = Iterable|AsyncIterable|{ reduce: function }
2527
+ type FlatMappable = Array|String|Set|Iterator|AsyncIterator
2528
+ type Iterable = Iterable|AsyncIterable|Object<value any>
2758
2529
 
2759
2530
  flatMap(
2760
- flatMapper item=>Promise|Monad|Foldable|any,
2761
- )(value Monad<item any>) -> result Monad
2531
+ value FlatMappable,
2532
+ flatMapper (item any)=>Promise|Iterable,
2533
+ ) -> result Promise|FlatMappable
2762
2534
 
2763
2535
  flatMap(
2764
- flatMapper item=>Promise|Monad|Foldable|any,
2765
- )(
2766
- value (args ...any)=>Generator<item>,
2767
- ) -> flatMappingGeneratorFunction ...args=>Generator
2768
-
2769
- flatMap(
2770
- flatMapper item=>Promise|Monad|Foldable|any,
2771
- )(
2772
- value (args ...any)=>AsyncGenerator<item>,
2773
- ) -> flatMappingAsyncGeneratorFunction ...args=>AsyncGenerator
2536
+ flatMapper (item any)=>Promise|Iterable,
2537
+ )(value FlatMappable) -> result Promise|FlatMappable
2538
+ `, () => {
2774
2539
 
2775
- Reducer<T> = (any, T)=>Promise|any
2540
+ it('API coverage', async () => {
2541
+ assert.deepEqual(
2542
+ flatMap([1, 2, 3, 4, 5], number => isOdd(number) ? [number] : []),
2543
+ [1, 3, 5],
2544
+ )
2545
+ assert.deepEqual(
2546
+ flatMap(number => isOdd(number) ? [number] : [])([1, 2, 3, 4, 5]),
2547
+ [1, 3, 5],
2548
+ )
2549
+ assert.deepEqual(
2550
+ await flatMap(Promise.resolve([1, 2, 3, 4, 5]), number => isOdd(number) ? [number] : []),
2551
+ [1, 3, 5],
2552
+ )
2553
+ })
2776
2554
 
2777
- flatMap(
2778
- flatMapper item=>Promise|Monad|Foldable|any,
2779
- )(value Reducer<item>) -> flatMappingReducer Reducer
2780
- `, () => {
2781
2555
  const async = func => async function asyncFunc(...args) {
2782
2556
  return func(...args)
2783
2557
  }
@@ -3002,198 +2776,6 @@ flatMap(
3002
2776
  [numbersSet, duplicateReadableStream, new Set(numbersArray.map(duplicateBuffer))],
3003
2777
  [numbersSet, async(duplicateReadableStream), new Set(numbersArray.map(duplicateBuffer))],
3004
2778
 
3005
- [numbersUint8Array, identity, numbersUint8Array],
3006
- [numbersUint8Array, number => [[number, number]], numbersUint8ArrayDuplicates],
3007
- [numbersUint8Array, async(number => [[number, number]]), numbersUint8ArrayDuplicates],
3008
- [numbersUint8Array, number => [new Uint8Array([number, number])], numbersUint8ArrayDuplicates], // binary cannot nest arrays
3009
- [numbersUint8Array, async(number => [new Uint8Array([number, number])]), numbersUint8ArrayDuplicates],
3010
- [numbersUint8Array, number => [new Uint8Array([number]), new Uint8Array([number])], numbersUint8ArrayDuplicates],
3011
- [numbersUint8Array, duplicateArray, numbersUint8ArrayDuplicates],
3012
- [numbersUint8Array, async(duplicateArray), numbersUint8ArrayDuplicates],
3013
- [numbersUint8Array, DuplicateArray.of, numbersUint8ArrayDuplicates],
3014
- [numbersUint8Array, async(DuplicateArray.of), numbersUint8ArrayDuplicates],
3015
- [numbersUint8Array, Identity.of, numbersUint8Array],
3016
- [numbersUint8Array, async(Identity.of), numbersUint8Array],
3017
- [numbersUint8Array, duplicateMockFoldable, numbersUint8ArrayDuplicates],
3018
- [numbersUint8Array, async(duplicateMockFoldable), numbersUint8ArrayDuplicates],
3019
- [numbersUint8Array, duplicateAsyncMockFoldable, numbersUint8ArrayDuplicates],
3020
- [numbersUint8Array, async(duplicateAsyncMockFoldable), numbersUint8ArrayDuplicates],
3021
- [numbersUint8Array, duplicateObject, numbersUint8ArrayDuplicates],
3022
- [numbersUint8Array, async(duplicateObject), numbersUint8ArrayDuplicates],
3023
- [numbersUint8Array, duplicateUint8Array, numbersUint8ArrayDuplicates],
3024
- [numbersUint8Array, async(duplicateUint8Array), numbersUint8ArrayDuplicates],
3025
- [numbersInt8Array, duplicateArray, numbersInt8ArrayDuplicates],
3026
- [numbersInt8Array, async(duplicateArray), numbersInt8ArrayDuplicates],
3027
- [numbersInt8Array, DuplicateArray.of, numbersInt8ArrayDuplicates],
3028
- [numbersInt8Array, async(DuplicateArray.of), numbersInt8ArrayDuplicates],
3029
- [numbersInt8Array, Identity.of, numbersInt8Array],
3030
- [numbersInt8Array, async(Identity.of), numbersInt8Array],
3031
- [numbersInt8Array, duplicateMockFoldable, numbersInt8ArrayDuplicates],
3032
- [numbersInt8Array, async(duplicateMockFoldable), numbersInt8ArrayDuplicates],
3033
- [numbersInt8Array, duplicateAsyncMockFoldable, numbersInt8ArrayDuplicates],
3034
- [numbersInt8Array, async(duplicateAsyncMockFoldable), numbersInt8ArrayDuplicates],
3035
- [numbersInt8Array, duplicateObject, numbersInt8ArrayDuplicates],
3036
- [numbersInt8Array, async(duplicateObject), numbersInt8ArrayDuplicates],
3037
- [numbersInt8Array, duplicateInt8Array, numbersInt8ArrayDuplicates],
3038
- [numbersInt8Array, async(duplicateInt8Array), numbersInt8ArrayDuplicates],
3039
- [numbersUint16Array, duplicateArray, numbersUint16ArrayDuplicates],
3040
- [numbersUint16Array, async(duplicateArray), numbersUint16ArrayDuplicates],
3041
- [numbersUint16Array, DuplicateArray.of, numbersUint16ArrayDuplicates],
3042
- [numbersUint16Array, async(DuplicateArray.of), numbersUint16ArrayDuplicates],
3043
- [numbersUint16Array, Identity.of, numbersUint16Array],
3044
- [numbersUint16Array, async(Identity.of), numbersUint16Array],
3045
- [numbersUint16Array, duplicateMockFoldable, numbersUint16ArrayDuplicates],
3046
- [numbersUint16Array, async(duplicateMockFoldable), numbersUint16ArrayDuplicates],
3047
- [numbersUint16Array, duplicateAsyncMockFoldable, numbersUint16ArrayDuplicates],
3048
- [numbersUint16Array, async(duplicateAsyncMockFoldable), numbersUint16ArrayDuplicates],
3049
- [numbersUint16Array, duplicateObject, numbersUint16ArrayDuplicates],
3050
- [numbersUint16Array, async(duplicateObject), numbersUint16ArrayDuplicates],
3051
- [numbersUint16Array, duplicateUint16Array, numbersUint16ArrayDuplicates],
3052
- [numbersUint16Array, async(duplicateUint16Array), numbersUint16ArrayDuplicates],
3053
- [numbersInt16Array, duplicateArray, numbersInt16ArrayDuplicates],
3054
- [numbersInt16Array, async(duplicateArray), numbersInt16ArrayDuplicates],
3055
- [numbersInt16Array, DuplicateArray.of, numbersInt16ArrayDuplicates],
3056
- [numbersInt16Array, async(DuplicateArray.of), numbersInt16ArrayDuplicates],
3057
- [numbersInt16Array, Identity.of, numbersInt16Array],
3058
- [numbersInt16Array, async(Identity.of), numbersInt16Array],
3059
- [numbersInt16Array, duplicateMockFoldable, numbersInt16ArrayDuplicates],
3060
- [numbersInt16Array, async(duplicateMockFoldable), numbersInt16ArrayDuplicates],
3061
- [numbersInt16Array, duplicateAsyncMockFoldable, numbersInt16ArrayDuplicates],
3062
- [numbersInt16Array, async(duplicateAsyncMockFoldable), numbersInt16ArrayDuplicates],
3063
- [numbersInt16Array, duplicateObject, numbersInt16ArrayDuplicates],
3064
- [numbersInt16Array, async(duplicateObject), numbersInt16ArrayDuplicates],
3065
- [numbersInt16Array, duplicateInt16Array, numbersInt16ArrayDuplicates],
3066
- [numbersInt16Array, async(duplicateInt16Array), numbersInt16ArrayDuplicates],
3067
- [numbersUint32Array, duplicateArray, numbersUint32ArrayDuplicates],
3068
- [numbersUint32Array, async(duplicateArray), numbersUint32ArrayDuplicates],
3069
- [numbersUint32Array, DuplicateArray.of, numbersUint32ArrayDuplicates],
3070
- [numbersUint32Array, async(DuplicateArray.of), numbersUint32ArrayDuplicates],
3071
- [numbersUint32Array, Identity.of, numbersUint32Array],
3072
- [numbersUint32Array, async(Identity.of), numbersUint32Array],
3073
- [numbersUint32Array, duplicateMockFoldable, numbersUint32ArrayDuplicates],
3074
- [numbersUint32Array, async(duplicateMockFoldable), numbersUint32ArrayDuplicates],
3075
- [numbersUint32Array, duplicateAsyncMockFoldable, numbersUint32ArrayDuplicates],
3076
- [numbersUint32Array, async(duplicateAsyncMockFoldable), numbersUint32ArrayDuplicates],
3077
- [numbersUint32Array, duplicateObject, numbersUint32ArrayDuplicates],
3078
- [numbersUint32Array, async(duplicateObject), numbersUint32ArrayDuplicates],
3079
- [numbersUint32Array, duplicateUint32Array, numbersUint32ArrayDuplicates],
3080
- [numbersUint32Array, async(duplicateUint32Array), numbersUint32ArrayDuplicates],
3081
- [numbersInt32Array, duplicateArray, numbersInt32ArrayDuplicates],
3082
- [numbersInt32Array, async(duplicateArray), numbersInt32ArrayDuplicates],
3083
- [numbersInt32Array, DuplicateArray.of, numbersInt32ArrayDuplicates],
3084
- [numbersInt32Array, async(DuplicateArray.of), numbersInt32ArrayDuplicates],
3085
- [numbersInt32Array, Identity.of, numbersInt32Array],
3086
- [numbersInt32Array, async(Identity.of), numbersInt32Array],
3087
- [numbersInt32Array, duplicateMockFoldable, numbersInt32ArrayDuplicates],
3088
- [numbersInt32Array, async(duplicateMockFoldable), numbersInt32ArrayDuplicates],
3089
- [numbersInt32Array, duplicateAsyncMockFoldable, numbersInt32ArrayDuplicates],
3090
- [numbersInt32Array, async(duplicateAsyncMockFoldable), numbersInt32ArrayDuplicates],
3091
- [numbersInt32Array, duplicateObject, numbersInt32ArrayDuplicates],
3092
- [numbersInt32Array, async(duplicateObject), numbersInt32ArrayDuplicates],
3093
- [numbersInt32Array, duplicateInt32Array, numbersInt32ArrayDuplicates],
3094
- [numbersInt32Array, async(duplicateInt32Array), numbersInt32ArrayDuplicates],
3095
- [numbersFloat32Array, duplicateArray, numbersFloat32ArrayDuplicates],
3096
- [numbersFloat32Array, async(duplicateArray), numbersFloat32ArrayDuplicates],
3097
- [numbersFloat32Array, DuplicateArray.of, numbersFloat32ArrayDuplicates],
3098
- [numbersFloat32Array, async(DuplicateArray.of), numbersFloat32ArrayDuplicates],
3099
- [numbersFloat32Array, Identity.of, numbersFloat32Array],
3100
- [numbersFloat32Array, async(Identity.of), numbersFloat32Array],
3101
- [numbersFloat32Array, duplicateMockFoldable, numbersFloat32ArrayDuplicates],
3102
- [numbersFloat32Array, async(duplicateMockFoldable), numbersFloat32ArrayDuplicates],
3103
- [numbersFloat32Array, duplicateAsyncMockFoldable, numbersFloat32ArrayDuplicates],
3104
- [numbersFloat32Array, async(duplicateAsyncMockFoldable), numbersFloat32ArrayDuplicates],
3105
- [numbersFloat32Array, duplicateObject, numbersFloat32ArrayDuplicates],
3106
- [numbersFloat32Array, async(duplicateObject), numbersFloat32ArrayDuplicates],
3107
- [numbersFloat32Array, duplicateFloat32Array, numbersFloat32ArrayDuplicates],
3108
- [numbersFloat32Array, async(duplicateFloat32Array), numbersFloat32ArrayDuplicates],
3109
- [numbersFloat64Array, duplicateArray, numbersFloat64ArrayDuplicates],
3110
- [numbersFloat64Array, async(duplicateArray), numbersFloat64ArrayDuplicates],
3111
- [numbersFloat64Array, DuplicateArray.of, numbersFloat64ArrayDuplicates],
3112
- [numbersFloat64Array, async(DuplicateArray.of), numbersFloat64ArrayDuplicates],
3113
- [numbersFloat64Array, Identity.of, numbersFloat64Array],
3114
- [numbersFloat64Array, async(Identity.of), numbersFloat64Array],
3115
- [numbersFloat64Array, duplicateMockFoldable, numbersFloat64ArrayDuplicates],
3116
- [numbersFloat64Array, async(duplicateMockFoldable), numbersFloat64ArrayDuplicates],
3117
- [numbersFloat64Array, duplicateAsyncMockFoldable, numbersFloat64ArrayDuplicates],
3118
- [numbersFloat64Array, async(duplicateAsyncMockFoldable), numbersFloat64ArrayDuplicates],
3119
- [numbersFloat64Array, duplicateObject, numbersFloat64ArrayDuplicates],
3120
- [numbersFloat64Array, async(duplicateObject), numbersFloat64ArrayDuplicates],
3121
- [numbersFloat64Array, duplicateFloat64Array, numbersFloat64ArrayDuplicates],
3122
- [numbersFloat64Array, async(duplicateFloat64Array), numbersFloat64ArrayDuplicates],
3123
- [numbersBigUint64Array, duplicateArray, numbersBigUint64ArrayDuplicates],
3124
- [numbersBigUint64Array, async(duplicateArray), numbersBigUint64ArrayDuplicates],
3125
- [numbersBigUint64Array, DuplicateArray.of, numbersBigUint64ArrayDuplicates],
3126
- [numbersBigUint64Array, async(DuplicateArray.of), numbersBigUint64ArrayDuplicates],
3127
- [numbersBigUint64Array, Identity.of, numbersBigUint64Array],
3128
- [numbersBigUint64Array, async(Identity.of), numbersBigUint64Array],
3129
- [numbersBigUint64Array, duplicateMockFoldable, numbersBigUint64ArrayDuplicates],
3130
- [numbersBigUint64Array, async(duplicateMockFoldable), numbersBigUint64ArrayDuplicates],
3131
- [numbersBigUint64Array, duplicateAsyncMockFoldable, numbersBigUint64ArrayDuplicates],
3132
- [numbersBigUint64Array, async(duplicateAsyncMockFoldable), numbersBigUint64ArrayDuplicates],
3133
- [numbersBigUint64Array, duplicateObjectBigInt, numbersBigUint64ArrayDuplicates],
3134
- [numbersBigUint64Array, async(duplicateObjectBigInt), numbersBigUint64ArrayDuplicates],
3135
- [numbersBigUint64Array, duplicateBigUint64Array, numbersBigUint64ArrayDuplicates],
3136
- [numbersBigUint64Array, async(duplicateBigUint64Array), numbersBigUint64ArrayDuplicates],
3137
- [numbersBigInt64Array, duplicateArray, numbersBigInt64ArrayDuplicates],
3138
- [numbersBigInt64Array, async(duplicateArray), numbersBigInt64ArrayDuplicates],
3139
- [numbersBigInt64Array, DuplicateArray.of, numbersBigInt64ArrayDuplicates],
3140
- [numbersBigInt64Array, async(DuplicateArray.of), numbersBigInt64ArrayDuplicates],
3141
- [numbersBigInt64Array, Identity.of, numbersBigInt64Array],
3142
- [numbersBigInt64Array, async(Identity.of), numbersBigInt64Array],
3143
- [numbersBigInt64Array, duplicateMockFoldable, numbersBigInt64ArrayDuplicates],
3144
- [numbersBigInt64Array, async(duplicateMockFoldable), numbersBigInt64ArrayDuplicates],
3145
- [numbersBigInt64Array, duplicateAsyncMockFoldable, numbersBigInt64ArrayDuplicates],
3146
- [numbersBigInt64Array, async(duplicateAsyncMockFoldable), numbersBigInt64ArrayDuplicates],
3147
- [numbersBigInt64Array, duplicateObjectBigInt, numbersBigInt64ArrayDuplicates],
3148
- [numbersBigInt64Array, async(duplicateObjectBigInt), numbersBigInt64ArrayDuplicates],
3149
- [numbersBigInt64Array, duplicateBigInt64Array, numbersBigInt64ArrayDuplicates],
3150
- [numbersBigInt64Array, async(duplicateBigInt64Array), numbersBigInt64ArrayDuplicates],
3151
- [bigIntsSet, duplicateBigUint64Array, bigIntsSet],
3152
- [bigIntsSet, async(duplicateBigUint64Array), bigIntsSet],
3153
- [bigIntsSet, duplicateBigInt64Array, bigIntsSet],
3154
- [bigIntsSet, async(duplicateBigInt64Array), bigIntsSet],
3155
-
3156
- [new MockDuplexStream(numbersArray), identity, Object.assign(new MockDuplexStream(numbersArray), { array: numbersArray })],
3157
- [new MockDuplexStream(numbersArray), () => null, Object.assign(new MockDuplexStream(numbersArray), { array: [null, null, null, null, null] })],
3158
- [new MockDuplexStream(numbersArray), duplicateArray, Object.assign(new MockDuplexStream(numbersArray), { array: numbersDuplicates })],
3159
- [new MockDuplexStream(numbersArray), async(duplicateArray), Object.assign(new MockDuplexStream(numbersArray), { array: numbersDuplicates })],
3160
- [new MockDuplexStream(numbersArray), DuplicateArray.of, Object.assign(new MockDuplexStream(numbersArray), { array: numbersArray.map(duplicateArray) })], // .chain is 1 flat
3161
- [new MockDuplexStream(numbersArray), async(DuplicateArray.of), Object.assign(new MockDuplexStream(numbersArray), { array: numbersArray.map(duplicateArray) })],
3162
- [new MockDuplexStream(numbersArray), Identity.of, Object.assign(new MockDuplexStream(numbersArray), { array: numbersArray })],
3163
- [new MockDuplexStream(numbersArray), async(Identity.of), Object.assign(new MockDuplexStream(numbersArray), { array: numbersArray })],
3164
- [new MockDuplexStream(numbersArray), duplicateMockFoldable, Object.assign(new MockDuplexStream(numbersArray), { array: numbersDuplicates })],
3165
- [new MockDuplexStream(numbersArray), async(duplicateMockFoldable), Object.assign(new MockDuplexStream(numbersArray), { array: numbersDuplicates })],
3166
- [new MockDuplexStream(numbersArray), duplicateAsyncMockFoldable, Object.assign(new MockDuplexStream(numbersArray), { array: numbersDuplicates })],
3167
- [new MockDuplexStream(numbersArray), async(duplicateAsyncMockFoldable), Object.assign(new MockDuplexStream(numbersArray), { array: numbersDuplicates })],
3168
- [new MockDuplexStream(numbersArray), duplicateObject, Object.assign(new MockDuplexStream(numbersArray), { array: numbersDuplicates })],
3169
- [new MockDuplexStream(numbersArray), async(duplicateObject), Object.assign(new MockDuplexStream(numbersArray), { array: numbersDuplicates })],
3170
- [new MockDuplexStream(numbersArray), duplicateString, Object.assign(new MockDuplexStream(numbersArray), { array: numbersDuplicates })],
3171
- [new MockDuplexStream(numbersArray), async(duplicateString), Object.assign(new MockDuplexStream(numbersArray), { array: numbersDuplicates })],
3172
- [new MockDuplexStream(numbersArray), duplicateReadableStream, Object.assign(new MockDuplexStream(numbersArray), { array: numbersArray.map(duplicateBuffer) })], // 1 flat to buf
3173
- [new MockDuplexStream(numbersArray), async(duplicateReadableStream), Object.assign(new MockDuplexStream(numbersArray), { array: numbersArray.map(duplicateBuffer) })],
3174
- [new MockDuplexStream(numbersArray), duplicateUint8ClampedArray, Object.assign(new MockDuplexStream(numbersArray), { array: numbersDuplicates })],
3175
- [new MockDuplexStream(numbersArray), async(duplicateUint8ClampedArray), Object.assign(new MockDuplexStream(numbersArray), { array: numbersDuplicates })],
3176
- [new MockDuplexStream(numbersArray), duplicateUint8Array, Object.assign(new MockDuplexStream(numbersArray), { array: numbersDuplicates })],
3177
- [new MockDuplexStream(numbersArray), async(duplicateUint8Array), Object.assign(new MockDuplexStream(numbersArray), { array: numbersDuplicates })],
3178
- [new MockDuplexStream(numbersArray), duplicateInt8Array, Object.assign(new MockDuplexStream(numbersArray), { array: numbersDuplicates })],
3179
- [new MockDuplexStream(numbersArray), async(duplicateInt8Array), Object.assign(new MockDuplexStream(numbersArray), { array: numbersDuplicates })],
3180
- [new MockDuplexStream(numbersArray), duplicateUint16Array, Object.assign(new MockDuplexStream(numbersArray), { array: numbersDuplicates })],
3181
- [new MockDuplexStream(numbersArray), async(duplicateUint16Array), Object.assign(new MockDuplexStream(numbersArray), { array: numbersDuplicates })],
3182
- [new MockDuplexStream(numbersArray), duplicateInt16Array, Object.assign(new MockDuplexStream(numbersArray), { array: numbersDuplicates })],
3183
- [new MockDuplexStream(numbersArray), async(duplicateInt16Array), Object.assign(new MockDuplexStream(numbersArray), { array: numbersDuplicates })],
3184
- [new MockDuplexStream(numbersArray), duplicateUint32Array, Object.assign(new MockDuplexStream(numbersArray), { array: numbersDuplicates })],
3185
- [new MockDuplexStream(numbersArray), async(duplicateUint32Array), Object.assign(new MockDuplexStream(numbersArray), { array: numbersDuplicates })],
3186
- [new MockDuplexStream(numbersArray), duplicateInt32Array, Object.assign(new MockDuplexStream(numbersArray), { array: numbersDuplicates })],
3187
- [new MockDuplexStream(numbersArray), async(duplicateInt32Array), Object.assign(new MockDuplexStream(numbersArray), { array: numbersDuplicates })],
3188
- [new MockDuplexStream(numbersArray), duplicateFloat32Array, Object.assign(new MockDuplexStream(numbersArray), { array: numbersDuplicates })],
3189
- [new MockDuplexStream(numbersArray), async(duplicateFloat32Array), Object.assign(new MockDuplexStream(numbersArray), { array: numbersDuplicates })],
3190
- [new MockDuplexStream(numbersArray), duplicateFloat64Array, Object.assign(new MockDuplexStream(numbersArray), { array: numbersDuplicates })],
3191
- [new MockDuplexStream(numbersArray), async(duplicateFloat64Array), Object.assign(new MockDuplexStream(numbersArray), { array: numbersDuplicates })],
3192
- [new MockDuplexStream(bigIntsArray), duplicateBigUint64Array, Object.assign(new MockDuplexStream(numbersArray), { array: numbersDuplicates })],
3193
- [new MockDuplexStream(bigIntsArray), async(duplicateBigUint64Array), Object.assign(new MockDuplexStream(numbersArray), { array: numbersDuplicates })],
3194
- [new MockDuplexStream(bigIntsArray), duplicateBigInt64Array, Object.assign(new MockDuplexStream(numbersArray), { array: numbersDuplicates })], // 1 == 1n true
3195
- [new MockDuplexStream(bigIntsArray), async(duplicateBigInt64Array), Object.assign(new MockDuplexStream(numbersArray), { array: numbersDuplicates })], // 1 == 1n true
3196
-
3197
2779
  [numbersGeneratorFunction(), identity, numbersArray, function (expected, actual) {
3198
2780
  assert.deepEqual([...actual], expected)
3199
2781
  }],
@@ -3378,80 +2960,9 @@ flatMap(
3378
2960
  assert.strictEqual(flatMap(() => 'hey')(null), 'hey')
3379
2961
  })
3380
2962
 
3381
- it('value GeneratorFunction', async () => {
3382
- const numbers = function* () { yield 1; yield 2; yield 3; yield 4; yield 5 }
3383
- const duplicateNumbers = flatMap(duplicateArray)(numbers)
3384
- assert.equal(objectToString(duplicateNumbers), '[object GeneratorFunction]')
3385
- assert.deepEqual([...duplicateNumbers()], numbersDuplicates)
3386
- assert.deepEqual([...flatMap(() => null)(numbers)()], [null, null, null, null, null])
3387
- assert.deepEqual([...flatMap(() => [null, null])(numbers)()], [null, null, null, null, null, null, null, null, null, null])
3388
- assert.deepEqual([...flatMap(DuplicateArray.of)(numbers)()], numbersArray.map(duplicateArray))
3389
- assert.deepEqual([...flatMap(Identity.of)(numbers)()], [1, 2, 3, 4, 5])
3390
- assert.deepEqual([...flatMap(duplicateMockFoldable)(numbers)()], numbersDuplicates)
3391
- assert.deepEqual([...flatMap(duplicateArray)(numbers)()], numbersDuplicates)
3392
- assert.deepEqual([...flatMap(duplicateObject)(numbers)()], numbersDuplicates)
3393
- assert.deepEqual([...flatMap(duplicateUint8Array)(numbers)()], numbersDuplicates)
3394
- assert.deepEqual([...flatMap(number => new Set([number]))(numbers)()], numbersArray)
3395
- assert.deepEqual([...flatMap(() => 1)(numbers)()], [1, 1, 1, 1, 1])
3396
- })
3397
- it('value AsyncGeneratorFunction', async () => {
3398
- const numbers = async function* () { yield 1; yield 2; yield 3; yield 4; yield 5 }
3399
- const duplicateNumbers = flatMap(duplicateArray)(numbers)
3400
- assert.equal(objectToString(duplicateNumbers), '[object AsyncGeneratorFunction]')
3401
- assert.deepEqual(await asyncIteratorToArray(duplicateNumbers()), numbersDuplicates)
3402
- assert.deepEqual(await asyncIteratorToArray(flatMap(() => null)(numbers)()), [null, null, null, null, null])
3403
- assert.deepEqual(await asyncIteratorToArray(flatMap(() => [null, null])(numbers)()), [null, null, null, null, null, null, null, null, null, null])
3404
- assert.deepEqual(await asyncIteratorToArray(flatMap(DuplicateArray.of)(numbers)()), numbersArray.map(duplicateArray))
3405
- assert.deepEqual(await asyncIteratorToArray(flatMap(async(DuplicateArray.of))(numbers)()), numbersArray.map(duplicateArray))
3406
- assert.deepEqual(await asyncIteratorToArray(flatMap(Identity.of)(numbers)()), [1, 2, 3, 4, 5])
3407
- assert.deepEqual(await asyncIteratorToArray(flatMap(async(Identity.of))(numbers)()), [1, 2, 3, 4, 5])
3408
- assert.deepEqual(await asyncIteratorToArray(flatMap(duplicateArray)(numbers)()), numbersDuplicates)
3409
- assert.deepEqual(await asyncIteratorToArray(flatMap(async(duplicateArray))(numbers)()), numbersDuplicates)
3410
- assert.deepEqual(await asyncIteratorToArray(flatMap(duplicateObject)(numbers)()), numbersDuplicates)
3411
- assert.deepEqual(await asyncIteratorToArray(flatMap(async(duplicateObject))(numbers)()), numbersDuplicates)
3412
- assert.deepEqual(await asyncIteratorToArray(flatMap(duplicateUint8Array)(numbers)()), numbersDuplicates)
3413
- assert.deepEqual(await asyncIteratorToArray(flatMap(async(duplicateUint8Array))(numbers)()), numbersDuplicates)
3414
- assert.deepEqual(await asyncIteratorToArray(flatMap(duplicateMockFoldable)(numbers)()), numbersDuplicates)
3415
- assert.deepEqual(await asyncIteratorToArray(flatMap(async(duplicateMockFoldable))(numbers)()), numbersDuplicates)
3416
- assert.deepEqual(await asyncIteratorToArray(flatMap(duplicateReadableStream)(numbers)()), numbersArray.map(duplicateBuffer))
3417
- assert.deepEqual(await asyncIteratorToArray(flatMap(async(duplicateReadableStream))(numbers)()), numbersArray.map(duplicateBuffer))
3418
- assert.deepEqual(await asyncIteratorToArray(flatMap(number => new Set([number]))(numbers)()), numbersArray)
3419
- assert.deepEqual(await asyncIteratorToArray(flatMap(async(number => new Set([number])))(numbers)()), numbersArray)
3420
- assert.deepEqual(await asyncIteratorToArray(flatMap(() => 1)(numbers)()), [1, 1, 1, 1, 1])
3421
- assert.deepEqual(await asyncIteratorToArray(flatMap(async(() => 1))(numbers)()), [1, 1, 1, 1, 1])
3422
- })
3423
-
3424
- it('value Reducer', async () => {
3425
- const concat = (array, values) => array.concat(values)
3426
- assert.deepEqual([1, 2, 3, 4, 5].reduce(flatMap(duplicateArray)(concat), []), [1, 1, 2, 2, 3, 3, 4, 4, 5, 5])
3427
- assert.deepEqual([1, 2, 3, 4, 5].reduce(map(duplicateString)(concat), []), ['11', '22', '33', '44', '55'])
3428
- assert.deepEqual([1, 2, 3, 4, 5].reduce(flatMap(duplicateString)(concat), []), ['1', '1', '2', '2', '3', '3', '4', '4', '5', '5'])
3429
- assert.deepEqual([1, 2, 3, 4, 5].reduce(flatMap(duplicateObject)(concat), []), [1, 1, 2, 2, 3, 3, 4, 4, 5, 5])
3430
- assert.deepEqual([1, 2, 3, 4, 5].reduce(flatMap(duplicateBuffer)(concat), []), [1, 1, 2, 2, 3, 3, 4, 4, 5, 5])
3431
- assert.deepEqual([1, 2, 3, 4, 5].reduce(flatMap(duplicateUint8ClampedArray)(concat), []), [1, 1, 2, 2, 3, 3, 4, 4, 5, 5])
3432
- assert.deepEqual([1, 2, 3, 4, 5].reduce(flatMap(duplicateUint8Array)(concat), []), [1, 1, 2, 2, 3, 3, 4, 4, 5, 5])
3433
- assert.deepEqual([1, 2, 3, 4, 5].reduce(flatMap(duplicateInt8Array)(concat), []), [1, 1, 2, 2, 3, 3, 4, 4, 5, 5])
3434
- assert.deepEqual([1, 2, 3, 4, 5].reduce(flatMap(duplicateUint16Array)(concat), []), [1, 1, 2, 2, 3, 3, 4, 4, 5, 5])
3435
- assert.deepEqual([1, 2, 3, 4, 5].reduce(flatMap(duplicateInt16Array)(concat), []), [1, 1, 2, 2, 3, 3, 4, 4, 5, 5])
3436
- assert.deepEqual([1, 2, 3, 4, 5].reduce(flatMap(duplicateUint32Array)(concat), []), [1, 1, 2, 2, 3, 3, 4, 4, 5, 5])
3437
- assert.deepEqual([1, 2, 3, 4, 5].reduce(flatMap(duplicateInt32Array)(concat), []), [1, 1, 2, 2, 3, 3, 4, 4, 5, 5])
3438
- assert.deepEqual([1, 2, 3, 4, 5].reduce(flatMap(duplicateFloat32Array)(concat), []), [1, 1, 2, 2, 3, 3, 4, 4, 5, 5])
3439
- assert.deepEqual([1, 2, 3, 4, 5].reduce(flatMap(duplicateFloat64Array)(concat), []), [1, 1, 2, 2, 3, 3, 4, 4, 5, 5])
3440
- assert.deepEqual([1n, 2n, 3n, 4n, 5n].reduce(flatMap(duplicateBigUint64Array)(concat), []), [1n, 1n, 2n, 2n, 3n, 3n, 4n, 4n, 5n, 5n])
3441
- assert.deepEqual([1n, 2n, 3n, 4n, 5n].reduce(flatMap(duplicateBigInt64Array)(concat), []), [1n, 1n, 2n, 2n, 3n, 3n, 4n, 4n, 5n, 5n])
3442
- assert.deepEqual([1, 2, 3, 4, 5].reduce(flatMap(duplicateBuffer)(concat), []), [1, 1, 2, 2, 3, 3, 4, 4, 5, 5])
3443
- assert.deepEqual([1, 2, 3, 4, 5].reduce(flatMap(duplicateMockFoldable)(concat), []), [1, 1, 2, 2, 3, 3, 4, 4, 5, 5])
3444
- assert.deepEqual([1, 2, 3, 4, 5].reduce(flatMap(DuplicateArray.of)(concat), []), [1, 1, 2, 2, 3, 3, 4, 4, 5, 5])
3445
- assert.deepEqual([1, 2, 3, 4, 5].reduce(flatMap(Identity.of)(concat), []), [1, 2, 3, 4, 5])
3446
- assert.deepEqual([1, 2, 3, 4, 5].reduce(flatMap(() => null)(concat), []), [null, null, null, null, null])
3447
- assert.deepEqual([1, 2, 3, 4, 5].reduce(flatMap(() => [null, null])(concat), []), [null, null, null, null, null, null, null, null, null, null])
3448
- assert.deepEqual(await reduce(flatMap(duplicateReadableStream)(concat), [])([1, 2, 3, 4, 5]), [1, 2, 3, 4, 5].map(duplicateBuffer))
3449
- assert.deepEqual(await reduce(flatMap(async(duplicateReadableStream))(concat), [])([1, 2, 3, 4, 5]), [1, 2, 3, 4, 5].map(duplicateBuffer))
3450
- assert.deepEqual(await reduce(flatMap(duplicateArrayOfUint8Array)(concat), [])([1, 2, 3, 4, 5]), [1, 1, 2, 2, 3, 3, 4, 4, 5, 5].map(number => Buffer.from([number])))
3451
- })
3452
-
3453
2963
  it('value number', async () => {
3454
2964
  assert.deepEqual(flatMap(duplicateArray)(1), [1, 1])
2965
+ assert.deepEqual(flatMap(1, duplicateArray), [1, 1])
3455
2966
  })
3456
2967
  })
3457
2968
 
@@ -3466,7 +2977,7 @@ flatMap(
3466
2977
  })
3467
2978
  })
3468
2979
 
3469
- describe('flatMap - v1.5.12 regression', () => {
2980
+ describe('flatMap - misc', () => {
3470
2981
  it('maps then flattens an array, async + parallel', async () => {
3471
2982
  const asyncPowers = async x => [x ** 2, x ** 3]
3472
2983
  aok(flatMap(asyncPowers)([1, 2, 3, 4, 5]) instanceof Promise)
@@ -3559,7 +3070,7 @@ flatMap(
3559
3070
  const powers = x => [x ** 2, x ** 3]
3560
3071
  ade(
3561
3072
  transform(
3562
- flatMap(powers),
3073
+ Transducer.flatMap(powers),
3563
3074
  [],
3564
3075
  )([1, 2, 3]),
3565
3076
  [1, 1, 4, 8, 9, 27],
@@ -3569,13 +3080,13 @@ flatMap(
3569
3080
  const powers = async x => [x ** 2, x ** 3]
3570
3081
  aok(
3571
3082
  transform(
3572
- flatMap(powers),
3083
+ Transducer.flatMap(powers),
3573
3084
  [],
3574
3085
  )([1, 2, 3]) instanceof Promise
3575
3086
  )
3576
3087
  ade(
3577
3088
  await transform(
3578
- flatMap(powers),
3089
+ Transducer.flatMap(powers),
3579
3090
  [],
3580
3091
  )([1, 2, 3]),
3581
3092
  [1, 1, 4, 8, 9, 27],
@@ -3583,9 +3094,170 @@ flatMap(
3583
3094
  })
3584
3095
  })
3585
3096
 
3097
+ describe('forEach', () => {
3098
+ describe(`
3099
+ Reducer<T> = (any, T)=>Promise|any
3100
+
3101
+ var T any,
3102
+ callback T=>(),
3103
+ collection Iterable<T>|AsyncIterable<T>{ forEach: callback=>() }|Object<T>
3104
+
3105
+ forEach(callback)(collection) -> ()
3106
+ `,
3107
+ () => {
3108
+ it('API coverage', async () => {
3109
+ let sum1 = 0
3110
+ forEach([1, 2, 3, 4, 5], number => {
3111
+ sum1 += number
3112
+ })
3113
+ assert.equal(sum1, 15)
3114
+
3115
+ let sum2 = 0
3116
+ await forEach(Promise.resolve([1, 2, 3, 4, 5]), number => {
3117
+ sum2 += number
3118
+ })
3119
+ assert.equal(sum2, 15)
3120
+ })
3121
+ it('collection Array testing promises', async () => {
3122
+ let total = 0
3123
+ const addTotal = number => (total += number),
3124
+ variadicAsyncAddTotal = number => number % 2 == 1 ? (total += number) : Promise.resolve(total += number)
3125
+ forEach(addTotal)([1, 2, 3, 4, 5])
3126
+ assert.strictEqual(total, 15)
3127
+ total = 0
3128
+ const operation = forEach(async(addTotal))([1, 2, 3, 4, 5])
3129
+ assert(typeof operation.then == 'function')
3130
+ await operation
3131
+ assert.strictEqual(total, 15)
3132
+ })
3133
+
3134
+ let total = 0
3135
+ const addTotal = number => (total += number),
3136
+ variadicAsyncAddTotal = number => number % 2 == 1 ? (total += number) : Promise.resolve(total += number)
3137
+
3138
+ const ThunkAssertion = (
3139
+ func, value, asserter,
3140
+ ) => function thunkAssertion() {
3141
+ it(`${func.name}(${util.inspect(value)}) - ${asserter}`, async () => {
3142
+ await asserter(await func(value))
3143
+ })
3144
+ }
3145
+
3146
+ const numbersGenerator = function* () {
3147
+ yield 1; yield 2; yield 3; yield 4; yield 5
3148
+ }
3149
+ const numbersAsyncGenerator = async function* () {
3150
+ yield 1; yield 2; yield 3; yield 4; yield 5
3151
+ }
3152
+
3153
+ const thunkAssertions = [
3154
+ ThunkAssertion(forEach(addTotal), [1, 2, 3, 4, 5], result => {
3155
+ assert.deepEqual(result, [1, 2, 3, 4, 5])
3156
+ assert.strictEqual(total, 15)
3157
+ total = 0
3158
+ }),
3159
+ ThunkAssertion(forEach(async(addTotal)), [1, 2, 3, 4, 5], result => {
3160
+ assert.deepEqual(result, [1, 2, 3, 4, 5])
3161
+ assert.strictEqual(total, 15)
3162
+ total = 0
3163
+ }),
3164
+ ThunkAssertion(forEach(variadicAsyncAddTotal), [1, 2, 3, 4, 5], result => {
3165
+ assert.deepEqual(result, [1, 2, 3, 4, 5])
3166
+ assert.strictEqual(total, 15)
3167
+ total = 0
3168
+ }),
3169
+ ThunkAssertion(forEach(addTotal), numbersGenerator(), result => {
3170
+ assert.deepEqual([...result], [])
3171
+ assert.strictEqual(total, 15)
3172
+ total = 0
3173
+ }),
3174
+ ThunkAssertion(forEach(async(addTotal)), numbersGenerator(), result => {
3175
+ assert.deepEqual([...result], [])
3176
+ assert.strictEqual(total, 15)
3177
+ total = 0
3178
+ }),
3179
+ ThunkAssertion(forEach(variadicAsyncAddTotal), numbersGenerator(), result => {
3180
+ assert.deepEqual([...result], [])
3181
+ assert.strictEqual(total, 15)
3182
+ total = 0
3183
+ }),
3184
+ ThunkAssertion(forEach(addTotal), numbersAsyncGenerator(), async result => {
3185
+ assert.deepEqual(await asyncIteratorToArray(result), [])
3186
+ assert.strictEqual(total, 15)
3187
+ total = 0
3188
+ }),
3189
+ ThunkAssertion(forEach(async(addTotal)), numbersAsyncGenerator(), async result => {
3190
+ assert.deepEqual(await asyncIteratorToArray(result), [])
3191
+ assert.strictEqual(total, 15)
3192
+ total = 0
3193
+ }),
3194
+ ThunkAssertion(forEach(variadicAsyncAddTotal), numbersAsyncGenerator(), async result => {
3195
+ assert.deepEqual(await asyncIteratorToArray(result), [])
3196
+ assert.strictEqual(total, 15)
3197
+ total = 0
3198
+ }),
3199
+ ThunkAssertion(forEach(addTotal), { a: 1, b: 2, c: 3, d: 4, e: 5 }, result => {
3200
+ assert.deepEqual(result, { a: 1, b: 2, c: 3, d: 4, e: 5 })
3201
+ assert.strictEqual(total, 15)
3202
+ total = 0
3203
+ }),
3204
+ ThunkAssertion(forEach(async(addTotal)), { a: 1, b: 2, c: 3, d: 4, e: 5 }, result => {
3205
+ assert.deepEqual(result, { a: 1, b: 2, c: 3, d: 4, e: 5 })
3206
+ assert.strictEqual(total, 15)
3207
+ total = 0
3208
+ }),
3209
+ ThunkAssertion(forEach(variadicAsyncAddTotal), { a: 1, b: 2, c: 3, d: 4, e: 5 }, result => {
3210
+ assert.deepEqual(result, { a: 1, b: 2, c: 3, d: 4, e: 5 })
3211
+ assert.strictEqual(total, 15)
3212
+ total = 0
3213
+ }),
3214
+ ]
3215
+
3216
+ thunkAssertions.forEach(thunk => thunk())
3217
+
3218
+ it('forEach(noop)({ forEach: function })', async () => {
3219
+ const forEachable = {
3220
+ forEach() {
3221
+ return 1
3222
+ },
3223
+ }
3224
+ assert.strictEqual(forEach(noop)(forEachable), 1)
3225
+ })
3226
+
3227
+
3228
+ const noop = function () {}
3229
+ it('forEach(noop)(1)', async () => {
3230
+ assert.strictEqual(forEach(noop)(1), 1)
3231
+ })
3232
+ it('forEach(noop)(null)', async () => {
3233
+ assert.strictEqual(forEach(noop)(null), null)
3234
+ })
3235
+ it('forEach(noop)(undefined)', async () => {
3236
+ assert.strictEqual(forEach(noop)(undefined), undefined)
3237
+ })
3238
+ it('forEach(noop)()', async () => {
3239
+ assert.strictEqual(forEach(noop)(), undefined)
3240
+ })
3241
+
3242
+ it('execute a function for each item of a collection, returning the collection', async () => {
3243
+ let total = 0
3244
+ assert.deepEqual(
3245
+ forEach(number => total += number)([1, 2, 3]),
3246
+ [1, 2, 3],
3247
+ )
3248
+ assert.strictEqual(total, 6)
3249
+ })
3250
+ })
3251
+ })
3252
+
3586
3253
  describe('get', () => {
3587
3254
  const aaaaa = { a: { a: { a: { a: { a: 1 } } } } }
3588
3255
  const nested = [[[[[1]]]]]
3256
+ it('API coverage', async () => {
3257
+ ase(get({ a: 1 }, 'a'), 1)
3258
+ ase(await get(Promise.resolve({ a: 1 }), 'a'), 1)
3259
+ ase(get('a')({ a: 1 }), 1)
3260
+ })
3589
3261
  it('accesses a property of an object by name', async () => {
3590
3262
  ase(get('a')({ a: 1 }), 1)
3591
3263
  ase(get('b')({ a: 1 }), undefined)
@@ -3637,11 +3309,26 @@ flatMap(
3637
3309
  ade(set('a', 1)(undefined), undefined)
3638
3310
  ade(set('a', 1)('yo'), 'yo')
3639
3311
  ade(set('a', 1)({ b: 2 }), { a: 1, b: 2 })
3640
- ade(set('a.b', 1)({ a: { c: 2 }}), { a: { b: 1, c: 2 }})
3312
+ ade(await set('a', Promise.resolve(1))({ b: 2 }), { a: 1, b: 2 })
3313
+ ade(set('a.b', 1)({ a: { c: 2 } }), { a: { b: 1, c: 2 } })
3641
3314
  ade(set('a.b', 1)({ a: 1 }), { a: { b: 1 } })
3642
- ade(set(['a', 'b'], 1)({ a: { c: 2 }}), { a: { b: 1, c: 2 }})
3315
+ ade(set(['a', 'b'], 1)({ a: { c: 2 } }), { a: { b: 1, c: 2 } })
3643
3316
  ade(set('a[0].b.c', 4)({ 'a': [{ 'b': { 'c': 3 } }] }), { 'a': [{ 'b': { 'c': 4 } }] })
3644
- ade(set('a.b.c.d', 1)({}), { a: { b: { c: { d: 1 } }}})
3317
+ ade(set('a.b.c.d', 1)({}), { a: { b: { c: { d: 1 } } } })
3318
+ })
3319
+
3320
+ it('eagerly set a property of an object', async () => {
3321
+ ade(set(null, 'a', 1), null)
3322
+ ade(set(undefined, 'a', 1), undefined)
3323
+ ade(set('yo', 'a', 1), 'yo')
3324
+ ade(set({ b: 2 }, 'a', 1), { a: 1, b: 2 })
3325
+ ade(set({ a: { c: 2 } }, 'a.b', 1), { a: { b: 1, c: 2 } })
3326
+ ade(set({ a: 1 }, 'a.b', 1), { a: { b: 1 } })
3327
+ ade(set({ a: { c: 2 } }, ['a', 'b'], 1), { a: { b: 1, c: 2 } })
3328
+ ade(await set(Promise.resolve({ 'a': [{ 'b': { 'c': 3 } }] }), 'a[0].b.c', 4), { 'a': [{ 'b': { 'c': 4 } }] })
3329
+ ade(await set({ 'a': [{ 'b': { 'c': 3 } }] }, 'a[0].b.c', Promise.resolve(4)), { 'a': [{ 'b': { 'c': 4 } }] })
3330
+ ade(await set(Promise.resolve({}), 'a.b.c.d', 1), { a: { b: { c: { d: 1 } } } })
3331
+ ade(await set({}, 'a.b.c.d', Promise.resolve(1)), { a: { b: { c: { d: 1 } } } })
3645
3332
  })
3646
3333
 
3647
3334
  it('the property value may be a resolver', async () => {
@@ -3663,6 +3350,14 @@ flatMap(
3663
3350
  const abc = { a: 1, b: 2, c: 3 }
3664
3351
  const nested = { a: { b: { c: { d: 1, e: [2, 3] } } } }
3665
3352
 
3353
+ it('API coverage', async () => {
3354
+ ade(pick(abc, ['a']), { a: 1 })
3355
+ ade(pick(abc, ['a', 'd']), { a: 1 })
3356
+ ade(pick(abc, ['d']), {})
3357
+ ade(await pick(Promise.resolve(abc), ['a']), { a: 1 })
3358
+ ade(await pick(Promise.resolve(abc), ['a', 'd']), { a: 1 })
3359
+ ade(await pick(Promise.resolve(abc), ['d']), {})
3360
+ })
3666
3361
  it('picks properties off an object defined by array', async () => {
3667
3362
  ade(pick(['a'])(abc), { a: 1 })
3668
3363
  ade(pick(['a', 'd'])(abc), { a: 1 })
@@ -3678,16 +3373,21 @@ flatMap(
3678
3373
  // assert.deepEqual(pick(['a[0][0].d'])({ a: [[{ b: 1, c: 2, d: 3 }]] }), { a: [[{ b: 1, c: 2 }]] })
3679
3374
  // assert.deepEqual(pick(['a[0][0].d'])({ a: [[{ b: 1, c: 2, d: null }]] }), { a: [[{ b: 1, c: 2 }]] })
3680
3375
  })
3681
- it('eager api', async () => {
3682
- ade(pick(abc, ['a']), { a: 1 })
3683
- ade(pick(abc, ['a', 'd']), { a: 1 })
3684
- ade(pick(abc, ['d']), {})
3685
- })
3686
3376
  })
3687
3377
 
3688
3378
  describe('omit', () => {
3689
3379
  const abc = { a: 1, b: 2, c: 3 }
3690
3380
  const nested = { a: { b: { c: { d: 1, e: [2, 3] } } } }
3381
+
3382
+ it('API coverage', async () => {
3383
+ ade(omit(nested, []), nested)
3384
+ ade(await omit(Promise.resolve(nested), []), nested)
3385
+ ade(omit([1, 2, 3], []), [1, 2, 3])
3386
+ ade(await omit(Promise.resolve([1, 2, 3]), []), [1, 2, 3])
3387
+ ade(omit(abc, ['a']), { b: 2, c: 3 })
3388
+ ade(omit(abc, ['a', 'd']), { b: 2, c: 3 })
3389
+ ade(omit(abc, ['d']), { a: 1, b: 2, c: 3 })
3390
+ })
3691
3391
  it('omits properties from an object defined by array', async () => {
3692
3392
  assert(omit([])(nested) !== nested)
3693
3393
  ade(omit([])(nested), nested)
@@ -3735,23 +3435,21 @@ flatMap(
3735
3435
  .case(null, null)
3736
3436
  .case({}, {})
3737
3437
  .case([], []))
3738
-
3739
- it('eager api', async () => {
3740
- ade(omit(nested, []), nested)
3741
- ade(omit([1, 2, 3], []), [1, 2, 3])
3742
- ade(omit(abc, ['a']), { b: 2, c: 3 })
3743
- ade(omit(abc, ['a', 'd']), { b: 2, c: 3 })
3744
- ade(omit(abc, ['d']), { a: 1, b: 2, c: 3 })
3745
- })
3746
3438
  })
3747
3439
 
3748
- describe(`
3749
- any(predicate function)(value any) -> result Promise|boolean
3440
+ describe('some', () => {
3441
+ it('API coverage', async () => {
3442
+ ase(
3443
+ some([1, 2, 3, 4, 5], number => number > 3),
3444
+ true,
3445
+ )
3750
3446
 
3751
- Foldable = Iterable|AsyncIterable|{ reduce: function }
3447
+ ase(
3448
+ await some(Promise.resolve([1, 2, 3, 4, 5]), number => number > 3),
3449
+ true,
3450
+ )
3451
+ })
3752
3452
 
3753
- any(predicate any=>Promise|boolean)(value Foldable) -> Promise|boolean
3754
- `, () => {
3755
3453
  const numbersArray = [1, 2, 3, 4, 5]
3756
3454
  const evenNumbersArray = [2, 4, 6, 8, 10]
3757
3455
  const numbersGenerator = function* () {
@@ -3808,7 +3506,7 @@ any(predicate any=>Promise|boolean)(value Foldable) -> Promise|boolean
3808
3506
 
3809
3507
  cases.forEach(([func, value, result, asserter = assert.strictEqual]) => {
3810
3508
  it(`${func.name}(${JSON.stringify(value)}) -> ${result}`, async () => {
3811
- asserter(await any(func)(value), result)
3509
+ asserter(await some(func)(value), result)
3812
3510
  })
3813
3511
  })
3814
3512
 
@@ -3820,7 +3518,7 @@ any(predicate any=>Promise|boolean)(value Foldable) -> Promise|boolean
3820
3518
  }
3821
3519
  let concurrencyCount = 0,
3822
3520
  maxConcurrencyCount = 0
3823
- assert.strictEqual(await any(async number => {
3521
+ assert.strictEqual(await some(async number => {
3824
3522
  concurrencyCount += 1
3825
3523
  maxConcurrencyCount = Math.max(maxConcurrencyCount, concurrencyCount)
3826
3524
  await sleep(10)
@@ -3829,7 +3527,7 @@ any(predicate any=>Promise|boolean)(value Foldable) -> Promise|boolean
3829
3527
  })(asyncRange(40)), false)
3830
3528
  assert.strictEqual(concurrencyCount, 0)
3831
3529
  assert.strictEqual(maxConcurrencyCount, 20)
3832
- assert.strictEqual(await any(async number => {
3530
+ assert.strictEqual(await some(async number => {
3833
3531
  maxConcurrencyCount = Math.max(maxConcurrencyCount, concurrencyCount)
3834
3532
  await sleep(10)
3835
3533
  if (number == 19) {
@@ -3840,52 +3538,58 @@ any(predicate any=>Promise|boolean)(value Foldable) -> Promise|boolean
3840
3538
  })
3841
3539
 
3842
3540
  it('1', async () => {
3843
- assert.strictEqual(any(() => true)(1), true)
3541
+ assert.strictEqual(some(() => true)(1), true)
3844
3542
  })
3845
3543
  it('null', async () => {
3846
- assert.strictEqual(any(() => true)(null), true)
3544
+ assert.strictEqual(some(() => true)(null), true)
3847
3545
  })
3848
3546
  it('undefined', async () => {
3849
- assert.strictEqual(any(() => true)(undefined), true)
3850
- assert.strictEqual(any(() => true)(), true)
3547
+ assert.strictEqual(some(() => true)(undefined), true)
3548
+ assert.strictEqual(some(() => true)(), true)
3851
3549
  })
3852
3550
  })
3853
3551
 
3854
- describe('any - v1.5.15 regression', () => {
3552
+ describe('some - v1.5.15 regression', () => {
3855
3553
  const numbers = [1, 2, 3, 4, 5]
3856
3554
  const numbersObject = { a: 1, b: 2, c: 3, d: 4, e: 5 }
3857
3555
  it('[sync] tests fn against all items of iterable, true if any evaluation is truthy', async () => {
3858
- ase(any(x => x > 5)(numbers), false)
3859
- ase(any(x => x > 0)(numbers), true)
3860
- ase(any(x => x > 5)(new Set(numbers)), false)
3861
- ase(any(x => x > 0)(new Set(numbers)), true)
3862
- ase(any(x => x > 5)(numbersObject), false)
3863
- ase(any(x => x > 0)(numbersObject), true)
3556
+ ase(some(x => x > 5)(numbers), false)
3557
+ ase(some(x => x > 0)(numbers), true)
3558
+ ase(some(x => x > 5)(new Set(numbers)), false)
3559
+ ase(some(x => x > 0)(new Set(numbers)), true)
3560
+ ase(some(x => x > 5)(numbersObject), false)
3561
+ ase(some(x => x > 0)(numbersObject), true)
3864
3562
  })
3865
3563
  it('[async] tests fn against all items of iterable, true if any evaluation is truthy', async () => {
3866
- aok(any(async x => x > 5)(numbers) instanceof Promise)
3867
- ase(await any(async x => x > 5)(numbers), false)
3868
- ase(await any(async x => x > 0)(numbers), true)
3869
- ase(await any(async x => x > 5)(new Set(numbers)), false)
3870
- ase(await any(async x => x > 0)(new Set(numbers)), true)
3871
- ase(await any(async x => x > 5)(numbersObject), false)
3872
- ase(await any(async x => x > 0)(numbersObject), true)
3564
+ aok(some(async x => x > 5)(numbers) instanceof Promise)
3565
+ ase(await some(async x => x > 5)(numbers), false)
3566
+ ase(await some(async x => x > 0)(numbers), true)
3567
+ ase(await some(async x => x > 5)(new Set(numbers)), false)
3568
+ ase(await some(async x => x > 0)(new Set(numbers)), true)
3569
+ ase(await some(async x => x > 5)(numbersObject), false)
3570
+ ase(await some(async x => x > 0)(numbersObject), true)
3873
3571
  })
3874
3572
  it('tests a variadic async function', async () => {
3875
3573
  ase(
3876
- await any(x => x < 2 ? Promise.resolve(false) : true)([1, 2, 3, 4, 5]),
3574
+ await some(x => x < 2 ? Promise.resolve(false) : true)([1, 2, 3, 4, 5]),
3877
3575
  true,
3878
3576
  )
3879
3577
  })
3880
3578
  })
3881
3579
 
3882
- describe(`
3883
- all(predicate function)(value all) -> result Promise|boolean
3580
+ describe('every', () => {
3581
+ it('API coverage', async () => {
3582
+ ase(
3583
+ every([1, 2, 3, 4, 5], number => number > 0),
3584
+ true,
3585
+ )
3884
3586
 
3885
- Foldable = Iterable|AsyncIterable|{ reduce: function }
3587
+ ase(
3588
+ await every(Promise.resolve([1, 2, 3, 4, 5]), number => number > 0),
3589
+ true,
3590
+ )
3591
+ })
3886
3592
 
3887
- all(predicate all=>Promise|boolean)(value Foldable) -> Promise|boolean
3888
- `, () => {
3889
3593
  const numbersArray = [1, 2, 3, 4, 5]
3890
3594
  const evenNumbersArray = [2, 4, 6, 8, 10]
3891
3595
  const numbersGenerator = function* () {
@@ -3936,7 +3640,7 @@ all(predicate all=>Promise|boolean)(value Foldable) -> Promise|boolean
3936
3640
 
3937
3641
  cases.forEach(([func, value, result, asserter = assert.strictEqual]) => {
3938
3642
  it(`${func.name}(${JSON.stringify(value)}) -> ${result}`, async () => {
3939
- asserter(await all(func)(value), result)
3643
+ asserter(await every(func)(value), result)
3940
3644
  })
3941
3645
  })
3942
3646
 
@@ -3948,7 +3652,7 @@ all(predicate all=>Promise|boolean)(value Foldable) -> Promise|boolean
3948
3652
  }
3949
3653
  let concurrencyCount = 0,
3950
3654
  maxConcurrencyCount = 0
3951
- assert.strictEqual(await all(async number => {
3655
+ assert.strictEqual(await every(async number => {
3952
3656
  concurrencyCount += 1
3953
3657
  maxConcurrencyCount = Math.max(maxConcurrencyCount, concurrencyCount)
3954
3658
  await sleep(10)
@@ -3957,7 +3661,7 @@ all(predicate all=>Promise|boolean)(value Foldable) -> Promise|boolean
3957
3661
  })(asyncRange(40)), true)
3958
3662
  assert.strictEqual(concurrencyCount, 0)
3959
3663
  assert.strictEqual(maxConcurrencyCount, 20)
3960
- assert.strictEqual(await all(async number => {
3664
+ assert.strictEqual(await every(async number => {
3961
3665
  maxConcurrencyCount = Math.max(maxConcurrencyCount, concurrencyCount)
3962
3666
  await sleep(10)
3963
3667
  if (number == 19) {
@@ -3968,46 +3672,61 @@ all(predicate all=>Promise|boolean)(value Foldable) -> Promise|boolean
3968
3672
  })
3969
3673
 
3970
3674
  it('1', async () => {
3971
- assert.strictEqual(all(() => true)(1), true)
3675
+ assert.strictEqual(every(() => true)(1), true)
3972
3676
  })
3973
3677
  it('null', async () => {
3974
- assert.strictEqual(all(() => true)(null), true)
3678
+ assert.strictEqual(every(() => true)(null), true)
3975
3679
  })
3976
3680
  it('undefined', async () => {
3977
- assert.strictEqual(all(() => true)(undefined), true)
3978
- assert.strictEqual(all(() => true)(), true)
3681
+ assert.strictEqual(every(() => true)(undefined), true)
3682
+ assert.strictEqual(every(() => true)(), true)
3979
3683
  })
3980
3684
  })
3981
3685
 
3982
- describe('all - v1.5.15 regression', () => {
3686
+ describe('every - v1.5.15 regression', () => {
3983
3687
  const numbers = [1, 2, 3, 4, 5]
3984
3688
  const numbersObject = { a: 1, b: 2, c: 3, d: 4, e: 5 }
3985
3689
  it('syncly evaluates fn against all items in iterable, true if all evaluations are truthy', async () => {
3986
- ase(all(x => x > 5)(numbers), false)
3987
- ase(all(x => x > 0)(numbers), true)
3988
- ase(all(x => x > 5)(new Set(numbers)), false)
3989
- ase(all(x => x > 0)(new Set(numbers)), true)
3990
- ase(all(x => x > 5)(numbersObject), false)
3991
- ase(all(x => x > 0)(numbersObject), true)
3690
+ ase(every(x => x > 5)(numbers), false)
3691
+ ase(every(x => x > 0)(numbers), true)
3692
+ ase(every(x => x > 5)(new Set(numbers)), false)
3693
+ ase(every(x => x > 0)(new Set(numbers)), true)
3694
+ ase(every(x => x > 5)(numbersObject), false)
3695
+ ase(every(x => x > 0)(numbersObject), true)
3992
3696
  })
3993
3697
  it('asyncly evaluates fn against all items in iterable, true if all evaluations are truthy', async () => {
3994
- aok(all(async x => x > 5)(numbers) instanceof Promise)
3995
- ase(await all(async x => x > 5)(numbers), false)
3996
- ase(await all(async x => x > 0)(numbers), true)
3997
- ase(await all(async x => x > 5)(new Set(numbers)), false)
3998
- ase(await all(async x => x > 0)(new Set(numbers)), true)
3999
- ase(await all(async x => x > 5)(numbersObject), false)
4000
- ase(await all(async x => x > 0)(numbersObject), true)
3698
+ aok(every(async x => x > 5)(numbers) instanceof Promise)
3699
+ ase(await every(async x => x > 5)(numbers), false)
3700
+ ase(await every(async x => x > 0)(numbers), true)
3701
+ ase(await every(async x => x > 5)(new Set(numbers)), false)
3702
+ ase(await every(async x => x > 0)(new Set(numbers)), true)
3703
+ ase(await every(async x => x > 5)(numbersObject), false)
3704
+ ase(await every(async x => x > 0)(numbersObject), true)
4001
3705
  })
4002
3706
  it('tests a variadic async function', async () => {
4003
3707
  ase(
4004
- await all(x => x < 2 ? Promise.resolve(true) : false)([1, 2, 3, 4, 5]),
3708
+ await every(x => x < 2 ? Promise.resolve(true) : false)([1, 2, 3, 4, 5]),
4005
3709
  false,
4006
3710
  )
4007
3711
  })
4008
3712
  })
4009
3713
 
4010
3714
  describe('not', () => {
3715
+ it('API coverage', async () => {
3716
+ ase(
3717
+ not(1, 2, 3, (...numbers) => (
3718
+ numbers.every(num => typeof num == 'number')
3719
+ )),
3720
+ false,
3721
+ )
3722
+
3723
+ ase(
3724
+ await not(Promise.resolve(1), 2, Promise.resolve(3), (...numbers) => (
3725
+ numbers.every(num => typeof num == 'number')
3726
+ )),
3727
+ false,
3728
+ )
3729
+ })
4011
3730
  it('not(someValue) -> !someValue', async () => {
4012
3731
  assert.strictEqual(not(false), true)
4013
3732
  assert.strictEqual(not(null), true)
@@ -4025,19 +3744,25 @@ all(predicate all=>Promise|boolean)(value Foldable) -> Promise|boolean
4025
3744
  })
4026
3745
  })
4027
3746
 
4028
- describe('not.sync', () => {
4029
- it('not.sync(isOdd)', async () => {
4030
- const isOdd = number => number % 2 == 1
4031
- assert.strictEqual(not.sync(isOdd)(1), false)
4032
- assert.strictEqual(not.sync(isOdd)(0), true)
3747
+ describe('and', () => {
3748
+ it('API coverage', async () => {
3749
+ aok(
3750
+ and(1, 2, 3, [
3751
+ (...numbers) => numbers.every(num => typeof num == 'number'),
3752
+ (...numbers) => numbers.every(num => num < 5),
3753
+ (...numbers) => numbers.every(num => num > 0),
3754
+ ])
3755
+ )
3756
+
3757
+ aok(
3758
+ await and(Promise.resolve(1), 2, Promise.resolve(3), [
3759
+ (...numbers) => numbers.every(num => typeof num == 'number'),
3760
+ (...numbers) => numbers.every(num => num < 5),
3761
+ (...numbers) => numbers.every(num => num > 0),
3762
+ ])
3763
+ )
4033
3764
  })
4034
- })
4035
3765
 
4036
- describe(`
4037
- and(
4038
- predicates Array<predicate function|nonfunction>
4039
- )(point any) -> Promise|boolean
4040
- `, () => {
4041
3766
  it('all nonfunctions', async () => {
4042
3767
  assert.strictEqual(and([true, true, true]), true)
4043
3768
  assert.strictEqual(and([true, true, false]), false)
@@ -4073,14 +3798,13 @@ and(
4073
3798
  assert.strictEqual(and([isOdd, isOdd, isOdd])(undefined), false)
4074
3799
  assert.strictEqual(and([isOdd, isOdd, isOdd])(), false)
4075
3800
  })
4076
- })
4077
3801
 
4078
- describe('and - v1.5.15 regression', () => {
4079
3802
  const isGreaterThan1 = x => x > 1
4080
3803
  it('sync tests input against provided array of functions, true if all evaluations are truthy', async () => {
4081
3804
  ase(and([isOdd, isGreaterThan1])(3), true)
4082
3805
  ase(and([isOdd, isGreaterThan1])(1), false)
4083
3806
  })
3807
+
4084
3808
  it('async tests input against provided array of functions, true if all evaluations are truthy', async () => {
4085
3809
  aok(and([asyncIsEven, isGreaterThan1])(2) instanceof Promise)
4086
3810
  ase(await and([asyncIsEven, isGreaterThan1])(2), true)
@@ -4088,11 +3812,25 @@ and(
4088
3812
  })
4089
3813
  })
4090
3814
 
4091
- describe(`
4092
- or(
4093
- predicates Array<predicate function|nonfunction>,
4094
- )(point any) -> Promise|boolean
4095
- `, () => {
3815
+ describe('or', () => {
3816
+ it('API coverage', async () => {
3817
+ aok(
3818
+ or(1, 2, 3, [
3819
+ (...numbers) => numbers.every(num => typeof num == 'number'),
3820
+ false,
3821
+ false,
3822
+ ])
3823
+ )
3824
+
3825
+ aok(
3826
+ await or(Promise.resolve(1), 2, Promise.resolve(3), [
3827
+ (...numbers) => numbers.every(num => typeof num == 'number'),
3828
+ false,
3829
+ false,
3830
+ ])
3831
+ )
3832
+ })
3833
+
4096
3834
  it('all nonfunctions', async () => {
4097
3835
  assert.strictEqual(or([true, true, true]), true)
4098
3836
  assert.strictEqual(or([false, false, false]), false)
@@ -4135,73 +3873,47 @@ or(
4135
3873
  })
4136
3874
  })
4137
3875
 
4138
- describe(`
4139
- eq(
4140
- left (any=>Promise|boolean)|any,
4141
- right (any=>Promise|boolean)|any,
4142
- ) -> strictEqualsBy (value any)=>Promise|boolean
4143
- `, () => {
4144
-
4145
- const cases = [
4146
- [() => eq(NaN, NaN), undefined, true], // SameValueZero
4147
- [() => eq(+0, -0), undefined, true], // SameValueZero
4148
- [() => eq(0, 0), undefined, true],
4149
- [eq(0, () => 0), undefined, true],
4150
- [eq(0, async () => 0), undefined, true],
4151
- [eq(() => 0, 0), undefined, true],
4152
- [eq(async () => 0, 0), undefined, true],
4153
- [eq(() => 0, () => 0), undefined, true],
4154
- [eq(async () => 0, () => 0), undefined, true],
4155
- [eq(() => 0, async () => 0), undefined, true],
4156
- [eq(async () => 0, async () => 0), undefined, true],
4157
- [() => eq(1, 0), undefined, false],
4158
- [eq(1, () => 0), undefined, false],
4159
- [eq(1, async () => 0), undefined, false],
4160
- [eq(() => 1, 0), undefined, false],
4161
- [eq(async () => 1, 0), undefined, false],
4162
- [eq(() => 1, () => 0), undefined, false],
4163
- [eq(async () => 1, () => 0), undefined, false],
4164
- [eq(async () => 1, async () => 0), undefined, false],
4165
- [eq(async () => 1, async () => 0), undefined, false],
4166
- [() => eq(0, '0'), undefined, false],
4167
- [eq(0, () => '0'), undefined, false],
4168
- [eq(0, async () => '0'), undefined, false],
4169
- [eq(() => 0, '0'), undefined, false],
4170
- [eq(async () => 0, '0'), undefined, false],
4171
- [eq(() => 0, () => '0'), undefined, false],
4172
- [eq(async () => 0, () => '0'), undefined, false],
4173
- [eq(() => 0, async () => '0'), undefined, false],
4174
- [eq(async () => 0, async () => '0'), undefined, false],
4175
- ]
4176
-
4177
- cases.forEach(([func, value, result, asserter = assert.strictEqual]) => {
4178
- it(`${func.name}(${JSON.stringify(value)}) -> ${result}`, async () => {
4179
- asserter(await func(value), result)
4180
- })
3876
+ describe('eq', () => {
3877
+ it('API coverage', async () => {
3878
+ aok(eq(2, 2))
3879
+ aok(await eq(Promise.resolve(2), 2))
3880
+ aok(await eq(2, Promise.resolve(2)))
3881
+ aok(await eq(Promise.resolve(2), Promise.resolve(2)))
3882
+ aok(
3883
+ eq(2, number => number * 2, number => number + 2)
3884
+ )
3885
+ aok(
3886
+ eq(number => number * 2, number => number + 2)(2)
3887
+ )
3888
+ aok(
3889
+ await eq(Promise.resolve(2), number => number * 2, number => number + 2)
3890
+ )
3891
+ aok(eq(2, number => number * 2, 4))
3892
+ aok(await eq(Promise.resolve(2), number => number * 2, 4))
3893
+ aok(eq(2, 4, number => number ** 2))
3894
+ aok(await eq(Promise.resolve(2), 4, number => number ** 2))
4181
3895
  })
4182
- })
4183
3896
 
4184
- describe('eq - v1.5.15 regression', () => {
4185
3897
  it('[sync] eq(f, g)(x) == (f(x) == g(x))', async () => {
4186
3898
  ase(eq(x => `${x}`, x => x)('hey'), true)
4187
- ase(eq(x => `${x}`, x => x)(1), false)
3899
+ ase(eq(x => `${x}`, x => x)(1), true)
4188
3900
  })
4189
3901
  it('[async] eq(f, g)(x) == (f(x) == g(x))', async () => {
4190
3902
  aok(eq(x => `${x}`, async x => x)('hey') instanceof Promise)
4191
3903
  ase(await eq(async x => `${x}`, async x => x)('hey'), true)
4192
- ase(await eq(async x => `${x}`, async x => x)(1), false)
3904
+ ase(await eq(async x => `${x}`, async x => x)(1), true)
4193
3905
  })
4194
3906
  it('[sync] eq(f, value)(x) == (valueA == valueB)', async () => {
4195
- ase(eq(() => 'hey', 'hey')('ayylmao'), true)
4196
- ase(eq(() => 'hey', 'ho')('ayylmao'), false)
3907
+ ase(eq(() => 'hey', 'hey')('abc'), true)
3908
+ ase(eq(() => 'hey', 'ho')('abc'), false)
4197
3909
  })
4198
3910
  it('[async] eq(f, value)(x) == (valueA == valueB)', async () => {
4199
- ase(await eq(async () => 'hey', 'hey')('ayylmao'), true)
4200
- ase(await eq('hey', async () => 'ho')('ayylmao'), false)
3911
+ ase(await eq(async () => 'hey', 'hey')('abc'), true)
3912
+ ase(await eq('hey', async () => 'ho')('abc'), false)
4201
3913
  })
4202
3914
  it('[sync] eq(value, g)(x) == (valueA == valueB)', async () => {
4203
- ase(eq('hey', () => 'hey')('ayylmao'), true)
4204
- ase(eq('hey', () => 'ho')('ayylmao'), false)
3915
+ ase(eq('hey', () => 'hey')('abc'), true)
3916
+ ase(eq('hey', () => 'ho')('abc'), false)
4205
3917
  })
4206
3918
  it('[async] eq(value, g)(x) == (value == g(x))', async () => {
4207
3919
  aok(eq('hey', async x => x)('hey') instanceof Promise)
@@ -4216,12 +3928,21 @@ eq(
4216
3928
  it('false for eq(string,)', () => {
4217
3929
  assert.strictEqual(eq('hey',), false)
4218
3930
  })
4219
- it('false for too many arguments', async () => {
4220
- assert.strictEqual(eq('hey', () => {}, 'ho')(), false)
4221
- })
4222
3931
  })
4223
3932
 
4224
3933
  describe('gt', () => {
3934
+ it('API coverage', async () => {
3935
+ aok(
3936
+ gt(1, number => number, number => number * 0)
3937
+ )
3938
+ aok(
3939
+ await gt(Promise.resolve(1), number => number, number => number * 0)
3940
+ )
3941
+ aok(gt(1, number => number, 0))
3942
+ aok(await gt(Promise.resolve(1), number => number, 0))
3943
+ aok(gt(1, 3, number => number * 0))
3944
+ aok(await gt(Promise.resolve(1), 3, number => number * 0))
3945
+ })
4225
3946
  it('[sync] gt(f, g)(x) === (f(x) > g(x))', async () => {
4226
3947
  ase(gt(x => x + 1, x => x)(1), true)
4227
3948
  ase(gt(x => x, x => x)(1), false)
@@ -4234,14 +3955,14 @@ eq(
4234
3955
  ase(await gt(async x => x, async x => x + 1)(1), false)
4235
3956
  })
4236
3957
  it('[sync] gt(f, value)(x) === (valueA > valueB)', async () => {
4237
- ase(gt(() => 1, 0)('ayylmao'), true)
4238
- ase(gt(() => 1, 1)('ayylmao'), false)
4239
- ase(gt(() => 0, 1)('ayylmao'), false)
3958
+ ase(gt(() => 1, 0)('abc'), true)
3959
+ ase(gt(() => 1, 1)('abc'), false)
3960
+ ase(gt(() => 0, 1)('abc'), false)
4240
3961
  })
4241
3962
  it('[sync] gt(value, g)(x) === (valueA > valueB)', async () => {
4242
- ase(gt(1, () => 0)('ayylmao'), true)
4243
- ase(gt(1, () => 1)('ayylmao'), false)
4244
- ase(gt(0, () => 1)('ayylmao'), false)
3963
+ ase(gt(1, () => 0)('abc'), true)
3964
+ ase(gt(1, () => 1)('abc'), false)
3965
+ ase(gt(0, () => 1)('abc'), false)
4245
3966
  })
4246
3967
  it('[async] gt(value, g)(x) === (value > g(x))', async () => {
4247
3968
  aok(gt(1, async x => x)(2) instanceof Promise)
@@ -4260,12 +3981,21 @@ eq(
4260
3981
  it('throws RangeError on not enough arguments', async () => {
4261
3982
  assert.strictEqual(gt('hey'), false)
4262
3983
  })
4263
- it('throws RangeError on too many arguments', async () => {
4264
- assert.strictEqual(gt('hey', () => {}, 'ho')(), false)
4265
- })
4266
3984
  })
4267
3985
 
4268
3986
  describe('lt', () => {
3987
+ it('API coverage', async () => {
3988
+ aok(
3989
+ lt(5, number => number - 3, number => number + 3)
3990
+ )
3991
+ aok(
3992
+ await lt(Promise.resolve(5), number => number - 3, number => number + 3)
3993
+ )
3994
+ aok(lt(5, 2, number => number + 3))
3995
+ aok(await lt(Promise.resolve(5), 2, number => number + 3))
3996
+ aok(lt(5, number => number - 3, 5))
3997
+ aok(await lt(Promise.resolve(5), number => number - 3, 5))
3998
+ })
4269
3999
  it('[sync] lt(f, g)(x) === (f(x) < g(x))', async () => {
4270
4000
  ase(lt(x => x + 1, x => x)(1), false)
4271
4001
  ase(lt(x => x, x => x)(1), false)
@@ -4278,14 +4008,14 @@ eq(
4278
4008
  ase(await lt(async x => x, async x => x + 1)(1), true)
4279
4009
  })
4280
4010
  it('[sync] lt(f, value)(x) === (valueA < valueB)', async () => {
4281
- ase(lt(() => 1, 0)('ayylmao'), false)
4282
- ase(lt(() => 1, 1)('ayylmao'), false)
4283
- ase(lt(() => 0, 1)('ayylmao'), true)
4011
+ ase(lt(() => 1, 0)('abc'), false)
4012
+ ase(lt(() => 1, 1)('abc'), false)
4013
+ ase(lt(() => 0, 1)('abc'), true)
4284
4014
  })
4285
4015
  it('[sync] lt(value, g)(x) === (valueA < valueB)', async () => {
4286
- ase(lt(1, () => 0)('ayylmao'), false)
4287
- ase(lt(1, () => 1)('ayylmao'), false)
4288
- ase(lt(0, () => 1)('ayylmao'), true)
4016
+ ase(lt(1, () => 0)('abc'), false)
4017
+ ase(lt(1, () => 1)('abc'), false)
4018
+ ase(lt(0, () => 1)('abc'), true)
4289
4019
  })
4290
4020
  it('[async] lt(value, g)(x) === (value < g(x))', async () => {
4291
4021
  aok(lt(1, async x => x)(2) instanceof Promise)
@@ -4304,12 +4034,21 @@ eq(
4304
4034
  it('throws RangeError on not enough arguments', () => {
4305
4035
  assert.strictEqual(lt('hey'), false)
4306
4036
  })
4307
- it('throws RangeError on too many arguments', async () => {
4308
- assert.strictEqual(lt('hey', () => {}, 'ho')(), false)
4309
- })
4310
4037
  })
4311
4038
 
4312
4039
  describe('gte', () => {
4040
+ it('API coverage', async () => {
4041
+ aok(
4042
+ gte(5, number => number + 3, number => number + 3)
4043
+ )
4044
+ aok(
4045
+ await gte(Promise.resolve(5), number => number + 3, number => number + 3)
4046
+ )
4047
+ aok(gte(5, 10, number => number + 3))
4048
+ aok(await gte(Promise.resolve(5), 10, number => number + 3))
4049
+ aok(gte(5, number => number + 3, 5))
4050
+ aok(await gte(Promise.resolve(5), number => number + 3, 5))
4051
+ })
4313
4052
  it('[sync] gte(f, g)(x) === (f(x) >= g(x))', async () => {
4314
4053
  ase(gte(x => x + 1, x => x)(1), true)
4315
4054
  ase(gte(x => x, x => x)(1), true)
@@ -4322,14 +4061,14 @@ eq(
4322
4061
  ase(await gte(async x => x, async x => x + 1)(1), false)
4323
4062
  })
4324
4063
  it('[sync] gte(f, value)(x) === (valueA >= valueB)', async () => {
4325
- ase(gte(() => 1, 0)('ayylmao'), true)
4326
- ase(gte(() => 1, 1)('ayylmao'), true)
4327
- ase(gte(() => 0, 1)('ayylmao'), false)
4064
+ ase(gte(() => 1, 0)('abc'), true)
4065
+ ase(gte(() => 1, 1)('abc'), true)
4066
+ ase(gte(() => 0, 1)('abc'), false)
4328
4067
  })
4329
4068
  it('[sync] gte(value, g)(x) === (valueA >= valueB)', async () => {
4330
- ase(gte(1, () => 0)('ayylmao'), true)
4331
- ase(gte(1, () => 1)('ayylmao'), true)
4332
- ase(gte(0, () => 1)('ayylmao'), false)
4069
+ ase(gte(1, () => 0)('abc'), true)
4070
+ ase(gte(1, () => 1)('abc'), true)
4071
+ ase(gte(0, () => 1)('abc'), false)
4333
4072
  })
4334
4073
  it('[async] gte(value, g)(x) === (value >= g(x))', async () => {
4335
4074
  aok(gte(1, async x => x)(2) instanceof Promise)
@@ -4348,12 +4087,21 @@ eq(
4348
4087
  it('throws RangeError on not enough arguments', () => {
4349
4088
  assert.strictEqual(gte('hey'), false)
4350
4089
  })
4351
- it('throws RangeError on too many arguments', async () => {
4352
- assert.strictEqual(gte('hey', () => {}, 'ho')(), false)
4353
- })
4354
4090
  })
4355
4091
 
4356
4092
  describe('lte', () => {
4093
+ it('API coverage', async () => {
4094
+ aok(
4095
+ lte(5, number => number + 3, number => number + 3)
4096
+ )
4097
+ aok(
4098
+ await lte(Promise.resolve(5), number => number + 3, number => number + 3)
4099
+ )
4100
+ aok(lte(5, 0, number => number + 3))
4101
+ aok(await lte(Promise.resolve(5), 0, number => number + 3))
4102
+ aok(lte(5, number => number + 3, 10))
4103
+ aok(await lte(Promise.resolve(5), number => number + 3, 10))
4104
+ })
4357
4105
  it('[sync] lte(f, g)(x) === (f(x) <= g(x))', async () => {
4358
4106
  ase(lte(x => x + 1, x => x)(1), false)
4359
4107
  ase(lte(x => x, x => x)(1), true)
@@ -4366,14 +4114,14 @@ eq(
4366
4114
  ase(await lte(async x => x, async x => x + 1)(1), true)
4367
4115
  })
4368
4116
  it('[sync] lte(f, value)(x) === (valueA <= valueB)', async () => {
4369
- ase(lte(() => 1, 0)('ayylmao'), false)
4370
- ase(lte(() => 1, 1)('ayylmao'), true)
4371
- ase(lte(() => 0, 1)('ayylmao'), true)
4117
+ ase(lte(() => 1, 0)('abc'), false)
4118
+ ase(lte(() => 1, 1)('abc'), true)
4119
+ ase(lte(() => 0, 1)('abc'), true)
4372
4120
  })
4373
4121
  it('[sync] lte(value, g)(x) === (valueA <= valueB)', async () => {
4374
- ase(lte(1, () => 0)('ayylmao'), false)
4375
- ase(lte(1, () => 1)('ayylmao'), true)
4376
- ase(lte(0, () => 1)('ayylmao'), true)
4122
+ ase(lte(1, () => 0)('abc'), false)
4123
+ ase(lte(1, () => 1)('abc'), true)
4124
+ ase(lte(0, () => 1)('abc'), true)
4377
4125
  })
4378
4126
  it('[async] lte(value, g)(x) === (value <= g(x))', async () => {
4379
4127
  aok(lte(1, async x => x)(2) instanceof Promise)
@@ -4392,9 +4140,6 @@ eq(
4392
4140
  it('throws RangeError on not enough arguments', () => {
4393
4141
  assert.strictEqual(lte('hey'), false)
4394
4142
  })
4395
- it('throws RangeError on too many arguments', async () => {
4396
- assert.strictEqual(lte('hey', () => {}, 'ho')(), false)
4397
- })
4398
4143
  })
4399
4144
 
4400
4145
  describe('thunkify', () => {
@@ -4404,6 +4149,12 @@ eq(
4404
4149
  assert.strictEqual(thunkAdd212.length, 0)
4405
4150
  assert.strictEqual(thunkAdd212(), 3)
4406
4151
  })
4152
+
4153
+ const asyncThunkAdd212 = thunkify(add2, Promise.resolve(1), 2)
4154
+ it('creates a thunk that resolves any promise arguments', async () => {
4155
+ assert.strictEqual(asyncThunkAdd212.length, 0)
4156
+ assert.strictEqual(await asyncThunkAdd212(), 3)
4157
+ })
4407
4158
  })
4408
4159
 
4409
4160
  describe('always', () => {
@@ -4485,7 +4236,7 @@ eq(
4485
4236
  })
4486
4237
  })
4487
4238
 
4488
- it('exports 29 functions', async () => {
4489
- ase(Object.keys(rubico).length, 29)
4239
+ it('exports 31 functions', async () => {
4240
+ ase(Object.keys(rubico).length, 31)
4490
4241
  })
4491
4242
  })