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/reduce.js CHANGED
@@ -1,173 +1,172 @@
1
1
  const isPromise = require('./_internal/isPromise')
2
2
  const __ = require('./_internal/placeholder')
3
3
  const curry3 = require('./_internal/curry3')
4
- const curryArgs3 = require('./_internal/curryArgs3')
5
4
  const genericReduce = require('./_internal/genericReduce')
6
5
 
6
+ // _reduce(collection any, reducer function, initialValue function|any) -> Promise
7
+ const _reduce = function (collection, reducer, initialValue) {
8
+ if (typeof initialValue == 'function') {
9
+ const actualInitialValue = initialValue(collection)
10
+ return isPromise(actualInitialValue)
11
+ ? actualInitialValue.then(curry3(genericReduce, collection, reducer, __))
12
+ : genericReduce(collection, reducer, actualInitialValue)
13
+ }
14
+ return isPromise(initialValue)
15
+ ? initialValue.then(curry3(genericReduce, collection, reducer, __))
16
+ : genericReduce(collection, reducer, initialValue)
17
+ }
18
+
7
19
  /**
8
20
  * @name reduce
9
21
  *
10
22
  * @synopsis
11
23
  * ```coffeescript [specscript]
12
- * reduce(
13
- * arrayReducer (result any, value any, index number, array Array)=>Promise|any,
14
- * initialValue? (array=>Promise|any)|any,
15
- * )(array) -> Promise|result
16
- *
17
- * reduce(
18
- * objectReducer (result any, value any, key string, object Object)=>Promise|any,
19
- * initialValue? (object=>Promise|any)|any,
20
- * )(object) -> Promise|result
21
- *
22
- * reduce(
23
- * mapReducer (result any, value any, key any, map Map)=>Promise|any,
24
- * initialValue? (map=>Promise|any)|any,
25
- * )(map) -> Promise|result
26
- *
27
- * Foldable = Iterable|AsyncIterable|{ reduce: (reducer, result?)=>any }
28
- *
29
- * reduce(
30
- * reducer (result any, value any)=>Promise|any,
31
- * initialValue? ((foldable Foldable)=>Promise|any)|any,
32
- * )(foldable) -> Promise|result
24
+ * type Foldable = Array|Object|Map|Iterator|AsyncIterator
25
+ * type Reducer = (
26
+ * accumulator any,
27
+ * value any,
28
+ * indexOrKey? number|string,
29
+ * collection? Foldable,
30
+ * )=>(nextAccumulator Promise|any)
33
31
  *
34
32
  * reduce(
35
- * reducer (result any, value any)=>Promise|any,
36
- * initialValue? (()=>Promise|any)|any,
37
- * )(generatorFunction) -> reducingGeneratorValuesFunction (...generatorFunctionArgs)=>Promise|any
33
+ * collection Foldable,
34
+ * reducer Reducer,
35
+ * initialValue? function|any
36
+ * ) -> result Promise|any
38
37
  *
39
38
  * reduce(
40
- * reducer (result any, value any)=>Promise|any,
41
- * initialValue? (()=>Promise|any)|any,
42
- * )(asyncGeneratorFunction) -> reducingAsyncGeneratorValuesFunction (...asyncGeneratorFunctionArgs)=>Promise|any
43
- *
44
- * reduce(reducer, initialValue?)(...moreReducers) -> ...args=>Promise|any
39
+ * reducer Reducer,
40
+ * initialValue? function|any
41
+ * )(collection Foldable) -> result Promise|any
45
42
  * ```
46
43
  *
47
44
  * @description
48
- * Execute a reducer for each item of a collection, returning a single output value.
45
+ * Transforms a collection based on a reducer function and optional initial value. In a reducing operation, the result is defined in the beginning as either the initial value if supplied or the first item of the collection. The reducing operation then iterates through the remaining items in the collection, executing the reducer at each iteration to return the result to be used in the next iteration. The final result is the result of the execution of the reducer at the last item of the iteration. `reduce` accepts the following collections:
46
+ *
47
+ * * `Array`
48
+ * * `Object`
49
+ * * `Set`
50
+ * * `Map`
51
+ * * `Iterator`/`Generator`
52
+ * * `AsyncIterator`/`AsyncGenerator`
53
+ *
54
+ * For arrays (type `Array`), `reduce` executes the reducer function for each item of the array in order, returning a new result at each execution to be used in the next execution. On each iteration, the reducer is passed the accumulator, the item of the iteration, the index of the item in the array, and a reference to the original array.
49
55
  *
50
56
  * ```javascript [playground]
51
57
  * const max = (a, b) => a > b ? a : b
52
58
  *
53
59
  * console.log(
54
- * reduce(max)([1, 3, 5, 4, 2]),
60
+ * reduce([1, 3, 5, 4, 2], max)
61
+ * ) // 5
62
+ *
63
+ * console.log(
64
+ * reduce(max)([1, 3, 5, 4, 2])
55
65
  * ) // 5
56
66
  * ```
57
67
  *
58
- * If an optional initialization parameter is supplied, the result starts as that parameter rather than the first item of the collection. For memory and performance, this library makes no assumptions about immutability. Handle references for this initial value with care, as they could be mutated.
68
+ * If an optional initial value is provided, the result starts as the provided initial value rather than the first item of the collection.
59
69
  *
60
70
  * ```javascript [playground]
61
71
  * const add = (a, b) => a + b
62
72
  *
63
- * console.log(
64
- * reduce(add)([1, 2, 3, 4, 5], 0),
65
- * ) // 15
73
+ * console.log(reduce([1, 2, 3, 4, 5], add, 0)) // 15
74
+ * console.log(reduce(add, 0)([1, 2, 3, 4, 5])) // 15
66
75
  * ```
67
76
  *
68
- * If the initialization parameter is a function, it is treated as a resolver and called with the input arguments to resolve an initial value for the accumulator at execution time.
77
+ * If the initialization parameter is a function, it is treated as a resolver and called with the arguments to resolve the initial value.
69
78
  *
70
79
  * ```javascript [playground]
71
80
  * const concatSquares = (array, value) => array.concat(value ** 2)
72
81
  *
73
- * const initEmptyArray = () => []
82
+ * const contrivedInitializer = array => [`initial length ${array.length}`]
83
+ *
84
+ * const array = [1, 2, 3, 4, 5]
85
+ *
86
+ * console.log(reduce(concatSquares, contrivedInitializer)(array))
87
+ * // ['initial length 5', 1, 4, 9, 16, 25]
88
+ * console.log(reduce(array, concatSquares, contrivedInitializer))
89
+ * // ['initial length 5', 1, 4, 9, 16, 25]
90
+ * ```
91
+ *
92
+ * For objects (type `Object`), `reduce` executes the reducer function for each value of the object. On each iteration, the reducer is passed the accumulator, the object value, the key of the object value, and a reference to the original object.
93
+ *
94
+ * ```javascript [playground]
95
+ * const add = (a, b) => a + b
96
+ *
97
+ * const obj = { a: 1, b: 2, c: 3, d: 4, e: 5 }
98
+ *
99
+ * console.log(
100
+ * reduce(obj, add)
101
+ * ) // 15
74
102
  *
75
103
  * console.log(
76
- * reduce(concatSquares, initEmptyArray)([1, 2, 3, 4, 5]),
77
- * ) // [1, 4, 9, 16, 25]
104
+ * reduce(add)(obj)
105
+ * ) // 15
78
106
  * ```
79
107
  *
80
- * Fully asynchronous reducing operations are possible with asynchronous reducers and asynchronous data streams.
108
+ * For sets (type `Set`), `reduce` executes the reducer function for each item of the set. On each iteration, the reducer is passed the accumulator and item of the set.
81
109
  *
82
110
  * ```javascript [playground]
83
- * const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
84
- *
85
- * // asyncAppReducer(
86
- * // state { todos: Array },
87
- * // action { type: string, todoID: string },
88
- * // ) -> state
89
- * const asyncAppReducer = async function (state, action) {
90
- * if (action.type == 'FETCH_TODO') {
91
- * const todo = await fetch(
92
- * 'https://jsonplaceholder.typicode.com/todos/' + action.todoID,
93
- * ).then(response => response.json())
94
- * console.log('fetched', todo)
95
- * state.todos.push(todo)
96
- * return state
97
- * }
98
- * return state
99
- * }
111
+ * const add = (a, b) => a + b
100
112
  *
101
- * const asyncFetchActions = async function* (count) {
102
- * let idCount = 0
103
- * while (++idCount <= count) {
104
- * await sleep(1000)
105
- * yield { type: 'FETCH_TODO', todoID: idCount }
106
- * }
107
- * }
113
+ * const set = new Set([1, 2, 3, 4, 5])
108
114
  *
109
- * const state = { todos: [] }
110
- *
111
- * reduce(asyncAppReducer, state)(asyncFetchActions(5))
112
- * .then(reducedState => console.log('finalState', reducedState))
113
- *
114
- * // fetched { userId: 1, id: 1, title: 'delectus aut autem', completed: false }
115
- * // fetched { userId: 1, id: 2, title: 'quis ut nam facilis...', completed: false }
116
- * // fetched { userId: 1, id: 3, title: 'fugiat veniam minus', completed: false }
117
- * // fetched { userId: 1, id: 4, title: 'et porro tempora', completed: true }
118
- * // fetched { userId: 1, id: 5, title: 'laboriosam mollitia...', completed: false }
119
- * // finalState {
120
- * // todos: [
121
- * // { userId: 1, id: 1, title: 'delectus aut autem', completed: false },
122
- * // { userId: 1, id: 2, title: 'quis ut nam facilis...', completed: false },
123
- * // { userId: 1, id: 3, title: 'fugiat veniam minus', completed: false },
124
- * // { userId: 1, id: 4, title: 'et porro tempora', completed: true },
125
- * // { userId: 1, id: 5, title: 'laboriosam mollitia...', completed: false },
126
- * // ],
127
- * // }
115
+ * console.log(
116
+ * reduce(set, add)
117
+ * ) // 15
118
+ *
119
+ * console.log(
120
+ * reduce(add)(set)
121
+ * ) // 15
128
122
  * ```
129
123
  *
130
- * If the first argument to a reducing function is a reducer, `reduce` concatenates any reducers in argument position onto the initial reducer, producing a combined reducer that performs a chained operation per each item in a reducing operation.
124
+ * For maps (type `Map`), `reduce` executes the reducer function for each value of each entry of the map. On each iteration, the reducer is passed the accumulator, the map item, the key of the map item, and a reference to the original map.
131
125
  *
132
126
  * ```javascript [playground]
133
- * const reducerA = (state, action) => {
134
- * if (action.type == 'A') return { ...state, A: true }
135
- * return state
136
- * }
127
+ * const add = (a, b) => a + b
137
128
  *
138
- * const reducerB = (state, action) => {
139
- * if (action.type == 'B') return { ...state, B: true }
140
- * return state
141
- * }
129
+ * const m = new Map([['a', 1], ['b', 2], ['c', 3], ['d', 4], ['e', 5]])
142
130
  *
143
- * const reducerC = (state, action) => {
144
- * if (action.type == 'C') return { ...state, C: true }
145
- * return state
146
- * }
131
+ * console.log(
132
+ * reduce(m, add)
133
+ * ) // 15
147
134
  *
148
- * // state => state
149
- * const traceMiddleware = tap(
150
- * (state, action) => console.log('state, action', state, action))
135
+ * console.log(
136
+ * reduce(add)(m)
137
+ * ) // 15
138
+ * ```
151
139
  *
152
- * const reducingABC = reduce(
153
- * traceMiddleware, () => ({}))(reducerA, reducerB, reducerC)
140
+ * For iterators (type `Iterator`) and generators (type `Generator`), `reduce` executes the reducer function for each value of the iterator/generator. On each iteration, the reducer is passed the accumulator and the item of the iteration. The iterator/generator is consumed in the process.
141
+ *
142
+ * ```javascript [playground]
143
+ * const add = (a, b) => a + b
154
144
  *
155
- * const actions = [{ type: 'A' }, { type: 'B' }, { type: 'C' }]
145
+ * const generate12345 = function* () {
146
+ * yield 1; yield 2; yield 3; yield 4; yield 5
147
+ * }
156
148
  *
157
149
  * console.log(
158
- * 'final state:',
159
- * reducingABC(actions),
160
- * ) // { A: true, B: true, C: true }
150
+ * reduce(generate12345(), add)
151
+ * ) // 15
152
+ *
153
+ * console.log(
154
+ * reduce(add)(generate12345())
155
+ * ) // 15
161
156
  * ```
162
157
  *
163
- * `reduce`, when passed a single non-function argument before the reducer function, treats that argument as the value to be reduced.
158
+ * For asyncIterators (type `AsyncIterator`) and asyncGenerators (type `AsyncGenerator`), `reduce` executes the reducer function for each value of the asyncIterator/asyncGenerator. On each iteration, the reducer is passed the accumulator and the item of the async iteration. The asyncIterator/asyncGenerator is consumed in the process.
164
159
  *
165
160
  * ```javascript [playground]
166
- * const numbers = [1, 2, 3, 4, 5]
161
+ * const asyncAdd = async (a, b) => a + b
162
+ *
163
+ * const asyncGenerate12345 = async function* () {
164
+ * yield 1; yield 2; yield 3; yield 4; yield 5
165
+ * }
167
166
  *
168
- * const sum = reduce(numbers, (a, b) => a + b)
167
+ * reduce(asyncGenerate12345(), asyncAdd).then(console.log) // 15
169
168
  *
170
- * assert.equal(sum, 15)
169
+ * reduce(asyncAdd)(asyncGenerate12345()).then(console.log) // 15
171
170
  * ```
172
171
  *
173
172
  * @execution series
@@ -180,27 +179,13 @@ const genericReduce = require('./_internal/genericReduce')
180
179
  */
