rubico 1.9.6 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (589) hide show
  1. package/.eslintignore +5 -0
  2. package/.eslintrc.js +3 -2
  3. package/.github/workflows/nodejs.yml +1 -1
  4. package/AggregateReducer.js +19 -0
  5. package/AggregateReducer.test.js +82 -0
  6. package/CHANGELOG.md +22 -1
  7. package/Transducer.js +162 -0
  8. package/Transducer.test.js +117 -0
  9. package/_internal/ComparisonOperator.js +68 -0
  10. package/_internal/File.js +41 -0
  11. package/_internal/FlatMappingAsyncIterator.js +4 -4
  12. package/_internal/FlatMappingIterator.js +1 -1
  13. package/_internal/TimeInLoopSuite.js +138 -0
  14. package/_internal/areAnyValuesPromises.js +23 -0
  15. package/_internal/{arrayAll.js → arrayEvery.js} +4 -4
  16. package/_internal/arrayExtend.js +3 -2
  17. package/_internal/arrayFilter.js +3 -4
  18. package/_internal/{arrayAny.js → arraySome.js} +8 -8
  19. package/_internal/{asyncIteratorAll.js → asyncIteratorEvery.js} +4 -4
  20. package/_internal/{asyncIteratorAny.js → asyncIteratorSome.js} +4 -4
  21. package/_internal/curry4.test.js +25 -0
  22. package/_internal/curry5.test.js +29 -0
  23. package/_internal/curryArgs2.js +43 -0
  24. package/_internal/curryArgs3.test.js +21 -0
  25. package/_internal/curryArgs4.js +65 -0
  26. package/_internal/curryArgs4.test.js +25 -0
  27. package/_internal/equals.js +13 -0
  28. package/_internal/findAllFilePaths.js +22 -0
  29. package/_internal/funcApply.js +2 -0
  30. package/_internal/funcCall.js +14 -0
  31. package/_internal/functionArrayAll.js +26 -0
  32. package/_internal/functionArrayAllSeries.js +55 -0
  33. package/_internal/functionObjectAll.js +32 -0
  34. package/_internal/genericReduce.js +4 -22
  35. package/_internal/genericTransform.js +15 -15
  36. package/_internal/improvedGenericTransform.js +93 -0
  37. package/_internal/{iteratorAll.js → iteratorEvery.js} +4 -4
  38. package/_internal/{iteratorAny.js → iteratorSome.js} +6 -6
  39. package/_internal/leftResolverRightResolverCompare.js +19 -0
  40. package/_internal/leftResolverRightValueCompare.js +16 -0
  41. package/_internal/leftValueRightResolverCompare.js +16 -0
  42. package/_internal/objectReduce.js +0 -1
  43. package/_internal/pathResolve.js +6 -0
  44. package/_internal/{reducerAll.js → reducerEvery.js} +4 -4
  45. package/_internal/reducerFlatMap.js +4 -4
  46. package/_internal/reducerFlatten.js +1 -1
  47. package/_internal/{reducerAny.js → reducerSome.js} +4 -4
  48. package/_internal/timeInLoop.js +37 -0
  49. package/_internal/timeInLoop.test.js +18 -0
  50. package/_internal/timeInLoopAsync.js +35 -0
  51. package/_internal/timeInLoopAsync.test.js +22 -0
  52. package/all.js +105 -45
  53. package/always.js +3 -9
  54. package/and.js +69 -45
  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 +45 -22
  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/{distributor.js → build} +50 -50
  136. package/compose.js +46 -0
  137. package/curry.js +20 -12
  138. package/dist/__.es.js +2 -2
  139. package/dist/__.es.min.js +2 -2
  140. package/dist/__.js +2 -2
  141. package/dist/__.min.js +2 -2
  142. package/dist/__.min.mjs +2 -2
  143. package/dist/__.mjs +2 -2
  144. package/dist/all.es.js +173 -92
  145. package/dist/all.es.min.js +3 -3
  146. package/dist/all.js +173 -92
  147. package/dist/all.min.js +3 -3
  148. package/dist/all.min.mjs +3 -3
  149. package/dist/all.mjs +173 -92
  150. package/dist/always.es.js +2 -2
  151. package/dist/always.es.min.js +2 -2
  152. package/dist/always.js +2 -2
  153. package/dist/always.min.js +2 -2
  154. package/dist/always.min.mjs +2 -2
  155. package/dist/always.mjs +2 -2
  156. package/dist/and.es.js +101 -32
  157. package/dist/and.es.min.js +3 -3
  158. package/dist/and.js +101 -32
  159. package/dist/and.min.js +3 -3
  160. package/dist/and.min.mjs +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.min.mjs +3 -3
  167. package/dist/assign.mjs +37 -10
  168. package/dist/compose.es.js +71 -0
  169. package/dist/compose.es.min.js +7 -0
  170. package/dist/compose.js +78 -0
  171. package/dist/compose.min.js +8 -0
  172. package/dist/compose.min.mjs +7 -0
  173. package/dist/compose.mjs +71 -0
  174. package/dist/curry.es.js +2 -2
  175. package/dist/curry.es.min.js +2 -2
  176. package/dist/curry.js +2 -2
  177. package/dist/curry.min.js +2 -2
  178. package/dist/curry.min.mjs +2 -2
  179. package/dist/curry.mjs +2 -2
  180. package/dist/eq.es.js +172 -49
  181. package/dist/eq.es.min.js +3 -3
  182. package/dist/eq.js +172 -49
  183. package/dist/eq.min.js +3 -3
  184. package/dist/eq.min.mjs +3 -3
  185. package/dist/eq.mjs +172 -49
  186. package/dist/every.es.js +194 -0
  187. package/dist/every.es.min.js +7 -0
  188. package/dist/every.js +201 -0
  189. package/dist/every.min.js +8 -0
  190. package/dist/every.min.mjs +7 -0
  191. package/dist/every.mjs +194 -0
  192. package/dist/filter.es.js +14 -108
  193. package/dist/filter.es.min.js +3 -3
  194. package/dist/filter.js +14 -108
  195. package/dist/filter.min.js +3 -3
  196. package/dist/filter.min.mjs +3 -3
  197. package/dist/filter.mjs +14 -108
  198. package/dist/flatMap.es.js +27 -214
  199. package/dist/flatMap.es.min.js +3 -3
  200. package/dist/flatMap.js +27 -214
  201. package/dist/flatMap.min.js +3 -3
  202. package/dist/flatMap.min.mjs +3 -3
  203. package/dist/flatMap.mjs +27 -214
  204. package/dist/{x/forEach.es.js → forEach.es.js} +52 -70
  205. package/dist/forEach.es.min.js +7 -0
  206. package/dist/{x/forEach.js → forEach.js} +52 -70
  207. package/dist/forEach.min.js +8 -0
  208. package/dist/forEach.min.mjs +7 -0
  209. package/dist/{x/forEach.mjs → forEach.mjs} +52 -70
  210. package/dist/get.es.js +60 -5
  211. package/dist/get.es.min.js +3 -3
  212. package/dist/get.js +60 -5
  213. package/dist/get.min.js +3 -3
  214. package/dist/get.min.mjs +3 -3
  215. package/dist/get.mjs +60 -5
  216. package/dist/gt.es.js +171 -48
  217. package/dist/gt.es.min.js +3 -3
  218. package/dist/gt.js +171 -48
  219. package/dist/gt.min.js +3 -3
  220. package/dist/gt.min.mjs +3 -3
  221. package/dist/gt.mjs +171 -48
  222. package/dist/gte.es.js +171 -48
  223. package/dist/gte.es.min.js +3 -3
  224. package/dist/gte.js +171 -48
  225. package/dist/gte.min.js +3 -3
  226. package/dist/gte.min.mjs +3 -3
  227. package/dist/gte.mjs +171 -48
  228. package/dist/lt.es.js +171 -48
  229. package/dist/lt.es.min.js +3 -3
  230. package/dist/lt.js +171 -48
  231. package/dist/lt.min.js +3 -3
  232. package/dist/lt.min.mjs +3 -3
  233. package/dist/lt.mjs +171 -48
  234. package/dist/lte.es.js +171 -48
  235. package/dist/lte.es.min.js +3 -3
  236. package/dist/lte.js +171 -48
  237. package/dist/lte.min.js +3 -3
  238. package/dist/lte.min.mjs +3 -3
  239. package/dist/lte.mjs +171 -48
  240. package/dist/map.es.js +12 -101
  241. package/dist/map.es.min.js +3 -3
  242. package/dist/map.js +12 -101
  243. package/dist/map.min.js +3 -3
  244. package/dist/map.min.mjs +3 -3
  245. package/dist/map.mjs +12 -101
  246. package/dist/not.es.js +75 -14
  247. package/dist/not.es.min.js +3 -3
  248. package/dist/not.js +75 -14
  249. package/dist/not.min.js +3 -3
  250. package/dist/not.min.mjs +3 -3
  251. package/dist/not.mjs +75 -14
  252. package/dist/omit.es.js +38 -3
  253. package/dist/omit.es.min.js +3 -3
  254. package/dist/omit.js +38 -3
  255. package/dist/omit.min.js +3 -3
  256. package/dist/omit.min.mjs +3 -3
  257. package/dist/omit.mjs +38 -3
  258. package/dist/or.es.js +99 -31
  259. package/dist/or.es.min.js +3 -3
  260. package/dist/or.js +99 -31
  261. package/dist/or.min.js +3 -3
  262. package/dist/or.min.mjs +3 -3
  263. package/dist/or.mjs +99 -31
  264. package/dist/pick.es.js +38 -3
  265. package/dist/pick.es.min.js +3 -3
  266. package/dist/pick.js +38 -3
  267. package/dist/pick.min.js +3 -3
  268. package/dist/pick.min.mjs +3 -3
  269. package/dist/pick.mjs +38 -3
  270. package/dist/pipe.es.js +42 -46
  271. package/dist/pipe.es.min.js +3 -3
  272. package/dist/pipe.js +42 -46
  273. package/dist/pipe.min.js +3 -3
  274. package/dist/pipe.min.mjs +3 -3
  275. package/dist/pipe.mjs +42 -46
  276. package/dist/reduce.es.js +52 -94
  277. package/dist/reduce.es.min.js +3 -3
  278. package/dist/reduce.js +52 -94
  279. package/dist/reduce.min.js +3 -3
  280. package/dist/reduce.min.mjs +3 -3
  281. package/dist/reduce.mjs +52 -94
  282. package/dist/rubico.es.js +746 -869
  283. package/dist/rubico.es.min.js +3 -3
  284. package/dist/rubico.js +746 -869
  285. package/dist/rubico.min.js +3 -3
  286. package/dist/rubico.min.mjs +3 -3
  287. package/dist/rubico.mjs +746 -869
  288. package/dist/set.es.js +18 -3
  289. package/dist/set.es.min.js +3 -3
  290. package/dist/set.js +18 -3
  291. package/dist/set.min.js +3 -3
  292. package/dist/set.min.mjs +3 -3
  293. package/dist/set.mjs +18 -3
  294. package/dist/{any.js → some.es.js} +64 -54
  295. package/dist/some.es.min.js +7 -0
  296. package/dist/{any.mjs → some.js} +72 -48
  297. package/dist/some.min.js +8 -0
  298. package/dist/some.min.mjs +7 -0
  299. package/dist/{any.es.js → some.mjs} +65 -48
  300. package/dist/switchCase.es.js +55 -5
  301. package/dist/switchCase.es.min.js +3 -3
  302. package/dist/switchCase.js +55 -5
  303. package/dist/switchCase.min.js +3 -3
  304. package/dist/switchCase.min.mjs +3 -3
  305. package/dist/switchCase.mjs +55 -5
  306. package/dist/tap.es.js +2 -9
  307. package/dist/tap.es.min.js +3 -3
  308. package/dist/tap.js +2 -9
  309. package/dist/tap.min.js +3 -3
  310. package/dist/tap.min.mjs +3 -3
  311. package/dist/tap.mjs +2 -9
  312. package/dist/thunkify.es.js +45 -2
  313. package/dist/thunkify.es.min.js +3 -3
  314. package/dist/thunkify.js +45 -2
  315. package/dist/thunkify.min.js +3 -3
  316. package/dist/thunkify.min.mjs +3 -3
  317. package/dist/thunkify.mjs +45 -2
  318. package/dist/transform.es.js +35 -71
  319. package/dist/transform.es.min.js +3 -3
  320. package/dist/transform.js +35 -71
  321. package/dist/transform.min.js +3 -3
  322. package/dist/transform.min.mjs +3 -3
  323. package/dist/transform.mjs +35 -71
  324. package/dist/tryCatch.es.js +33 -17
  325. package/dist/tryCatch.es.min.js +3 -3
  326. package/dist/tryCatch.js +33 -17
  327. package/dist/tryCatch.min.js +3 -3
  328. package/dist/tryCatch.min.mjs +3 -3
  329. package/dist/tryCatch.mjs +33 -17
  330. package/dist/x/append.es.js +2 -2
  331. package/dist/x/append.es.min.js +2 -2
  332. package/dist/x/append.js +2 -2
  333. package/dist/x/append.min.js +2 -2
  334. package/dist/x/append.min.mjs +2 -2
  335. package/dist/x/append.mjs +2 -2
  336. package/dist/x/callProp.es.js +2 -2
  337. package/dist/x/callProp.es.min.js +2 -2
  338. package/dist/x/callProp.js +2 -2
  339. package/dist/x/callProp.min.js +2 -2
  340. package/dist/x/callProp.min.mjs +2 -2
  341. package/dist/x/callProp.mjs +2 -2
  342. package/dist/x/defaultsDeep.es.js +2 -2
  343. package/dist/x/defaultsDeep.es.min.js +2 -2
  344. package/dist/x/defaultsDeep.js +2 -2
  345. package/dist/x/defaultsDeep.min.js +2 -2
  346. package/dist/x/defaultsDeep.min.mjs +2 -2
  347. package/dist/x/defaultsDeep.mjs +2 -2
  348. package/dist/x/differenceWith.es.js +7 -7
  349. package/dist/x/differenceWith.es.min.js +3 -3
  350. package/dist/x/differenceWith.js +7 -7
  351. package/dist/x/differenceWith.min.js +2 -2
  352. package/dist/x/differenceWith.min.mjs +3 -3
  353. package/dist/x/differenceWith.mjs +7 -7
  354. package/dist/x/filterOut.es.js +60 -117
  355. package/dist/x/filterOut.es.min.js +3 -3
  356. package/dist/x/filterOut.js +60 -117
  357. package/dist/x/filterOut.min.js +3 -3
  358. package/dist/x/filterOut.min.mjs +3 -3
  359. package/dist/x/filterOut.mjs +60 -117
  360. package/dist/x/find.es.js +2 -2
  361. package/dist/x/find.es.min.js +2 -2
  362. package/dist/x/find.js +2 -2
  363. package/dist/x/find.min.js +2 -2
  364. package/dist/x/find.min.mjs +2 -2
  365. package/dist/x/find.mjs +2 -2
  366. package/dist/x/findIndex.es.js +2 -2
  367. package/dist/x/findIndex.es.min.js +2 -2
  368. package/dist/x/findIndex.js +2 -2
  369. package/dist/x/findIndex.min.js +2 -2
  370. package/dist/x/findIndex.min.mjs +2 -2
  371. package/dist/x/findIndex.mjs +2 -2
  372. package/dist/x/first.es.js +2 -2
  373. package/dist/x/first.es.min.js +2 -2
  374. package/dist/x/first.js +2 -2
  375. package/dist/x/first.min.js +2 -2
  376. package/dist/x/first.min.mjs +2 -2
  377. package/dist/x/first.mjs +2 -2
  378. package/dist/x/flatten.es.js +20 -207
  379. package/dist/x/flatten.es.min.js +3 -3
  380. package/dist/x/flatten.js +20 -207
  381. package/dist/x/flatten.min.js +3 -3
  382. package/dist/x/flatten.min.mjs +3 -3
  383. package/dist/x/flatten.mjs +20 -207
  384. package/dist/x/groupBy.es.js +52 -94
  385. package/dist/x/groupBy.es.min.js +3 -3
  386. package/dist/x/groupBy.js +52 -94
  387. package/dist/x/groupBy.min.js +3 -3
  388. package/dist/x/groupBy.min.mjs +3 -3
  389. package/dist/x/groupBy.mjs +52 -94
  390. package/dist/x/has.es.js +2 -2
  391. package/dist/x/has.es.min.js +2 -2
  392. package/dist/x/has.js +2 -2
  393. package/dist/x/has.min.js +2 -2
  394. package/dist/x/has.min.mjs +2 -2
  395. package/dist/x/has.mjs +2 -2
  396. package/dist/x/identity.es.js +2 -2
  397. package/dist/x/identity.es.min.js +2 -2
  398. package/dist/x/identity.js +2 -2
  399. package/dist/x/identity.min.js +2 -2
  400. package/dist/x/identity.min.mjs +2 -2
  401. package/dist/x/identity.mjs +2 -2
  402. package/dist/x/includes.es.js +2 -2
  403. package/dist/x/includes.es.min.js +2 -2
  404. package/dist/x/includes.js +2 -2
  405. package/dist/x/includes.min.js +2 -2
  406. package/dist/x/includes.min.mjs +2 -2
  407. package/dist/x/includes.mjs +2 -2
  408. package/dist/x/isDeepEqual.es.js +2 -2
  409. package/dist/x/isDeepEqual.es.min.js +2 -2
  410. package/dist/x/isDeepEqual.js +2 -2
  411. package/dist/x/isDeepEqual.min.js +2 -2
  412. package/dist/x/isDeepEqual.min.mjs +2 -2
  413. package/dist/x/isDeepEqual.mjs +2 -2
  414. package/dist/x/isEmpty.es.js +2 -2
  415. package/dist/x/isEmpty.es.min.js +2 -2
  416. package/dist/x/isEmpty.js +2 -2
  417. package/dist/x/isEmpty.min.js +2 -2
  418. package/dist/x/isEmpty.min.mjs +2 -2
  419. package/dist/x/isEmpty.mjs +2 -2
  420. package/dist/x/isEqual.es.js +2 -2
  421. package/dist/x/isEqual.es.min.js +2 -2
  422. package/dist/x/isEqual.js +2 -2
  423. package/dist/x/isEqual.min.js +2 -2
  424. package/dist/x/isEqual.min.mjs +2 -2
  425. package/dist/x/isEqual.mjs +2 -2
  426. package/dist/x/isFunction.es.js +2 -2
  427. package/dist/x/isFunction.es.min.js +2 -2
  428. package/dist/x/isFunction.js +2 -2
  429. package/dist/x/isFunction.min.js +2 -2
  430. package/dist/x/isFunction.min.mjs +2 -2
  431. package/dist/x/isFunction.mjs +2 -2
  432. package/dist/x/isIn.es.js +2 -2
  433. package/dist/x/isIn.es.min.js +2 -2
  434. package/dist/x/isIn.js +2 -2
  435. package/dist/x/isIn.min.js +2 -2
  436. package/dist/x/isIn.min.mjs +2 -2
  437. package/dist/x/isIn.mjs +2 -2
  438. package/dist/x/isObject.es.js +2 -2
  439. package/dist/x/isObject.es.min.js +2 -2
  440. package/dist/x/isObject.js +2 -2
  441. package/dist/x/isObject.min.js +2 -2
  442. package/dist/x/isObject.min.mjs +2 -2
  443. package/dist/x/isObject.mjs +2 -2
  444. package/dist/x/isString.es.js +2 -2
  445. package/dist/x/isString.es.min.js +2 -2
  446. package/dist/x/isString.js +2 -2
  447. package/dist/x/isString.min.js +2 -2
  448. package/dist/x/isString.min.mjs +2 -2
  449. package/dist/x/isString.mjs +2 -2
  450. package/dist/x/keys.es.js +2 -2
  451. package/dist/x/keys.es.min.js +2 -2
  452. package/dist/x/keys.js +2 -2
  453. package/dist/x/keys.min.js +2 -2
  454. package/dist/x/keys.min.mjs +2 -2
  455. package/dist/x/keys.mjs +2 -2
  456. package/dist/x/last.es.js +2 -2
  457. package/dist/x/last.es.min.js +2 -2
  458. package/dist/x/last.js +2 -2
  459. package/dist/x/last.min.js +2 -2
  460. package/dist/x/last.min.mjs +2 -2
  461. package/dist/x/last.mjs +2 -2
  462. package/dist/x/maxBy.es.js +59 -6
  463. package/dist/x/maxBy.es.min.js +3 -3
  464. package/dist/x/maxBy.js +59 -6
  465. package/dist/x/maxBy.min.js +3 -3
  466. package/dist/x/maxBy.min.mjs +3 -3
  467. package/dist/x/maxBy.mjs +59 -6
  468. package/dist/x/noop.es.js +2 -2
  469. package/dist/x/noop.es.min.js +2 -2
  470. package/dist/x/noop.js +2 -2
  471. package/dist/x/noop.min.js +2 -2
  472. package/dist/x/noop.min.mjs +2 -2
  473. package/dist/x/noop.mjs +2 -2
  474. package/dist/x/pluck.es.js +32 -103
  475. package/dist/x/pluck.es.min.js +3 -3
  476. package/dist/x/pluck.js +32 -103
  477. package/dist/x/pluck.min.js +3 -3
  478. package/dist/x/pluck.min.mjs +3 -3
  479. package/dist/x/pluck.mjs +32 -103
  480. package/dist/x/prepend.es.js +2 -2
  481. package/dist/x/prepend.es.min.js +2 -2
  482. package/dist/x/prepend.js +2 -2
  483. package/dist/x/prepend.min.js +2 -2
  484. package/dist/x/prepend.min.mjs +2 -2
  485. package/dist/x/prepend.mjs +2 -2
  486. package/dist/x/size.es.js +2 -2
  487. package/dist/x/size.es.min.js +2 -2
  488. package/dist/x/size.js +2 -2
  489. package/dist/x/size.min.js +2 -2
  490. package/dist/x/size.min.mjs +2 -2
  491. package/dist/x/size.mjs +2 -2
  492. package/dist/x/trace.es.js +2 -9
  493. package/dist/x/trace.es.min.js +3 -3
  494. package/dist/x/trace.js +2 -9
  495. package/dist/x/trace.min.js +3 -3
  496. package/dist/x/trace.min.mjs +3 -3
  497. package/dist/x/trace.mjs +2 -9
  498. package/dist/x/unionWith.es.js +2 -2
  499. package/dist/x/unionWith.es.min.js +2 -2
  500. package/dist/x/unionWith.js +2 -2
  501. package/dist/x/unionWith.min.js +2 -2
  502. package/dist/x/unionWith.min.mjs +2 -2
  503. package/dist/x/unionWith.mjs +2 -2
  504. package/dist/x/uniq.es.js +2 -2
  505. package/dist/x/uniq.es.min.js +2 -2
  506. package/dist/x/uniq.js +2 -2
  507. package/dist/x/uniq.min.js +2 -2
  508. package/dist/x/uniq.min.mjs +2 -2
  509. package/dist/x/uniq.mjs +2 -2
  510. package/dist/x/unless.es.js +2 -2
  511. package/dist/x/unless.es.min.js +2 -2
  512. package/dist/x/unless.js +2 -2
  513. package/dist/x/unless.min.js +2 -2
  514. package/dist/x/unless.min.mjs +2 -2
  515. package/dist/x/unless.mjs +2 -2
  516. package/dist/x/values.es.js +2 -2
  517. package/dist/x/values.es.min.js +2 -2
  518. package/dist/x/values.js +2 -2
  519. package/dist/x/values.min.js +2 -2
  520. package/dist/x/values.min.mjs +2 -2
  521. package/dist/x/values.mjs +2 -2
  522. package/dist/x/when.es.js +2 -2
  523. package/dist/x/when.es.min.js +2 -2
  524. package/dist/x/when.js +2 -2
  525. package/dist/x/when.min.js +2 -2
  526. package/dist/x/when.min.mjs +2 -2
  527. package/dist/x/when.mjs +2 -2
  528. package/dist-test.js +9 -2025
  529. package/eq.js +21 -63
  530. package/es.js +746 -869
  531. package/every.js +94 -0
  532. package/filter.js +83 -125
  533. package/flatMap.js +105 -154
  534. package/forEach.js +82 -0
  535. package/get.js +44 -36
  536. package/global.js +6 -4
  537. package/gt.js +15 -58
  538. package/gte.js +14 -57
  539. package/index.js +746 -869
  540. package/lt.js +17 -60
  541. package/lte.js +14 -57
  542. package/map.js +153 -203
  543. package/memory-usage/reduce.js +2 -2
  544. package/not.js +30 -49
  545. package/omit.js +36 -13
  546. package/or.js +64 -41
  547. package/package.json +7 -7
  548. package/pick.js +52 -22
  549. package/pipe.js +27 -92
  550. package/reduce.js +114 -129
  551. package/rubico.js +10 -8
  552. package/set.js +60 -24
  553. package/some.js +105 -0
  554. package/switchCase.js +29 -25
  555. package/tap.js +15 -45
  556. package/test.js +847 -1083
  557. package/thunkify.js +11 -5
  558. package/transform.js +57 -81
  559. package/tryCatch.js +38 -32
  560. package/x/differenceWith.js +3 -3
  561. package/x/filterOut.test.js +6 -6
  562. package/x/flatten.js +1 -1
  563. package/x/flatten.test.js +0 -8
  564. package/x/index.js +0 -2
  565. package/x/pluck.js +18 -27
  566. package/x/pluck.test.js +3 -7
  567. package/x/timeInLoop.js +16 -25
  568. package/x/timeInLoop.test.js +8 -4
  569. package/any.js +0 -88
  570. package/dist/any.es.min.js +0 -7
  571. package/dist/any.min.js +0 -8
  572. package/dist/any.min.mjs +0 -7
  573. package/dist/fork.es.js +0 -159
  574. package/dist/fork.es.min.js +0 -7
  575. package/dist/fork.js +0 -166
  576. package/dist/fork.min.js +0 -8
  577. package/dist/fork.min.mjs +0 -7
  578. package/dist/fork.mjs +0 -159
  579. package/dist/x/forEach.es.min.js +0 -7
  580. package/dist/x/forEach.min.js +0 -8
  581. package/dist/x/forEach.min.mjs +0 -7
  582. package/fork.js +0 -91
  583. package/x/forEach.js +0 -93
  584. package/x/forEach.test.js +0 -218
  585. /package/{benchmarks → archive/benchmarks-v1.9.7}/any.js +0 -0
  586. /package/{x/forEach.benchmark.js → archive/benchmarks-v1.9.7/forEach.js} +0 -0
  587. /package/{benchmarks → archive/benchmarks-v1.9.7}/fork.js +0 -0
  588. /package/{benchmarks → archive/benchmarks-v1.9.7}/integration.js +0 -0
  589. /package/{benchmarks → archive/benchmarks-v1.9.7}/misc.js +0 -0
