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
@@ -15,7 +15,7 @@ const asyncGenerator = async function*(i) {
15
15
  yield 3
16
16
  }
17
17
 
18
- void (async () => {
18
+ setImmediate(async () => {
19
19
  let i = 0, maxHeapUsed = 0
20
20
  while (i < iterations) {
21
21
  const p = reduce((a, b) => a + b, 0)(asyncGenerator(i))
@@ -35,6 +35,6 @@ void (async () => {
35
35
  }
36
36
 
37
37
  console.log('maxHeapUsed (MiB)', maxHeapUsed / 1024 / 1024)
38
- })()
38
+ })
39
39
 
40
40
  // https://stackoverflow.com/questions/62336381/is-this-promise-cancellation-implementation-for-reducing-an-async-iterable-on-th
package/not.js CHANGED
@@ -1,21 +1,33 @@
1
+ const areAnyValuesPromises = require('./_internal/areAnyValuesPromises')
1
2
  const isPromise = require('./_internal/isPromise')
3
+ const promiseAll = require('./_internal/promiseAll')
4
+ const __ = require('./_internal/placeholder')
5
+ const curry2 = require('./_internal/curry2')
6
+ const curryArgs2 = require('./_internal/curryArgs2')
2
7
 
3
- // true -> false
4
- const _not = value => !value
8
+ // negate(value boolean) -> inverse boolean
9
+ const negate = value => !value
10
+
11
+ // _not(args Array, predicate function)
12
+ const _not = function (args, predicate) {
13
+ const boolean = predicate(...args)
14
+ return isPromise(boolean) ? boolean.then(negate) : !boolean
15
+ }
5
16
 
6
17
  /**
7
18
  * @name not
8
19
  *
9
20
  * @synopsis
10
21
  * ```coffeescript [specscript]
11
- * var args ...any,
12
- * predicate ...args=>Promise|boolean
22
+ * not(value boolean) -> negated boolean
13
23
  *
14
- * not(predicate)(...args) -> boolean
24
+ * not(...args, predicate function) -> negated boolean
25
+ *
26
+ * not(predicate function)(...args) -> negated boolean
15
27
  * ```
16
28
  *
17
29
  * @description
18
- * Negate a value (`!`)
30
+ * Negate a value like the [logical NOT (`!`)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_NOT) operator.
19
31
  *
20
32
  * ```javascript [playground]
21
33
  * const myObj = { a: 1 }
@@ -24,7 +36,7 @@ const _not = value => !value
24
36
  * console.log(not('b' in myObj)) // true
25
37
  * ```
26
38
  *
27
- * If passed a function predicate, `not` returns a logically inverted predicate that returns true everywhere the original predicate would have returned false and vice versa.
39
+ * If provided a predicate function, `not` returns a logically inverted predicate that returns true everywhere the original predicate would have returned false.
28
40
  *
29
41
  * ```javascript [playground]
30
42
  * const isOdd = number => number % 2 == 1
@@ -34,50 +46,19 @@ const _not = value => !value
34
46
  * ) // false
35
47
  * ```
36
48
  */
37
- const not = function (funcOrValue) {
38
- if (typeof funcOrValue == 'function') {
39
- return function logicalInverter(value) {
40
- const boolean = funcOrValue(value)
41
- return isPromise(boolean) ? boolean.then(_not) : !boolean
49
+
50
+ const not = function (...args) {
51
+ const predicateOrValue = args.pop()
52
+ if (typeof predicateOrValue == 'function') {
53
+ if (args.length == 0) {
54
+ return curryArgs2(_not, __, predicateOrValue)
42
55
  }
56
+ if (areAnyValuesPromises(args)) {
57
+ return promiseAll(args).then(curry2(_not, __, predicateOrValue))
58
+ }
59
+ return _not(args, predicateOrValue)
43
60
  }
44
- return !funcOrValue
61
+ return !predicateOrValue
45
62
  }
46
63
 
47
- /**
48
- * @name notSync
49
- *
50
- * @synopsis
51
- * ```coffeescript [specscript]
52
- * notSync(func ...any=>boolean) -> negated ...any=>boolean
53
- * ```
54
- */
55
- const notSync = func => function notSync(...args) {
56
- return !func(...args)
57
- }
58
-
59
- /**
60
- * @name not.sync
61
- *
62
- * @synopsis
63
- * ```coffeescript [specscript]
64
- * var args ...any,
65
- * syncPredicate ...args=>boolean
66
- *
67
- * not.sync(syncPredicate)(...args) -> boolean
68
- * ```
69
- *
70
- * @description
71
- * `not` without promise handling.
72
- *
73
- * ```javascript [playground]
74
- * const isOdd = number => number % 2 == 1
75
- *
76
- * console.log(
77
- * not.sync(isOdd)(2),
78
- * ) // true
79
- * ```
80
- */
81
- not.sync = notSync
82
-
83
64
  module.exports = not
package/omit.js CHANGED
@@ -1,27 +1,40 @@
1
+ const isPromise = require('./_internal/isPromise')
1
2
  const deleteByPath = require('./_internal/deleteByPath')
2
3
  const copyDeep = require('./_internal/copyDeep')
4
+ const curry2 = require('./_internal/curry2')
5
+ const __ = require('./_internal/placeholder')
6
+
7
+ // _omit(source Object, paths Array<string>) -> result Object
8
+ const _omit = function (source, paths) {
9
+ const pathsLength = paths.length,
10
+ result = copyDeep(source)
11
+ let pathsIndex = -1
12
+ while (++pathsIndex < pathsLength) {
13
+ deleteByPath(result, paths[pathsIndex])
14
+ }
15
+ return result
16
+ }
3
17
 
4
18
  /**
5
19
  * @name omit
6
20
  *
7
21
  * @synopsis
8
22
  * ```coffeescript [specscript]
9
- * var paths Array<string>,
10
- * source Object
23
+ * omit(paths Array<string>)(source Object) -> omitted Object
11
24
  *
12
- * omit(paths)(source) -> omitted Object
25
+ * omit(source Object, paths Array<string>) -> omitted Object
13
26
  * ```
14
27
  *
15
28
  * @description
16
- * Create a new object by excluding specific paths on a source object.
29
+ * Create a new object by excluding provided paths on a source object.
17
30
  *
18
31
  * ```javascript [playground]
19
32
  * console.log(
20
- * omit(['_id'])({ _id: '1', name: 'George' }),
33
+ * omit({ _id: '1', name: 'George' }, ['_id']),
21
34
  * ) // { name: 'George' }
22
35
  * ```
23
36
  *
24
- * Path patterns are the same as those supported by `get`:
37
+ * `omit` supports three types of path patterns for nested property access
25
38
  *
26
39
  * * dot delimited - `'a.b.c'`
27
40
  * * bracket notation - `'a[0].value'`
@@ -39,15 +52,25 @@ const copyDeep = require('./_internal/copyDeep')
39
52
  * }),
40
53
  * ) // { a: { b: { c: 'hello' } } }
41
54
  * ```
55
+ *
56
+ * Compose `omit` inside a `pipe` with its tacit API
57
+ *
58
+ * ```javascript [playground]
59
+ * pipe({ a: 1, b: 2, c: 3 }, [
60
+ * map(number => number ** 2),
61
+ * omit(['a', 'b']),
62
+ * console.log, // { c: 9 }
63
+ * ])
64
+ * ```
42
65
  */
43
- const omit = paths => function omitting(source) {
44
- const pathsLength = paths.length,
45
- result = copyDeep(source)
46
- let pathsIndex = -1
47
- while (++pathsIndex < pathsLength) {
48
- deleteByPath(result, paths[pathsIndex])
66
+ const omit = function (arg0, arg1) {
67
+ if (arg1 == null) {
68
+ return curry2(_omit, __, arg0)
49
69
  }
50
- return result
70
+ if (isPromise(arg0)) {
71
+ return arg0.then(curry2(_omit, __, arg1))
72
+ }
73
+ return _omit(arg0, arg1)
51
74
  }
52
75
 
53
76
  module.exports = omit
package/or.js CHANGED
@@ -1,6 +1,10 @@
1
+ const promiseAll = require('./_internal/promiseAll')
1
2
  const isPromise = require('./_internal/isPromise')
2
- const curry3 = require('./_internal/curry3')
3
+ const areAnyValuesPromises = require('./_internal/areAnyValuesPromises')
3
4
  const __ = require('./_internal/placeholder')
5
+ const curry2 = require('./_internal/curry2')
6
+ const curry3 = require('./_internal/curry3')
7
+ const curryArgs2 = require('./_internal/curryArgs2')
4
8
  const thunkConditional = require('./_internal/thunkConditional')
5
9
  const areAllValuesNonfunctions = require('./_internal/areAllValuesNonfunctions')
6
10
  const thunkify2 = require('./_internal/thunkify2')
@@ -18,7 +22,7 @@ const always = require('./_internal/always')
18
22
  const areAnyNonfunctionsTruthy = function (predicates, index) {
19
23
  const length = predicates.length
20
24
  while (++index < length) {
21
- let predicate = predicates[index]
25
+ const predicate = predicates[index]
22
26
  if (isPromise(predicate)) {
23
27
  return predicate.then(curry3(
24
28
  thunkConditional,
@@ -40,20 +44,19 @@ const areAnyNonfunctionsTruthy = function (predicates, index) {
40
44
  * @synopsis
41
45
  * ```coffeescript [specscript]
42
46
  * asyncAreAnyPredicatesTruthy(
47
+ * args Array,
43
48
  * predicates Array<predicate function|nonfunction>,
44
- * point any,
45
49
  * index number,
46
50
  * ) -> allTruthy boolean
47
51
  * ```
48
52
  */
49
- const asyncAreAnyPredicatesTruthy = async function (predicates, point, index) {
53
+ const asyncAreAnyPredicatesTruthy = async function (args, predicates, index) {
50
54
  const length = predicates.length
51
55
  while (++index < length) {
52
56
  let predicate = predicates[index]
53
57
  if (typeof predicate == 'function') {
54
- predicate = predicate(point)
58
+ predicate = predicate(...args)
55
59
  }
56
- console.log('hey - or', predicate)
57
60
  if (isPromise(predicate)) {
58
61
  predicate = await predicate
59
62
  }
@@ -64,34 +67,65 @@ const asyncAreAnyPredicatesTruthy = async function (predicates, point, index) {
64
67
  return false
65
68
  }
66
69
 
70
+ // areAnyPredicatesTruthy(args Array, predicates Array<function>) -> Promise|boolean
71
+ const areAnyPredicatesTruthy = function (args, predicates) {
72
+ const length = predicates.length
73
+ let index = -1
74
+
75
+ while (++index < length) {
76
+ let predicate = predicates[index]
77
+ if (typeof predicate == 'function') {
78
+ predicate = predicate(...args)
79
+ }
80
+ if (isPromise(predicate)) {
81
+ return predicate.then(curry3(
82
+ thunkConditional,
83
+ __,
84
+ always(true),
85
+ thunkify3(asyncAreAnyPredicatesTruthy, args, predicates, index),
86
+ ))
87
+ }
88
+ if (predicate) {
89
+ return true
90
+ }
91
+ }
92
+ return false
93
+ }
94
+
67
95
  /**
68
96
  * @name or
69
97
  *
70
98
  * @synopsis
71
99
  * ```coffeescript [specscript]
72
- * or(
73
- * predicates Array<predicate function|nonfunction>,
74
- * )(point any) -> Promise|boolean
100
+ * or(values Array<boolean>) -> result boolean
101
+ *
102
+ * or(...args, predicatesOrValues Array<function|boolean>) -> Promise|boolean
103
+ *
104
+ * or(predicatesOrValues Array<function|boolean>)(...args) -> Promise|boolean
75
105
  * ```
76
106
  *
77
107
  * @description
78
- * Test an array of predicates serially against a single input, returning true if any of them test truthy.
108
+ * Tests an array of boolean values, returning true if any boolean values are truthy.
79
109
  *
80
110
  * ```javascript [playground]
81
- * const isOdd = number => number % 2 == 1
82
- *
83
- * const isEven = number => number % 2 == 0
111
+ * const oneIsLessThanZero = 1 < 0
112
+ * const oneIsGreaterThanTwo = 1 > 2
113
+ * const threeIsNotEqualToThree = 3 !== 3
84
114
  *
85
115
  * console.log(
86
- * or([isOdd, isEven])(0),
87
- * ) // true
116
+ * or([oneIsLessThanZero, oneIsGreaterThanTwo, threeIsNotEqualToThree]),
117
+ * ) // false
88
118
  * ```
89
119
  *
90
- * `or` behaves eagerly if provided only nonfunction values
120
+ * If any values in the array are synchronous or asynchronous predicate functions, `or` takes another argument to test concurrently against the predicate functions, returning true if any array values or resolved values from the predicates are truthy.
91
121
  *
92
122
  * ```javascript [playground]
123
+ * const isOdd = number => number % 2 == 1
124
+ *
125
+ * const isEven = number => number % 2 == 0
126
+ *
93
127
  * console.log(
94
- * or([false, false, true]),
128
+ * or([isOdd, isEven])(0),
95
129
  * ) // true
96
130
  * ```
97
131
  *
@@ -99,33 +133,22 @@ const asyncAreAnyPredicatesTruthy = async function (predicates, point, index) {
99
133
  *
100
134
  * @note ...args slows down here by an order of magnitude
101
135
  */
102
- const or = predicates => {
103
- if (areAllValuesNonfunctions(predicates)) {
104
- return areAnyNonfunctionsTruthy(predicates, -1)
136
+ const or = function (...args) {
137
+ const predicatesOrValues = args.pop()
138
+ if (areAllValuesNonfunctions(predicatesOrValues)) {
139
+ return areAnyNonfunctionsTruthy(predicatesOrValues, -1)
105
140
  }
106
- return function areAnyPredicatesTruthy(point) {
107
- const length = predicates.length
108
- let index = -1
109
141
 
110
- while (++index < length) {
111
- let predicate = predicates[index]
112
- if (typeof predicate == 'function') {
113
- predicate = predicate(point)
114
- }
115
- if (isPromise(predicate)) {
116
- return predicate.then(curry3(
117
- thunkConditional,
118
- __,
119
- always(true),
120
- thunkify3(asyncAreAnyPredicatesTruthy, predicates, point, index),
121
- ))
122
- }
123
- if (predicate) {
124
- return true
125
- }
126
- }
127
- return false
142
+ if (args.length == 0) {
143
+ return curryArgs2(areAnyPredicatesTruthy, __, predicatesOrValues)
128
144
  }
145
+
146
+ if (areAnyValuesPromises(args)) {
147
+ return promiseAll(args)
148
+ .then(curry2(areAnyPredicatesTruthy, __, predicatesOrValues))
149
+ }
150
+
151
+ return areAnyPredicatesTruthy(args, predicatesOrValues)
129
152
  }
130
153
 
131
154
  module.exports = or
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rubico",
3
- "version": "1.9.6",
3
+ "version": "2.0.0",
4
4
  "description": "[a]synchronous functional programming",
5
5
  "author": "Richard Tong",
6
6
  "license": "MIT",
@@ -33,23 +33,23 @@
33
33
  "operator"
34
34
  ],
35
35
  "devDependencies": {
36
+ "async": "^3.2.4",
36
37
  "bluebird": "^3.7.2",
37
38
  "codecov": "^3.7.1",
38
39
  "eslint": "^8.4.1",
39
40
  "fantasy-land": "^4.1.0",
40
- "lodash": "^4.17.19",
41
+ "lodash": "^4.17.21",
41
42
  "mocha": "^7.2.0",
42
43
  "node-fetch": "^2.6.1",
43
44
  "nyc": "^15.1.0",
44
- "ramda": "^0.27.1",
45
+ "ramda": "^0.29.0",
45
46
  "terser": "^5.10.0",
46
47
  "thunk-test": "latest"
47
48
  },
48
49
  "scripts": {
49
- "test": "mocha test.js x/*.test.js monad/*.test.js",
50
+ "test": "mocha test.js *.test.js */**.test.js",
50
51
  "test-coverage": "nyc mocha test.js x/*.test.js monad/*.test.js",
51
- "lint": "eslint _internal rubico.js x monad",
52
- "lint-fix": "eslint --fix _internal rubico.js x monad",
53
- "build": "node distributor.js"
52
+ "lint": "eslint .",
53
+ "build": "./build"
54
54
  }
55
55
  }
package/pick.js CHANGED
@@ -1,46 +1,76 @@
1
+ const isPromise = require('./_internal/isPromise')
1
2
  const getByPath = require('./_internal/getByPath')
2
3
  const setByPath = require('./_internal/setByPath')
4
+ const curry2 = require('./_internal/curry2')
5
+ const __ = require('./_internal/placeholder')
6
+
7
+ // _pick(source Object, keys Array<string>) -> result Object
8
+ const _pick = function (source, keys) {
9
+ if (source == null) {
10
+ return source
11
+ }
12
+ const keysLength = keys.length
13
+ let result = {}
14
+ let keysIndex = -1
15
+ while (++keysIndex < keysLength) {
16
+ const key = keys[keysIndex],
17
+ value = getByPath(source, key)
18
+ if (value != null) {
19
+ result = setByPath(result, value, key)
20
+ }
21
+ }
22
+ return result
23
+ }
3
24
 
4
25
  /**
5
26
  * @name pick
6
27
  *
7
28
  * @synopsis
8
29
  * ```coffeescript [specscript]
9
- * var keys Array<string>,
10
- * source Object
30
+ * pick(object Object, keys Array<string>) -> result Object
11
31
  *
12
- * pick(keys)(source) -> picked Object
32
+ * pick(keys Array<string>)(object Object) -> result Object
13
33
  * ```
14
34
  *
15
35
  * @description
16
- * Create a new object by including specific keys.
36
+ * Creates a new object from a source object by selecting provided keys. If a provided key does not exist on the source object, excludes it from the resulting object.
17
37
  *
18
38
  * ```javascript [playground]
19
39
  * console.log(
20
- * pick(['hello', 'world'])({ goodbye: 1, world: 2 }),
40
+ * pick({ goodbye: 1, world: 2 }, ['hello', 'world']),
21
41
  * ) // { world: 2 }
42
+ * ```
22
43
  *
23
- * console.log(
24
- * pick(['a.b.c.d'])({ a: { b: { c: { d: 1, e: [2, 3] } } } }),
25
- * ) // { a: { b: { c: { d: 1 } } } }
44
+ * `pick` supports three types of path patterns for nested property access
45
+ *
46
+ * * dot delimited - `'a.b.c'`
47
+ * * bracket notation - `'a[0].value'`
48
+ * * an array of keys or indices - `['a', 0, 'value']`
49
+ *
50
+ * ```javascript [playground]
51
+ * const nested = { a: { b: { c: { d: 1, e: [2, 3] } } } }
52
+ *
53
+ * console.log(pick(['a.b.c.d'])(nested)) // { a: { b: { c: { d: 1 } } } }
54
+ * ```
55
+ *
56
+ * Compose `pick` inside a `pipe` with its tacit API.
57
+ *
58
+ * ```javascript [playground]
59
+ * pipe({ a: 1, b: 2, c: 3 }, [
60
+ * map(number => number ** 2),
61
+ * pick(['a', 'c']),
62
+ * console.log, // { a: 1, c: 9 }
63
+ * ])
26
64
  * ```
27
65
  */
28
-
29
- const pick = keys => function picking(source) {
30
- if (source == null) {
31
- return source
66
+ const pick = function (arg0, arg1) {
67
+ if (arg1 == null) {
68
+ return curry2(_pick, __, arg0)
32
69
  }
33
- const keysLength = keys.length
34
- let result = {}
35
- let keysIndex = -1
36
- while (++keysIndex < keysLength) {
37
- const key = keys[keysIndex],
38
- value = getByPath(source, key)
39
- if (value != null) {
40
- result = setByPath(result, value, key)
41
- }
70
+ if (isPromise(arg0)) {
71
+ return arg0.then(curry2(_pick, __, arg1))
42
72
  }
43
- return result
73
+ return _pick(arg0, arg1)
44
74
  }
45
75
 
46
76
  module.exports = pick
package/pipe.js CHANGED
@@ -1,66 +1,42 @@
1
- const noop = require('./_internal/noop')
1
+ const areAnyValuesPromises = require('./_internal/areAnyValuesPromises')
2
+ const promiseAll = require('./_internal/promiseAll')
2
3
  const funcConcat = require('./_internal/funcConcat')
3
- const funcConcatSync = require('./_internal/funcConcatSync')
4
- const isGeneratorFunction = require('./_internal/isGeneratorFunction')
5
- const isAsyncGeneratorFunction = require('./_internal/isAsyncGeneratorFunction')
4
+ const funcApply = require('./_internal/funcApply')
5
+ const curry2 = require('./_internal/curry2')
6
+ const __ = require('./_internal/placeholder')
6
7
 
7
8
  /**
8
9
  * @name pipe
9
10
  *
10
11
  * @synopsis
11
12
  * ```coffeescript [specscript]
12
- * Reducer<T> = (any, T)=>Promise|any
13
+ * pipe(funcs Array<function>)(...args) -> result Promise|any
13
14
  *
14
- * var args ...any,
15
- * funcs [
16
- * ...args=>Promise|any,
17
- * ...Array<any=>Promise|any>,
18
- * ],
19
- * transducers Array<Reducer=>Reducer>
20
- * reducer Reducer,
21
- *
22
- * pipe(funcs)(...args) -> Promise|any
23
- *
24
- * pipe(transducers)(reducer) -> Reducer
15
+ * pipe(...args, funcs Array<function>) -> result Promise|any
25
16
  * ```
26
17
  *
27
18
  * @description
28
- * Create a function pipeline, where each function passes its return value as a single argument to the next function until all functions have executed. The result of a pipeline execution is the return of its last function.
19
+ * Creates a function pipeline from an array of functions, where each function passes its return value as a single argument to the next function until all functions have executed. The first function is called with the arguments to the pipeline, while the result of the pipeline execution is the return of its last function. If any function of the pipeline is asynchronous, the result of the execution is a Promise.
29
20
  *
30
21
  * ```javascript [playground]
31
- * console.log(
32
- * pipe([
33
- * number => number + 1,
34
- * number => number + 2,
35
- * number => number + 3,
36
- * ])(5),
37
- * ) // 11
38
- * ```
39
- *
40
- * In order to create pipelines of transducers that read left to right, `pipe` chains the functions (assuming they are transducers) in reverse when passed a reducer in argument position. This results in a reducer with chained functionality. For more information on this behavior, see [this blog post on transducers](https://rubico.land/blog/2020/10/02/transducers-crash-course).
41
- *
42
- * ```javascript [playground]
43
- * const isOdd = number => number % 2 == 1
44
- *
45
- * const square = number => number ** 2
22
+ * const syncAdd123 = pipe([
23
+ * number => number + 1,
24
+ * number => number + 2,
25
+ * number => number + 3,
26
+ * ])
46
27
  *
47
- * const add = (a, b) => a + b
28
+ * console.log(syncAdd123(5)) // 11
48
29
  *
49
- * const squaredOdds = pipe([
50
- * filter(isOdd),
51
- * map(square),
30
+ * const asyncAdd123 = pipe([
31
+ * async number => number + 1,
32
+ * async number => number + 2,
33
+ * async number => number + 3,
52
34
  * ])
53
35
  *
54
- * console.log(
55
- * [1, 2, 3, 4, 5].reduce(squaredOdds(add), 0),
56
- * ) // 35
57
- *
58
- * console.log(
59
- * squaredOdds([1, 2, 3, 4, 5])
60
- * ) // [1, 9, 25]
36
+ * asyncAdd123(5).then(console.log) // 11
61
37
  * ```
62
38
  *
63
- * For the sake of a sane API, pipe behaves eagerly when passed any amount of arguments before the array of functions.
39
+ * When passed any amount of arguments before the array of functions, `pipe` executes eagerly; the array of functions is immediately invoked with the supplied arguments.
64
40
  *
65
41
  * ```javascript [playground]
66
42
  * pipe(1, 2, 3, [
@@ -78,58 +54,17 @@ const isAsyncGeneratorFunction = require('./_internal/isAsyncGeneratorFunction')
78
54
  */
79
55
  const pipe = function (...args) {
80
56
  const funcs = args.pop()
57
+ const pipeline = funcs.reduce(funcConcat)
81
58
 
82
- if (args.length > 0) {
83
- return funcs.reduce(funcConcat)(...args)
59
+ if (args.length == 0) {
60
+ return pipeline
84
61
  }
85
62
 
86
- let functionPipeline = noop,
87
- functionComposition = noop
88
- return function pipeline(...args) {
89
- const firstArg = args[0]
90
-
91
- if (
92
- typeof firstArg == 'function'
93
- && !isGeneratorFunction(firstArg)
94
- && !isAsyncGeneratorFunction(firstArg)
95
- ) {
96
- if (functionComposition == noop) {
97
- functionComposition = funcs.reduceRight(funcConcat)
98
- }
99
- return functionComposition(firstArg)
100
- }
101
-
102
- if (functionPipeline == noop) {
103
- functionPipeline = funcs.reduce(funcConcat)
104
- }
105
- return functionPipeline(...args)
63
+ if (areAnyValuesPromises(args)) {
64
+ return promiseAll(args).then(curry2(funcApply, pipeline, __))
106
65
  }
107
- }
108
-
109
- // funcs Array<function> -> pipeline function
110
- const pipeSync = funcs => funcs.reduce(funcConcatSync)
111
66
 
112
- /**
113
- * @name pipe.sync
114
- *
115
- * @synopsis
116
- * ```coffeescript [specscript]
117
- * var args ...any,
118
- * funcs [...args=>any, ...Array<any=>any>]
119
- *
120
- * pipe.sync(funcs) -> syncPipeline ...args=>any
121
- * ```
122
- *
123
- * @description
124
- * `pipe` that doesn't automatically resolve promises. This variant is a good option if more performance is desired or if manual promise handling is required.
125
- *
126
- * ```javascript [playground]
127
- * pipe.sync([
128
- * value => Promise.resolve(value),
129
- * promise => promise.then(console.log)
130
- * ])('hey') // hey
131
- * ```
132
- */
133
- pipe.sync = pipeSync
67
+ return pipeline(...args)
68
+ }
134
69
 
135
70
  module.exports = pipe