181
180
 
182
181
  const reduce = function (...args) {
183
- if (typeof args[0] != 'function') {
184
- const reducer = args[1]
185
- const initialValue = args[2]
186
- if (typeof initialValue == 'function') {
187
- return genericReduce([args[0]], reducer, initialValue(args[0]))
188
- }
189
- return genericReduce([args[0]], reducer, initialValue)
182
+ if (typeof args[0] == 'function') {
183
+ return curry3(_reduce, __, args[0], args[1])
190
184
  }
191
-
192
- const reducer = args[0]
193
- const initialValue = args[1]
194
-
195
- if (typeof initialValue == 'function') {
196
- return function reducing(...args) {
197
- const result = initialValue(...args)
198
- return isPromise(result)
199
- ? result.then(curry3(genericReduce, args, reducer, __))
200
- : genericReduce(args, reducer, result)
201
- }
185
+ if (isPromise(args[0])) {
186
+ return args[0].then(curry3(_reduce, __, args[1], args[2]))
202
187
  }
203
- return curryArgs3(genericReduce, __, reducer, initialValue)
188
+ return _reduce(args[0], args[1], args[2])
204
189
  }
205
190
 
206
191
  module.exports = reduce
package/rubico.js CHANGED
@@ -1,7 +1,8 @@
1
1
  const pipe = require('./pipe')
2
- const fork = require('./fork')
3
- const assign = require('./assign')
2
+ const compose = require('./compose')
4
3
  const tap = require('./tap')
4
+ const all = require('./all')
5
+ const assign = require('./assign')
5
6
  const tryCatch = require('./tryCatch')
6
7
  const switchCase = require('./switchCase')
7
8
  const map = require('./map')
@@ -9,8 +10,9 @@ const filter = require('./filter')
9
10
  const reduce = require('./reduce')
10
11
  const transform = require('./transform')
11
12
  const flatMap = require('./flatMap')
12
- const any = require('./any')
13
- const all = require('./all')
13
+ const forEach = require('./forEach')
14
+ const some = require('./some')
15
+ const every = require('./every')
14
16
  const and = require('./and')
15
17
  const or = require('./or')
16
18
  const not = require('./not')
@@ -42,11 +44,11 @@ const __ = require('./__')
42
44
  */
43
45
 
44
46
  const rubico = {
45
- pipe, tap,
47
+ pipe, compose, tap,
46
48
  switchCase, tryCatch,
47
- fork, assign, get, set, pick, omit,
48
- map, filter, reduce, transform, flatMap,
49
- and, or, not, any, all,
49
+ all, assign, get, set, pick, omit,
50
+ map, filter, flatMap, forEach, reduce, transform,
51
+ and, or, not, some, every,
50
52
  eq, gt, lt, gte, lte,
51
53
  thunkify, always,
52
54
  curry, __,
package/set.js CHANGED
@@ -3,36 +3,75 @@ const setByPath = require('./_internal/setByPath')
3
3
  const curry3 = require('./_internal/curry3')
4
4
  const __ = require('./_internal/placeholder')
5
5
 
6
+ /**
7
+ * @name _set
8
+ *
9
+ * @synopsis
10
+ * ```coffeescript [specscript]
11
+ * _set(
12
+ * obj Object,
13
+ * path string|Array<string|number>,
14
+ * value function|any,
15
+ * ) -> result Promise|Object
16
+ * ```
17
+ */
18
+ const _set = function (obj, path, value) {
19
+ if (typeof value == 'function') {
20
+ const actualValue = value(obj)
21
+ if (isPromise(actualValue)) {
22
+ return actualValue.then(
23
+ curry3(setByPath, obj, __, path)
24
+ )
25
+ }
26
+ return setByPath(obj, actualValue, path)
27
+ }
28
+ if (isPromise(value)) {
29
+ return value.then(
30
+ curry3(setByPath, obj, __, path)
31
+ )
32
+ }
33
+ return setByPath(obj, value, path)
34
+ }
35
+
6
36
  /**
7
37
  * @name set
8
38
  *
9
39
  * @synopsis
10
40
  * ```coffeescript [specscript]
11
- * var value any,
41
+ * set(
42
+ * object Object,
12
43
  * path string|Array<string|number>,
13
- * value (value=>any)|any
44
+ * value function|any,
45
+ * ) -> result Promise|Object
14
46
  *
15
- * set(path, value) -> setter object=>object
47
+ * set(
48
+ * path string|Array<string|number>,
49
+ * value function|any,
50
+ * )(object Object) -> result Promise|Object
16
51
  * ```
17
52
  *
18
53
  * @description
19
- * Create a setter that sets a property on an object denoted by path.
54
+ * Sets a property on a new object shallow cloned from the argument object given a path denoted by a string, number, or an array of string or numbers.
55
+ *
56
+ * `set` supports three types of path patterns for nested property access.
57
+ *
58
+ * * dot delimited - `'a.b.c'`
59
+ * * bracket notation - `'a[0].value'`
60
+ * * an array of keys or indices - `['a', 0, 'value']`
20
61
  *
21
62
  * ```javascript [playground]
22
- * console.log(
23
- * set('a', 1)({ b: 2 })
24
- * ) // { a: 1, b: 2 }
63
+ * console.log(set('a', 1)({ b: 2 })) // { a: 1, b: 2 }
25
64
  *
26
- * console.log(
27
- * set('a.b', 1)({ a: { c: 2 } }),
28
- * ) // { a : { b: 1, c: 2 }}
65
+ * const nestedAC2 = { a: { c: 2 } }
29
66
  *
30
- * console.log(
31
- * set('a[0].b.c', 4)({ a: [{ b: { c: 3 } }] }),
32
- * ) // { a: [{ b: { c: 4 } }] }
67
+ * console.log(set('a.b', 1)(nestedAC2)) // { a : { b: 1, c: 2 }}
68
+ *
69
+ * const nestedA0BC3 = { a: [{ b: { c: 3 } }] }
70
+ *
71
+ * console.log(set('a[0].b.c', 4)(nestedA0BC3)) // { a: [{ b: { c: 4 } }] }
33
72
  * ```
34
73
  *
35
- * The property value may be a function, in which case it is treated as a resolver and passed the argument object to resolve the value to set.
74
+ * The property value may be a function, in which case it is treated as a resolver and provided the argument object to resolve the value to set.
36
75
  *
37
76
  * ```javascript [playground]
38
77
  * const myObj = { a: 1 }
@@ -45,17 +84,14 @@ const __ = require('./_internal/placeholder')
45
84
  * @since 1.7.0
46
85
  */
47
86
 
48
- const set = (path, value) => function setter(obj) {
49
- if (typeof value == 'function') {
50
- const actualValue = value(obj)
51
- if (isPromise(actualValue)) {
52
- return actualValue.then(
53
- curry3(setByPath, obj, __, path)
54
- )
55
- }
56
- return setByPath(obj, actualValue, path)
87
+ const set = function (arg0, arg1, arg2) {
88
+ if (arg2 == null) {
89
+ return curry3(_set, __, arg0, arg1)
57
90
  }
58
- return setByPath(obj, value, path)
91
+ if (isPromise(arg0)) {
92
+ return arg0.then(curry3(_set, __, arg1, arg2))
93
+ }
94
+ return _set(arg0, arg1, arg2)
59
95
  }
60
96
 
61
97
  module.exports = set
package/some.js ADDED
@@ -0,0 +1,105 @@
1
+ const isPromise = require('./_internal/isPromise')
2
+ const __ = require('./_internal/placeholder')
3
+ const curry2 = require('./_internal/curry2')
4
+ const isArray = require('./_internal/isArray')
5
+ const objectValues = require('./_internal/objectValues')
6
+ const arraySome = require('./_internal/arraySome')
7
+ const iteratorSome = require('./_internal/iteratorSome')
8
+ const asyncIteratorSome = require('./_internal/asyncIteratorSome')
9
+ const reducerSome = require('./_internal/reducerSome')
10
+ const symbolIterator = require('./_internal/symbolIterator')
11
+ const symbolAsyncIterator = require('./_internal/symbolAsyncIterator')
12
+
13
+ // _some(collection Array|Iterable|AsyncIterable|{ reduce: function }|Object, predicate function) -> Promise|boolean
14
+ const _some = function (collection, predicate) {
15
+ if (isArray(collection)) {
16
+ return arraySome(collection, predicate)
17
+ }
18
+ if (collection == null) {
19
+ return predicate(collection)
20
+ }
21
+ if (typeof collection[symbolIterator] == 'function') {
22
+ return iteratorSome(collection[symbolIterator](), predicate)
23
+ }
24
+ if (typeof collection[symbolAsyncIterator] == 'function') {
25
+ return asyncIteratorSome(
26
+ collection[symbolAsyncIterator](), predicate, new Set()
27
+ )
28
+ }
29
+ if (typeof collection.reduce == 'function') {
30
+ return collection.reduce(reducerSome(predicate), false)
31
+ }
32
+ if (collection.constructor == Object) {
33
+ return arraySome(objectValues(collection), predicate)
34
+ }
35
+ return predicate(collection)
36
+ }
37
+
38
+ /**
39
+ * @name some
40
+ *
41
+ * @synopsis
42
+ * ```coffeescript [specscript]
43
+ * type Foldable = Array|Iterable|AsyncIterable|{ reduce: function }|Object
44
+ *
45
+ * some(collection Foldable, predicate function) -> Promise|boolean
46
+ *
47
+ * some(predicate function)(collection Foldable) -> Promise|boolean
48
+ * ```
49
+ *
50
+ * @description
51
+ * Test a predicate concurrently across all items of a collection, returning true if any executions return truthy.
52
+ *
53
+ * ```javascript [playground]
54
+ * const isOdd = number => number % 2 == 1
55
+ *
56
+ * console.log(
57
+ * some([1, 2, 3, 4, 5], isOdd),
58
+ * ) // true
59
+ * ```
60
+ *
61
+ * The collection can be any iterable, async iterable, or object values iterable collection. Below is an example of `some` accepting an async generator as the collection.
62
+ *
63
+ * ```javascript [playground]
64
+ * const toTodosUrl = id => 'https://jsonplaceholder.typicode.com/todos/' + id
65
+ *
66
+ * const fetchedToJson = fetched => fetched.json()
67
+ *
68
+ * const fetchTodo = pipe([
69
+ * toTodosUrl,
70
+ * fetch,
71
+ * fetchedToJson,
72
+ * ])
73
+ *
74
+ * const todoIDsGenerator = async function* () {
75
+ * yield 1; yield 2; yield 3; yield 4; yield 5
76
+ * }
77
+ *
78
+ * some(pipe([
79
+ * fetchTodo,
80
+ * todo => todo.title.startsWith('fugiat'),
81
+ * ]))(todoIDsGenerator()).then(console.log) // true
82
+ * ```
83
+ *
84
+ * @execution concurrent
85
+ *
86
+ * @muxing
87
+ *
88
+ * @related or
89
+ */
90
+
91
+ const some = function (...args) {
92
+ const predicate = args.pop()
93
+ if (args.length == 0) {
94
+ return curry2(_some, __, predicate)
95
+ }
96
+
97
+ const collection = args[0]
98
+ if (isPromise(collection)) {
99
+ return collection.then(curry2(_some, __, predicate))
100
+ }
101
+
102
+ return _some(collection, predicate)
103
+ }
104
+
105
+ module.exports = some
package/switchCase.js CHANGED
@@ -1,27 +1,26 @@
1
+ const promiseAll = require('./_internal/promiseAll')
2
+ const areAnyValuesPromises = require('./_internal/areAnyValuesPromises')
1
3
  const arrayConditional = require('./_internal/arrayConditional')
2
4
  const areAllValuesNonfunctions = require('./_internal/areAllValuesNonfunctions')
3
5
  const nonfunctionsConditional = require('./_internal/nonfunctionsConditional')
6
+ const __ = require('./_internal/placeholder')
7
+ const curry3 = require('./_internal/curry3')
8
+ const curryArgs3 = require('./_internal/curryArgs3')
4
9
 
5
10
  /**
6
11
  * @name switchCase
7
12
  *
8
13
  * @synopsis
9
14
  * ```coffeescript [specscript]
10
- * var args ...any,
11
- * result any,
12
- * predicate ...args=>Promise|boolean,
13
- * resolver ...args=>Promise|result,
14
- * defaultResolver ...args=>Promise|result,
15
- * conditionalFunctions [
16
- * ...Array<predicate|resolver>,
17
- * defaultResolver,
18
- * ]
15
+ * switchCase(conditionalValues Array<boolean|any>) -> Promise|any
19
16
  *
20
- * switchCase(conditionalFunctions)(...args) -> Promise|result
17
+ * switchCase(
18
+ * conditionalFuncsOrValues Array<function|boolean|any>
19
+ * )(...args) -> Promise|any
21
20
  * ```
22
21
  *
23
22
  * @description
24
- * Conditional operator with cases specified as pairings of `predicate` and `value`, with the exception of the last, default value. Any `predicate` or `value` can be a function, in which case it is evaluated against the point.
23
+ * Functional equivalent to the [Conditional (ternary) operator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Conditional_Operator). Accepts an array of conditional functions that specifies cases as pairings of `predicate` and `resolver` functions with the exception of the last, default resolver. All functions are provided with the same arguments and executed in series. The result of a `switchCase` execution is either the result of the execution the last default resolver, or the result of the execution of the first resolver where the associated predicate tested truthy.
25
24
  *
26
25
  * ```javascript [playground]
27
26
  * const fruitIsYellow = fruit => fruit.color == 'yellow'
@@ -32,12 +31,14 @@ const nonfunctionsConditional = require('./_internal/nonfunctionsConditional')
32
31
  * fruit => fruit.name + ' is probably not a banana',
33
32
  * ])
34
33
  *
35
- * console.log(
36
- * fruitsGuesser({ name: 'plantain', color: 'yellow' }),
37
- * ) // plantain is possibly a banana
34
+ * console.log(fruitsGuesser({ name: 'plantain', color: 'yellow' }))
35
+ * // plantain is possibly a banana
36
+ *
37
+ * console.log(fruitsGuesser({ name: 'apple', color: 'red' }))
38
+ * // apple is probably not a banana
38
39
  * ```
39
40
  *
40
- * A mixture of functions and nonfunctions can be supplied as any of the array items. Any Promises are resolved in series.
41
+ * Any function can be replaced with a nonfunction (object or primitive) value so that the value is treated as an already resolved value.
41
42
  *
42
43
  * ```javascript [playground]
43
44
  * switchCase([
@@ -49,27 +50,30 @@ const nonfunctionsConditional = require('./_internal/nonfunctionsConditional')
49
50
  * ])(false).then(console.log) // default
50
51
  * ```
51
52
  *
52
- * If every item in the argument array to switchCase is a value, switchCase should behave as the ternary ? : operator.
53
+ * If every item in the conditional array is a nonfunction value, `switchCase` executes eagerly.
53
54
  *
54
55
  * ```javascript [playground]
55
- * const a = 1
56
+ * const age = 26
56
57
  *
57
- * switchCase([
58
- * a == 1,
59
- * Promise.resolve('hello world'),
60
- * 'default',
61
- * ]).then(console.log) // hello world
58
+ * const myDrink = switchCase([age >= 21, 'Beer', 'Juice'])
59
+ *
60
+ * console.log(myDrink) // Beer
62
61
  * ```
63
62
  *
64
63
  * @execution series
65
64
  */
66
- const switchCase = values => {
65
+ const switchCase = (...args) => {
66
+ const values = args.pop()
67
67
  if (areAllValuesNonfunctions(values)) {
68
68
  return nonfunctionsConditional(values, -2)
69
69
  }
70
- return function switchingCases(...args) {
71
- return arrayConditional(values, args, -2)
70
+ if (args.length == 0) {
71
+ return curryArgs3(arrayConditional, values, __, -2)
72
+ }
73
+ if (areAnyValuesPromises(args)) {
74
+ return promiseAll(args).then(curry3(arrayConditional, values, __, -2))
72
75
  }
76
+ return arrayConditional(values, args, -2)
73
77
  }
74
78
 
75
79
  module.exports = switchCase