package/thunkify.js CHANGED
@@ -1,16 +1,19 @@
1
+ const areAnyValuesPromises = require('./_internal/areAnyValuesPromises')
2
+ const promiseAll = require('./_internal/promiseAll')
3
+ const curry2 = require('./_internal/curry2')
4
+ const __ = require('./_internal/placeholder')
5
+ const funcApply = require('./_internal/funcApply')
6
+
1
7
  /**
2
8
  * @name thunkify
3
9
  *
4
10
  * @synopsis
5
11
  * ```coffeescript [specscript]
6
- * var func function,
7
- * args ...any
8
- *
9
- * thunkify(func, ...args) -> thunk ()=>func(...args)
12
+ * thunkify(func function, ...args) -> thunk ()=>func(...args)
10
13
  * ```
11
14
  *
12
15
  * @description
13
- * Create a thunk from a function and any number of arguments. A thunk is a function that takes no arguments - the computation it represents has already been "thunk" with given function and arguments.
16
+ * Create a thunk function from another function and any number of arguments. The thunk function takes no arguments, and when called, executes the other function with the provided arguments. The other function is said to be "thunkified".
14
17
  *
15
18
  * ```javascript [playground]
16
19
  * const add = (a, b) => a + b
@@ -21,6 +24,9 @@
21
24
  * ```
22
25
  */
23
26
  const thunkify = (func, ...args) => function thunk() {
27
+ if (areAnyValuesPromises(args)) {
28
+ return promiseAll(args).then(curry2(funcApply, func, __))
29
+ }
24
30
  return func(...args)
25
31
  }
26
32
 
package/transform.js CHANGED
@@ -3,36 +3,55 @@ const __ = require('./_internal/placeholder')
3
3
  const curry3 = require('./_internal/curry3')
4
4
  const genericTransform = require('./_internal/genericTransform')
5
5
 
6
+ // _transform(collection any, transducer function, initialValue function|any) -> Promise
7
+ const _transform = function (collection, transducer, initialValue) {
8
+ if (typeof initialValue == 'function') {
9
+ const actualInitialValue = initialValue(collection)
10
+ return isPromise(actualInitialValue)
11
+ ? actualInitialValue.then(curry3(genericTransform, collection, transducer, __))
12
+ : genericTransform(collection, transducer, actualInitialValue)
13
+ }
14
+ return isPromise(initialValue)
15
+ ? initialValue.then(curry3(genericTransform, collection, transducer, __))
16
+ : genericTransform(collection, transducer, initialValue)
17
+ }
18
+
6
19
  /**
7
20
  * @name transform
8
21
  *
9
22
  * @synopsis
10
23
  * ```coffeescript [specscript]
11
- * Reducer<T> = (any, T)=>Promise|any
12
- * Semigroup<T> = Array<T>|String<T>|Set<T>|TypedArray<T>
13
- * |{ concat: Reducer<T> }|{ write: Reducer<T> }|Object<T>
14
- * Foldable<T> = Iterable<T>|AsyncIterable<T>|{ reduce: Reducer<T>=>any }|Object<T>
15
- *
16
- * var T any,
17
- * args ...any,
18
- * transducer Reducer=>Reducer,
19
- * init (...args=>Promise|Semigroup<T>)|Semigroup<T>,
20
- * foldable Foldable<T>,
21
- * generatorFunction ...args=>Generator<T>,
22
- * asyncGeneratorFunction ...args=>AsyncGenerator<T>,
23
- * reducers ...Reducer<T>
24
+ * type Reducer = (result any, item any)=>(result any)
25
+ * type Transducer = Reducer=>Reducer
26
+ * type Transformable = Array|String|Set|TypedArray|{ concat: function }|{ write: function }|Object
27
+ * type Foldable = Iterable|AsyncIterable|Object<value any>
24
28
  *
25
- * transform(transducer, init?)(foldable) -> Promise|Semigroup
29
+ * initialValue Transformable|((foldable Foldable)=>Promise|Transformable)
26
30
  *
27
- * transform(transducer, init?)(generatorFunction) -> ...args=>Promise|Semigroup
28
- *
29
- * transform(transducer, init?)(asyncGeneratorFunction) -> ...args=>Promise|Semigroup
31
+ * transform(
32
+ * foldable Foldable,
33
+ * transducer Transducer,
34
+ * initialValue? Transformable|(Foldable=>Promise|Transformable),
35
+ * ) -> result Promise|Transformable
30
36
  *
31
- * transform(transducer, init?)(...reducers) -> ...args=>Promise|Semigroup
37
+ * transform(
38
+ * transducer Transducer,
39
+ * initialValue? Transformable|(Foldable=>Promise|Transformable),
40
+ * )(foldable Foldable) -> result Promise|Transformable
32
41
  * ```
33
42
  *
34
43
  * @description
35
- * Reduce a value by transducer and concatenation, returning a semigroup of transduced items. The initial value may be a function, in which case it is treated as a resolver.
44
+ * Transforms a transformable collection into any other transformable collection. The type of transformation depends on the collection provided by the initial value. If the initial is a function it is used as a resolver for the provided collection. `transform` accepts transformable collections, or collections that support a concatenation operation:
45
+ *
46
+ * * `Array`; concatenation defined by `result.concat(values)`
47
+ * * `string`; concatenation defined by `result + values`
48
+ * * `Set`; concatenation defined by `result.add(...values)`
49
+ * * `TypedArray`; concatenation defined by `result.set(prevResult); result.set(values, offset)`
50
+ * * `{ concat: function }`; concatenation defined by `result.concat(values)`
51
+ * * `{ write: function }`; concatenation defined by `result.write(item)`
52
+ * * `Object`; concatenation defined by `({ ...result, ...values })`
53
+ *
54
+ * `transform` can transform any of the above collections into any of the other above collections.
36
55
  *
37
56
  * ```javascript [playground]
38
57
  * const square = number => number ** 2
@@ -44,29 +63,28 @@ const genericTransform = require('./_internal/genericTransform')
44
63
  * map(square),
45
64
  * ])
46
65
  *
66
+ * // transform arrays into arrays
47
67
  * console.log(
48
- * transform(squaredOdds, () => [])([1, 2, 3, 4, 5]),
68
+ * transform(squaredOdds, [])([1, 2, 3, 4, 5])
49
69
  * ) // [1, 9, 25]
50
70
  *
71
+ * // transform arrays into strings
51
72
  * console.log(
52
- * transform(squaredOdds, '')([1, 2, 3, 4, 5]),
73
+ * transform(squaredOdds, '')([1, 2, 3, 4, 5])
53
74
  * ) // '1925'
54
75
  *
76
+ * // transform arrays into sets
77
+ * console.log(
78
+ * transform(squaredOdds, new Set())([1, 2, 3, 4, 5])
79
+ * ) // Set (3) { 1, 9, 25 }
80
+ *
81
+ * // transform arrays into typed arrays
55
82
  * console.log(
56
- * transform(squaredOdds, () => new Uint8Array())([1, 2, 3, 4, 5]),
83
+ * transform(squaredOdds, new Uint8Array())([1, 2, 3, 4, 5]),
57
84
  * ) // Uint8Array(3) [ 1, 9, 25 ]
58
85
  * ```
59
86
  *
60
- * A `Semigroup` is any type with some notion of concatenation. This could possibly manifest in a `.concat` method.
61
- * * `Array` - `result.concat(values)`
62
- * * `string` - `result + values`
63
- * * `Set` - `result.add(...values)`
64
- * * `TypedArray` - `result.set(prevResult); result.set(values, offset)`
65
- * * `{ concat: function }` - `result.concat(values)`
66
- * * `{ write: function }` - essentially `item.pipe(result)` or `result.write(item)`
67
- * * `Object` - `({ ...result, ...values })`
68
- *
69
- * Here is a simple `Semigroup` as an object that implements `.concat`.
87
+ * `transform` arrays into objects that implement `.concat`.
70
88
  *
71
89
  * ```javascript [playground]
72
90
  * const square = number => number ** 2
@@ -86,7 +104,7 @@ const genericTransform = require('./_internal/genericTransform')
86
104
  * // 25
87
105
  * ```
88
106
  *
89
- * Here is a transformation of an async generator to a Node.js writable stream, `process.stdout`.
107
+ * `transform` an async generator into `process.stdout`, a Node.js writable stream that implements `.write`.
90
108
  *
91
109
  * ```javascript [node]
92
110
  * // this example is duplicated in rubico/examples/transformStreamRandomInts.js
@@ -110,62 +128,20 @@ const genericTransform = require('./_internal/genericTransform')
110
128
  * )(streamRandomInts()) // 9216576529289484980147613249169774446246768649...
111
129
  * ```
112
130
  *
113
- * `transform`, like `reduce`, supports reducer combination. This variant of state management automatically assigns (`Object.assign`) pipeline objects into the aggregate state object.
114
- *
115
- * ```javascript [playground]
116
- * const reducerA = async (state, action) => {
117
- * if (action.type == 'A') return { ...state, A: true }
118
- * return state
119
- * }
120
- *
121
- * const reducerB = async (state, action) => {
122
- * if (action.type == 'B') return { ...state, B: true }
123
- * return state
124
- * }
125
- *
126
- * const reducerC = async (state, action) => {
127
- * if (action.type == 'C') return { ...state, C: true }
128
- * return state
129
- * }
130
- *
131
- * const logAction = function (action) {
132
- * console.log('action', action)
133
- * return action
134
- * }
135
- *
136
- * const reducingABC = transform(
137
- * map(logAction), // transducer logger middleware
138
- * () => ({}), // initial state resolver
139
- * )(reducerA, reducerB, reducerC)
140
- *
141
- * const actions = [{ type: 'A' }, { type: 'B' }, { type: 'C' }]
142
- *
143
- * reducingABC(actions).then(
144
- * state => console.log('state', state))
145
- * // action { type: 'A' }
146
- * // action { type: 'B' }
147
- * // action { type: 'C' }
148
- * // state { A: true, B: true, C: true }
149
- * ```
150
- *
151
131
  * @execution series
152
132
  *
153
133
  * @transducing
154
134
  *
155
135
  * TODO explore Semigroup = Iterator|AsyncIterator
156
136
  */
157
- const transform = function (transducer, init) {
158
- if (typeof init == 'function') {
159
- return function transforming(...args) {
160
- const result = init(...args)
161
- return isPromise(result)
162
- ? result.then(curry3(genericTransform, args, transducer, __))
163
- : genericTransform(args, transducer, result)
164
- }
137
+ const transform = function (...args) {
138
+ if (typeof args[0] == 'function') {
139
+ return curry3(_transform, __, args[0], args[1])
165
140
  }
166
- return function transforming(...args) {
167
- return genericTransform(args, transducer, init)
141
+ if (isPromise(args[0])) {
142
+ return args[0].then(curry3(_transform, __, args[1], args[2]))
168
143
  }
144
+ return _transform(args[0], args[1], args[2])
169
145
  }
170
146
 
171
147
  module.exports = transform
package/tryCatch.js CHANGED
@@ -1,39 +1,55 @@
1
1
  const isPromise = require('./_internal/isPromise')
2
+ const promiseAll = require('./_internal/promiseAll')
2
3
  const __ = require('./_internal/placeholder')
3
4
  const curry3 = require('./_internal/curry3')
4
5
  const catcherApply = require('./_internal/catcherApply')
6
+ const areAnyValuesPromises = require('./_internal/areAnyValuesPromises')
7
+
8
+ // _tryCatch(tryer function, catcher function, args Array) -> Promise
9
+ const _tryCatch = function (tryer, catcher, args) {
10
+ try {
11
+ const result = tryer(...args)
12
+ return isPromise(result)
13
+ ? result.catch(curry3(catcherApply, catcher, __, args))
14
+ : result
15
+ } catch (error) {
16
+ return catcher(error, ...args)
17
+ }
18
+ }
5
19
 
6
20
  /**
7
21
  * @name tryCatch
8
22
  *
9
23
  * @synopsis
10
24
  * ```coffeescript [specscript]
11
- * var args ...any,
12
- * tryer ...args=>Promise|any,
13
- * catcher (error Error, ...args)=>Promise|any
25
+ * tryCatch(tryer function, catcher function)(...args) -> Promise|any
14
26
  *
15
- * tryCatch(tryer, catcher)(...args) -> Promise|any
27
+ * tryCatch(...args, tryer function, catcher function) -> Promise|any
16
28
  * ```
17
29
  *
18
30
  * @description
19
- * Try a `tryer`, catch with `catcher`. On error or rejected promise, call the `catcher` with the error followed by any arguments to the tryer.
31
+ * Handles errors with a `tryer` and a `catcher` function. Calls the `tryer` function with the provided arguments and catches any errors thrown by the `tryer` function with the `catcher` function. If the `tryer` function is asynchronous and returns a rejected promise, the `catcher` function will execute with the value of the rejected promise. The `catcher` function is called with the error and all arguments supplied to the `tryer` function.
20
32
  *
21
33
  * ```javascript [playground]
22
- * const errorThrower = tryCatch(
23
- * message => {
24
- * throw new Error(message)
25
- * },
26
- * (error, message) => {
27
- * console.log(error)
28
- * return `${message} from catcher`
29
- * },
30
- * )
34
+ * const throwsIfOdd = number => {
35
+ * if (number % 2 == 1) {
36
+ * throw new Error(`${number} is odd`)
37
+ * }
38
+ * console.log('did not throw for', number)
39
+ * }
40
+ *
41
+ * const errorHandler = tryCatch(throwsIfOdd, (error, number) => {
42
+ * console.log('caught error from number', number)
43
+ * console.log(error)
44
+ * })
45
+ *
46
+ * errorHandler(2) // did not throw for 2
47
+ * errorHandler(3) // caught error from number 3
48
+ * // Error: 3 is odd
31
49
  *
32
- * console.log(errorThrower('hello')) // Error: hello
33
- * // hello from catcher
34
50
  * ```
35
51
  *
36
- * `tryCatch` behaves eagerly when passed any amount of arguments before the tryer and catcher.
52
+ * `tryCatch` behaves eagerly (executes immediately with a single call and not with multiple calls like a higher order function) when passed any amount of nonfunction (primitive or object) arguments before the `tryer` and `catcher` functions.
37
53
  *
38
54
  * ```javascript [playground]
39
55
  * const add = (a, b) => a + b
@@ -51,27 +67,17 @@ const tryCatch = function (...args) {
51
67
  if (args.length > 2) {
52
68
  const catcher = args.pop(),
53
69
  tryer = args.pop()
54
- try {
55
- const result = tryer(...args)
56
- return isPromise(result)
57
- ? result.catch(curry3(catcherApply, catcher, __, args))
58
- : result
59
- } catch (error) {
60
- return catcher(error, ...args)
70
+ if (areAnyValuesPromises(args)) {
71
+ return promiseAll(args)
72
+ .then(curry3(_tryCatch, tryer, catcher, __))
61
73
  }
74
+ return _tryCatch(tryer, catcher, args)
62
75
  }
63
76
 
64
77
  const tryer = args[0],
65
78
  catcher = args[1]
66
79
  return function tryCatcher(...args) {
67
- try {
68
- const result = tryer(...args)
69
- return isPromise(result)
70
- ? result.catch(curry3(catcherApply, catcher, __, args))
71
- : result
72
- } catch (error) {
73
- return catcher(error, ...args)
74
- }
80
+ return _tryCatch(tryer, catcher, args)
75
81
  }
76
82
  }
77
83
 
@@ -6,7 +6,7 @@ const thunkify5 = require('../_internal/thunkify5')
6
6
  const thunkConditional = require('../_internal/thunkConditional')
7
7
  const isPromise = require('../_internal/isPromise')
8
8
  const isArray = require('../_internal/isArray')
9
- const arrayAny = require('../_internal/arrayAny')
9
+ const arraySome = require('../_internal/arraySome')
10
10
  const arrayPush = require('../_internal/arrayPush')
11
11
  const funcConcatSync = require('../_internal/funcConcatSync')
12
12
  const noop = require('../_internal/noop')
@@ -33,7 +33,7 @@ const differenceWithArrayAsync = async function (
33
33
  const allValuesLength = allValues.length
34
34
  while (++index < allValuesLength) {
35
35
  const item = allValues[index]
36
- let doesItemExistByComparator = arrayAny(array, curry2(comparator, item, __))
36
+ let doesItemExistByComparator = arraySome(array, curry2(comparator, item, __))
37
37
  if (isPromise(doesItemExistByComparator)) {
38
38
  doesItemExistByComparator = await doesItemExistByComparator
39
39
  }
@@ -62,7 +62,7 @@ const differenceWithArray = function (comparator, allValues, array) {
62
62
  let index = -1
63
63
  while (++index < allValuesLength) {
64
64
  const item = allValues[index],
65
- doesItemExistByComparator = arrayAny(array, curry2(comparator, item, __))
65
+ doesItemExistByComparator = arraySome(array, curry2(comparator, item, __))
66
66
  if (isPromise(doesItemExistByComparator)) {
67
67
  return doesItemExistByComparator.then(funcConcatSync(
68
68
  curry3(thunkConditional, __, noop, thunkify2(arrayPush, result, item)),
@@ -40,13 +40,13 @@ describe('filterOut', () => {
40
40
 
41
41
  it('creates a rejecting generator function when passed a generator', () => {
42
42
  const rejectOdds = filterOut(number => number % 2 == 1)
43
- const oddsRejectingGeneratorFunc = rejectOdds(function* (array) {
43
+ const oddsRejectingGenerator = rejectOdds((function* (array) {
44
44
  for (const value of array) {
45
45
  yield value
46
46
  }
47
- })
47
+ })([1, 2, 3, 4, 5]))
48
48
  const evensArray = []
49
- for (const number of oddsRejectingGeneratorFunc([1, 2, 3, 4, 5])) {
49
+ for (const number of oddsRejectingGenerator) {
50
50
  evensArray.push(number)
51
51
  }
52
52
  assert.deepEqual(evensArray, [2, 4])
@@ -54,13 +54,13 @@ describe('filterOut', () => {
54
54
 
55
55
  it('creates a rejecting generator function when passed an async generator', async () => {
56
56
  const asyncRejectOdds = filterOut(async number => number % 2 == 1)
57
- const oddsRejectingGeneratorFunc = asyncRejectOdds(async function* (array) {
57
+ const oddsRejectingGenerator = asyncRejectOdds((async function* (array) {
58
58
  for (const value of array) {
59
59
  yield value
60
60
  }
61
- })
61
+ })([1, 2, 3, 4, 5]))
62
62
  const evensArray = []
63
- for await (const number of oddsRejectingGeneratorFunc([1, 2, 3, 4, 5])) {
63
+ for await (const number of oddsRejectingGenerator) {
64
64
  evensArray.push(number)
65
65
  }
66
66
  assert.deepEqual(evensArray, [2, 4])
package/x/flatten.js CHANGED
@@ -74,7 +74,7 @@ const flatten = function (value) {
74
74
  if (value.constructor == Object) {
75
75
  return objectFlatten(value)
76
76
  }
77
- return flatMap(identity)(value)
77
+ return flatMap(value, identity)
78
78
  }
79
79
 
80
80
  module.exports = flatten
package/x/flatten.test.js CHANGED
@@ -34,12 +34,4 @@ describe('flatten', () => {
34
34
  it('flatten(undefined)', async () => {
35
35
  assert.strictEqual(flatten(undefined), undefined)
36
36
  })
37
- it('flatteningReducer', async () => {
38
- const add = (a, b) => a + b
39
- const flatteningAdd = flatten(add)
40
- assert.strictEqual(
41
- [[1], [2], [3], [4], [5]].reduce(flatteningAdd, 0),
42
- 15,
43
- )
44
- })
45
37
  })
package/x/index.js CHANGED
@@ -7,7 +7,6 @@ const find = require('./find')
7
7
  const findIndex = require('./findIndex')
8
8
  const first = require('./first')
9
9
  const flatten = require('./flatten')
10
- const forEach = require('./forEach')
11
10
  const groupBy = require('./groupBy')
12
11
  const has = require('./has')
13
12
  const identity = require('./identity')
@@ -43,7 +42,6 @@ const rubicoX = {
43
42
  findIndex,
44
43
  first,
45
44
  flatten,
46
- forEach,
47
45
  groupBy,
48
46
  has,
49
47
  identity,
package/x/pluck.js CHANGED
@@ -7,28 +7,19 @@ const get = require('../get')
7
7
  *
8
8
  * @synopsis
9
9
  * ```coffeescript [specscript]
10
- * Functor<T> = Array<T>|Object<T>|Iterator<T>|AsyncIterator<T>|{ map: T=>any }
11
- * Reducer<T> = (any, T)=>Promise|any
10
+ * pluck(path string)(array Array) -> result Array
12
11
  *
13
- * var T any,
14
- * mapper T=>Promise|any,
15
- * functor Functor<T>
16
- * args ...any,
17
- * generatorFunction ...args=>Generator<T>,
18
- * asyncGeneratorFunction ...args=>AsyncGenerator<T>,
19
- * reducer Reducer<T>
20
- *
21
- * pluck(functor) -> Promise|Functor
22
- *
23
- * pluck(generatorFunction) -> ...args=>Generator
24
- *
25
- * pluck(asyncGeneratorFunction) -> ...args=>AsyncGenerator
26
- *
27
- * pluck(reducer) -> Reducer
12
+ * pluck(array Array, path string) -> result Array
28
13
  * ```
29
14
  *
30
15
  * @description
31
- * Apply a getter denoted by path across all items of a collection, creating a new collection of plucked values. Also works in transducer position.
16
+ * Creates an array of picked properties denoted by a path from another array.
17
+ *
18
+ * `pluck` supports three types of path patterns for nested property access.
19
+ *
20
+ * * dot delimited - `'a.b.c'`
21
+ * * bracket notation - `'a[0].value'`
22
+ * * an array of keys or indices - `['a', 0, 'value']`
32
23
  *
33
24
  * ```javascript [playground]
34
25
  * import pluck from 'https://unpkg.com/rubico/dist/x/pluck.es.js'
@@ -39,18 +30,18 @@ const get = require('../get')
39
30
  * { name: 'Jim', age: 22 },
40
31
  * ]
41
32
  *
42
- * const usernames = pluck('name')(users)
33
+ * const usernames = pluck(users, 'name')
43
34
  *
44
35
  * console.log(usernames) // ['George', 'Jane', 'Jim']
45
- *
46
- * const add = (a, b) => a + b
47
- *
48
- * console.log(
49
- * 'total age:',
50
- * users.reduce(pluck('age')(add), 0),
51
- * ) // total age: 96
52
36
  * ```
53
37
  */
54
- const pluck = funcConcat(get, map)
38
+ const pluck = function (...args) {
39
+ const path = args.pop()
40
+ const getter = get(path)
41
+ if (args.length == 0) {
42
+ return map(getter)
43
+ }
44
+ return map(args[0], getter)
45
+ }
55
46
 
56
47
  module.exports = pluck
package/x/pluck.test.js CHANGED
@@ -5,17 +5,13 @@ const createAbc = v => ({ a: { b: { c: v } } })
5
5
 
6
6
  describe('pluck', () => {
7
7
  it('creates a new collection by getting a path from every item of an old collection', async () => {
8
+ const nested = [1, 2, 3].map(createAbc)
8
9
  assert.deepEqual(
9
- pluck('a.b.c')([1, 2, 3].map(createAbc)),
10
+ pluck('a.b.c')(nested),
10
11
  [1, 2, 3],
11
12
  )
12
- })
13
- it('works in transducer position', async () => {
14
13
  assert.deepEqual(
15
- [1, 2, 3].map(createAbc).reduce(
16
- pluck('a.b.c')((a, b) => a.concat([b])),
17
- [],
18
- ),
14
+ pluck(nested, 'a.b.c'),
19
15
  [1, 2, 3],
20
16
  )
21
17
  })
package/x/timeInLoop.js CHANGED
@@ -1,23 +1,22 @@
1
+ const _timeInLoop = require('../_internal/timeInLoop')
2
+ const timeInLoopAsync = require('../_internal/timeInLoopAsync')
3
+
1
4
  /**
2
5
  * @name timeInLoop
3
6
  *
4
7
  * @synopsis
5
8
  * timeInLoop(desc string, loopCount number, fn function) -> undefined
6
9
  *
7
- * @catchphrase
8
- * How long does a function take to run this many loops
10
+ * @description
11
+ * Logs the amount of time required for a function to run a certain number of times
12
+ *
13
+ * ```coffeescript [specscript]
14
+ * timeInLoop('hello', 1e6, () => 'hello') // hello: 1e+6: 3.474ms
15
+ * ```
9
16
  *
10
- * @example
11
- * timeInLoop('yo', 1e6, () => 'yo') // yo: 1e+6: 3.474ms
17
+ * Reference: https://gist.github.com/funfunction/91b5876a5f562e1e352aed0fcabc3858
12
18
  */
13
- const timeInLoop = (desc, loopCount, fn) => {
14
- const d = `${desc}: ${loopCount.toExponential()}`
15
- console.time(d)
16
- for (let i = 0; i < loopCount; i++) {
17
- fn()
18
- }
19
- console.timeEnd(d)
20
- }
19
+ const timeInLoop = _timeInLoop
21
20
 
22
21
  /**
23
22
  * @name timeInLoop.async
@@ -25,21 +24,13 @@ const timeInLoop = (desc, loopCount, fn) => {
25
24
  * @synopsis
26
25
  * timeInLoop.async(desc string, loopCount number, fn function) -> undefined
27
26
  *
28
- * @catchphrase
27
+ * @description
29
28
  * Like timeInLoop, but every call is awaited
30
29
  *
31
- * @example
32
- * timeInLoop.async('asyncYo', 1e6, async () => 'yo') // asyncYo: 1e+6: 116.006ms
30
+ * ```coffeescript [specscript]
31
+ * timeInLoop.async('async hello', 1e6, async () => 'hello') // async hello: 1e+6: 116.006ms
32
+ * ```
33
33
  */
34
- timeInLoop.async = async (desc, loopCount, fn) => {
35
- const d = `${desc}: ${loopCount.toExponential()}`
36
- console.time(d)
37
- for (let i = 0; i < loopCount; i++) {
38
- await fn()
39
- }
40
- console.timeEnd(d)
41
- }
34
+ timeInLoop.async = timeInLoopAsync
42
35
 
43
36
  module.exports = timeInLoop
44
-
45
- // thanks: https://gist.github.com/funfunction/91b5876a5f562e1e352aed0fcabc3858
@@ -3,14 +3,18 @@ const timeInLoop = require('./timeInLoop')
3
3
 
4
4
  describe('timeInLoop', () => {
5
5
  it('timeInLoop(desc string, loopCount number, fn function) -> y undefined', async () => {
6
- const y = timeInLoop('hey', 1e5, () => 'hey')
7
- assert.strictEqual(y, undefined)
6
+ const result = timeInLoop('hey', 1e5, () => 'hey')
7
+ assert.equal(result.description, 'hey')
8
+ assert.equal(result.loopCount, 1e5)
9
+ assert.equal(typeof result.duration, 'number')
8
10
  })
9
11
 
10
12
  it('timeInLoop.async(desc string, loopCount number, fn function) -> y undefined', async () => {
11
13
  const p = timeInLoop.async('asyncHey', 1e5, async () => 'asyncHey')
12
14
  assert(p instanceof Promise)
13
- const y = await p
14
- assert.strictEqual(y, undefined)
15
+ const result = await p
16
+ assert.equal(result.description, 'asyncHey')
17
+ assert.equal(result.loopCount, 1e5)
18
+ assert.equal(typeof result.duration, 'number')
15
19
  })
16
20
  })