rubico 2.6.6 → 2.7.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 (382) hide show
  1. package/Transducer.d.ts +1 -1
  2. package/Transducer.js +65 -16
  3. package/__.js +10 -1
  4. package/all.d.ts +2 -2
  5. package/all.js +11 -2
  6. package/always.js +8 -0
  7. package/and.js +6 -0
  8. package/assign.js +9 -0
  9. package/compose.js +33 -8
  10. package/curry.js +18 -0
  11. package/dist/Transducer.es.js +1 -1
  12. package/dist/Transducer.es.min.js +1 -1
  13. package/dist/Transducer.js +1 -1
  14. package/dist/Transducer.min.js +1 -1
  15. package/dist/Transducer.mjs +1 -1
  16. package/dist/__.es.js +1 -1
  17. package/dist/__.es.min.js +1 -1
  18. package/dist/__.js +1 -1
  19. package/dist/__.min.js +1 -1
  20. package/dist/__.mjs +1 -1
  21. package/dist/all.es.js +1 -1
  22. package/dist/all.es.min.js +1 -1
  23. package/dist/all.js +1 -1
  24. package/dist/all.min.js +1 -1
  25. package/dist/all.mjs +1 -1
  26. package/dist/always.es.js +1 -1
  27. package/dist/always.es.min.js +1 -1
  28. package/dist/always.js +1 -1
  29. package/dist/always.min.js +1 -1
  30. package/dist/always.mjs +1 -1
  31. package/dist/and.es.js +1 -1
  32. package/dist/and.es.min.js +1 -1
  33. package/dist/and.js +1 -1
  34. package/dist/and.min.js +1 -1
  35. package/dist/and.mjs +1 -1
  36. package/dist/assign.es.js +1 -1
  37. package/dist/assign.es.min.js +1 -1
  38. package/dist/assign.js +1 -1
  39. package/dist/assign.min.js +1 -1
  40. package/dist/assign.mjs +1 -1
  41. package/dist/compose.es.js +5 -1
  42. package/dist/compose.es.min.js +2 -2
  43. package/dist/compose.js +5 -1
  44. package/dist/compose.min.js +2 -2
  45. package/dist/compose.mjs +5 -1
  46. package/dist/curry.es.js +1 -1
  47. package/dist/curry.es.min.js +1 -1
  48. package/dist/curry.js +1 -1
  49. package/dist/curry.min.js +1 -1
  50. package/dist/curry.mjs +1 -1
  51. package/dist/eq.es.js +1 -1
  52. package/dist/eq.es.min.js +1 -1
  53. package/dist/eq.js +1 -1
  54. package/dist/eq.min.js +1 -1
  55. package/dist/eq.mjs +1 -1
  56. package/dist/every.es.js +1 -1
  57. package/dist/every.es.min.js +1 -1
  58. package/dist/every.js +1 -1
  59. package/dist/every.min.js +1 -1
  60. package/dist/every.mjs +1 -1
  61. package/dist/filter.es.js +1 -1
  62. package/dist/filter.es.min.js +1 -1
  63. package/dist/filter.js +1 -1
  64. package/dist/filter.min.js +1 -1
  65. package/dist/filter.mjs +1 -1
  66. package/dist/flatMap.es.js +1 -1
  67. package/dist/flatMap.es.min.js +1 -1
  68. package/dist/flatMap.js +1 -1
  69. package/dist/flatMap.min.js +1 -1
  70. package/dist/flatMap.mjs +1 -1
  71. package/dist/forEach.es.js +1 -1
  72. package/dist/forEach.es.min.js +1 -1
  73. package/dist/forEach.js +1 -1
  74. package/dist/forEach.min.js +1 -1
  75. package/dist/forEach.mjs +1 -1
  76. package/dist/get.es.js +1 -1
  77. package/dist/get.es.min.js +1 -1
  78. package/dist/get.js +1 -1
  79. package/dist/get.min.js +1 -1
  80. package/dist/get.mjs +1 -1
  81. package/dist/gt.es.js +1 -1
  82. package/dist/gt.es.min.js +1 -1
  83. package/dist/gt.js +1 -1
  84. package/dist/gt.min.js +1 -1
  85. package/dist/gt.mjs +1 -1
  86. package/dist/gte.es.js +1 -1
  87. package/dist/gte.es.min.js +1 -1
  88. package/dist/gte.js +1 -1
  89. package/dist/gte.min.js +1 -1
  90. package/dist/gte.mjs +1 -1
  91. package/dist/lt.es.js +1 -1
  92. package/dist/lt.es.min.js +1 -1
  93. package/dist/lt.js +1 -1
  94. package/dist/lt.min.js +1 -1
  95. package/dist/lt.mjs +1 -1
  96. package/dist/lte.es.js +1 -1
  97. package/dist/lte.es.min.js +1 -1
  98. package/dist/lte.js +1 -1
  99. package/dist/lte.min.js +1 -1
  100. package/dist/lte.mjs +1 -1
  101. package/dist/map.es.js +1 -1
  102. package/dist/map.es.min.js +1 -1
  103. package/dist/map.js +1 -1
  104. package/dist/map.min.js +1 -1
  105. package/dist/map.mjs +1 -1
  106. package/dist/not.es.js +1 -1
  107. package/dist/not.es.min.js +1 -1
  108. package/dist/not.js +1 -1
  109. package/dist/not.min.js +1 -1
  110. package/dist/not.mjs +1 -1
  111. package/dist/omit.es.js +1 -1
  112. package/dist/omit.es.min.js +1 -1
  113. package/dist/omit.js +1 -1
  114. package/dist/omit.min.js +1 -1
  115. package/dist/omit.mjs +1 -1
  116. package/dist/or.es.js +1 -1
  117. package/dist/or.es.min.js +1 -1
  118. package/dist/or.js +1 -1
  119. package/dist/or.min.js +1 -1
  120. package/dist/or.mjs +1 -1
  121. package/dist/pick.es.js +1 -1
  122. package/dist/pick.es.min.js +1 -1
  123. package/dist/pick.js +1 -1
  124. package/dist/pick.min.js +1 -1
  125. package/dist/pick.mjs +1 -1
  126. package/dist/pipe.es.js +5 -1
  127. package/dist/pipe.es.min.js +2 -2
  128. package/dist/pipe.js +5 -1
  129. package/dist/pipe.min.js +2 -2
  130. package/dist/pipe.mjs +5 -1
  131. package/dist/reduce.es.js +8 -8
  132. package/dist/reduce.es.min.js +1 -1
  133. package/dist/reduce.js +8 -8
  134. package/dist/reduce.min.js +1 -1
  135. package/dist/reduce.mjs +8 -8
  136. package/dist/rubico.es.js +16 -8
  137. package/dist/rubico.es.min.js +2 -2
  138. package/dist/rubico.global.js +16 -8
  139. package/dist/rubico.global.min.js +2 -2
  140. package/dist/rubico.js +16 -8
  141. package/dist/rubico.min.js +2 -2
  142. package/dist/rubico.mjs +16 -8
  143. package/dist/set.es.js +1 -1
  144. package/dist/set.es.min.js +1 -1
  145. package/dist/set.js +1 -1
  146. package/dist/set.min.js +1 -1
  147. package/dist/set.mjs +1 -1
  148. package/dist/some.es.js +1 -1
  149. package/dist/some.es.min.js +1 -1
  150. package/dist/some.js +1 -1
  151. package/dist/some.min.js +1 -1
  152. package/dist/some.mjs +1 -1
  153. package/dist/switchCase.es.js +1 -1
  154. package/dist/switchCase.es.min.js +1 -1
  155. package/dist/switchCase.js +1 -1
  156. package/dist/switchCase.min.js +1 -1
  157. package/dist/switchCase.mjs +1 -1
  158. package/dist/tap.es.js +1 -1
  159. package/dist/tap.es.min.js +1 -1
  160. package/dist/tap.js +1 -1
  161. package/dist/tap.min.js +1 -1
  162. package/dist/tap.mjs +1 -1
  163. package/dist/thunkify.es.js +1 -1
  164. package/dist/thunkify.es.min.js +1 -1
  165. package/dist/thunkify.js +1 -1
  166. package/dist/thunkify.min.js +1 -1
  167. package/dist/thunkify.mjs +1 -1
  168. package/dist/transform.es.js +1 -1
  169. package/dist/transform.es.min.js +1 -1
  170. package/dist/transform.js +1 -1
  171. package/dist/transform.min.js +1 -1
  172. package/dist/transform.mjs +1 -1
  173. package/dist/tryCatch.es.js +1 -1
  174. package/dist/tryCatch.es.min.js +1 -1
  175. package/dist/tryCatch.js +1 -1
  176. package/dist/tryCatch.min.js +1 -1
  177. package/dist/tryCatch.mjs +1 -1
  178. package/dist/x/append.es.js +1 -1
  179. package/dist/x/append.es.min.js +1 -1
  180. package/dist/x/append.js +1 -1
  181. package/dist/x/append.min.js +1 -1
  182. package/dist/x/append.mjs +1 -1
  183. package/dist/x/callProp.es.js +1 -1
  184. package/dist/x/callProp.es.min.js +1 -1
  185. package/dist/x/callProp.js +1 -1
  186. package/dist/x/callProp.min.js +1 -1
  187. package/dist/x/callProp.mjs +1 -1
  188. package/dist/x/defaultsDeep.es.js +1 -1
  189. package/dist/x/defaultsDeep.es.min.js +1 -1
  190. package/dist/x/defaultsDeep.js +1 -1
  191. package/dist/x/defaultsDeep.min.js +1 -1
  192. package/dist/x/defaultsDeep.mjs +1 -1
  193. package/dist/x/differenceWith.es.js +1 -1
  194. package/dist/x/differenceWith.es.min.js +1 -1
  195. package/dist/x/differenceWith.js +1 -1
  196. package/dist/x/differenceWith.min.js +1 -1
  197. package/dist/x/differenceWith.mjs +1 -1
  198. package/dist/x/filterOut.es.js +1 -1
  199. package/dist/x/filterOut.es.min.js +1 -1
  200. package/dist/x/filterOut.js +1 -1
  201. package/dist/x/filterOut.min.js +1 -1
  202. package/dist/x/filterOut.mjs +1 -1
  203. package/dist/x/find.es.js +1 -1
  204. package/dist/x/find.es.min.js +1 -1
  205. package/dist/x/find.js +1 -1
  206. package/dist/x/find.min.js +1 -1
  207. package/dist/x/find.mjs +1 -1
  208. package/dist/x/findIndex.es.js +1 -1
  209. package/dist/x/findIndex.es.min.js +1 -1
  210. package/dist/x/findIndex.js +1 -1
  211. package/dist/x/findIndex.min.js +1 -1
  212. package/dist/x/findIndex.mjs +1 -1
  213. package/dist/x/first.es.js +1 -1
  214. package/dist/x/first.es.min.js +1 -1
  215. package/dist/x/first.js +1 -1
  216. package/dist/x/first.min.js +1 -1
  217. package/dist/x/first.mjs +1 -1
  218. package/dist/x/flatten.es.js +1 -1
  219. package/dist/x/flatten.es.min.js +1 -1
  220. package/dist/x/flatten.js +1 -1
  221. package/dist/x/flatten.min.js +1 -1
  222. package/dist/x/flatten.mjs +1 -1
  223. package/dist/x/groupBy.es.js +8 -8
  224. package/dist/x/groupBy.es.min.js +1 -1
  225. package/dist/x/groupBy.js +8 -8
  226. package/dist/x/groupBy.min.js +1 -1
  227. package/dist/x/groupBy.mjs +8 -8
  228. package/dist/x/has.es.js +1 -1
  229. package/dist/x/has.es.min.js +1 -1
  230. package/dist/x/has.js +1 -1
  231. package/dist/x/has.min.js +1 -1
  232. package/dist/x/has.mjs +1 -1
  233. package/dist/x/identity.es.js +1 -1
  234. package/dist/x/identity.es.min.js +1 -1
  235. package/dist/x/identity.js +1 -1
  236. package/dist/x/identity.min.js +1 -1
  237. package/dist/x/identity.mjs +1 -1
  238. package/dist/x/includes.es.js +1 -1
  239. package/dist/x/includes.es.min.js +1 -1
  240. package/dist/x/includes.js +1 -1
  241. package/dist/x/includes.min.js +1 -1
  242. package/dist/x/includes.mjs +1 -1
  243. package/dist/x/isDeepEqual.es.js +1 -1
  244. package/dist/x/isDeepEqual.es.min.js +1 -1
  245. package/dist/x/isDeepEqual.js +1 -1
  246. package/dist/x/isDeepEqual.min.js +1 -1
  247. package/dist/x/isDeepEqual.mjs +1 -1
  248. package/dist/x/isEmpty.es.js +1 -1
  249. package/dist/x/isEmpty.es.min.js +1 -1
  250. package/dist/x/isEmpty.js +1 -1
  251. package/dist/x/isEmpty.min.js +1 -1
  252. package/dist/x/isEmpty.mjs +1 -1
  253. package/dist/x/isEqual.es.js +1 -1
  254. package/dist/x/isEqual.es.min.js +1 -1
  255. package/dist/x/isEqual.js +1 -1
  256. package/dist/x/isEqual.min.js +1 -1
  257. package/dist/x/isEqual.mjs +1 -1
  258. package/dist/x/isFunction.es.js +1 -1
  259. package/dist/x/isFunction.es.min.js +1 -1
  260. package/dist/x/isFunction.js +1 -1
  261. package/dist/x/isFunction.min.js +1 -1
  262. package/dist/x/isFunction.mjs +1 -1
  263. package/dist/x/isIn.es.js +1 -1
  264. package/dist/x/isIn.es.min.js +1 -1
  265. package/dist/x/isIn.js +1 -1
  266. package/dist/x/isIn.min.js +1 -1
  267. package/dist/x/isIn.mjs +1 -1
  268. package/dist/x/isObject.es.js +1 -1
  269. package/dist/x/isObject.es.min.js +1 -1
  270. package/dist/x/isObject.js +1 -1
  271. package/dist/x/isObject.min.js +1 -1
  272. package/dist/x/isObject.mjs +1 -1
  273. package/dist/x/isString.es.js +1 -1
  274. package/dist/x/isString.es.min.js +1 -1
  275. package/dist/x/isString.js +1 -1
  276. package/dist/x/isString.min.js +1 -1
  277. package/dist/x/isString.mjs +1 -1
  278. package/dist/x/keys.es.js +1 -1
  279. package/dist/x/keys.es.min.js +1 -1
  280. package/dist/x/keys.js +1 -1
  281. package/dist/x/keys.min.js +1 -1
  282. package/dist/x/keys.mjs +1 -1
  283. package/dist/x/last.es.js +1 -1
  284. package/dist/x/last.es.min.js +1 -1
  285. package/dist/x/last.js +1 -1
  286. package/dist/x/last.min.js +1 -1
  287. package/dist/x/last.mjs +1 -1
  288. package/dist/x/maxBy.es.js +1 -1
  289. package/dist/x/maxBy.es.min.js +1 -1
  290. package/dist/x/maxBy.js +1 -1
  291. package/dist/x/maxBy.min.js +1 -1
  292. package/dist/x/maxBy.mjs +1 -1
  293. package/dist/x/noop.es.js +1 -1
  294. package/dist/x/noop.es.min.js +1 -1
  295. package/dist/x/noop.js +1 -1
  296. package/dist/x/noop.min.js +1 -1
  297. package/dist/x/noop.mjs +1 -1
  298. package/dist/x/pluck.es.js +1 -1
  299. package/dist/x/pluck.es.min.js +1 -1
  300. package/dist/x/pluck.js +1 -1
  301. package/dist/x/pluck.min.js +1 -1
  302. package/dist/x/pluck.mjs +1 -1
  303. package/dist/x/prepend.es.js +1 -1
  304. package/dist/x/prepend.es.min.js +1 -1
  305. package/dist/x/prepend.js +1 -1
  306. package/dist/x/prepend.min.js +1 -1
  307. package/dist/x/prepend.mjs +1 -1
  308. package/dist/x/size.es.js +1 -1
  309. package/dist/x/size.es.min.js +1 -1
  310. package/dist/x/size.js +1 -1
  311. package/dist/x/size.min.js +1 -1
  312. package/dist/x/size.mjs +1 -1
  313. package/dist/x/trace.es.js +1 -1
  314. package/dist/x/trace.es.min.js +1 -1
  315. package/dist/x/trace.js +1 -1
  316. package/dist/x/trace.min.js +1 -1
  317. package/dist/x/trace.mjs +1 -1
  318. package/dist/x/unionWith.es.js +1 -1
  319. package/dist/x/unionWith.es.min.js +1 -1
  320. package/dist/x/unionWith.js +1 -1
  321. package/dist/x/unionWith.min.js +1 -1
  322. package/dist/x/unionWith.mjs +1 -1
  323. package/dist/x/uniq.es.js +1 -1
  324. package/dist/x/uniq.es.min.js +1 -1
  325. package/dist/x/uniq.js +1 -1
  326. package/dist/x/uniq.min.js +1 -1
  327. package/dist/x/uniq.mjs +1 -1
  328. package/dist/x/unless.es.js +1 -1
  329. package/dist/x/unless.es.min.js +1 -1
  330. package/dist/x/unless.js +1 -1
  331. package/dist/x/unless.min.js +1 -1
  332. package/dist/x/unless.mjs +1 -1
  333. package/dist/x/values.es.js +1 -1
  334. package/dist/x/values.es.min.js +1 -1
  335. package/dist/x/values.js +1 -1
  336. package/dist/x/values.min.js +1 -1
  337. package/dist/x/values.mjs +1 -1
  338. package/dist/x/when.es.js +1 -1
  339. package/dist/x/when.es.min.js +1 -1
  340. package/dist/x/when.js +1 -1
  341. package/dist/x/when.min.js +1 -1
  342. package/dist/x/when.mjs +1 -1
  343. package/eq.d.ts +6 -6
  344. package/eq.js +14 -6
  345. package/es.js +16 -8
  346. package/every.js +19 -5
  347. package/filter.js +59 -15
  348. package/flatMap.js +32 -23
  349. package/forEach.js +107 -13
  350. package/get.js +9 -0
  351. package/gt.js +9 -0
  352. package/gte.js +9 -0
  353. package/index.js +16 -8
  354. package/lte.js +9 -0
  355. package/map.js +153 -36
  356. package/not.js +7 -0
  357. package/omit.d.ts +2 -2
  358. package/omit.js +11 -2
  359. package/or.js +6 -0
  360. package/package.json +1 -1
  361. package/pick.js +9 -0
  362. package/pipe.js +30 -3
  363. package/reduce.js +111 -30
  364. package/set.js +9 -0
  365. package/some.js +17 -3
  366. package/switchCase.js +6 -0
  367. package/tap.js +14 -0
  368. package/thunkify.js +8 -0
  369. package/transform.js +105 -29
  370. package/tryCatch.js +5 -0
  371. package/x/append.js +3 -0
  372. package/x/callProp.js +5 -0
  373. package/x/defaultsDeep.d.ts +2 -2
  374. package/x/defaultsDeep.js +7 -2
  375. package/x/differenceWith.js +5 -0
  376. package/x/find.d.ts +2 -2
  377. package/x/find.js +2 -2
  378. package/x/groupBy.d.ts +2 -2
  379. package/x/groupBy.js +2 -2
  380. package/x/pluck.d.ts +2 -2
  381. package/x/pluck.js +2 -2
  382. package/x/unionWith.test.js +3 -3
package/flatMap.js CHANGED
@@ -15,7 +15,7 @@ const __ = require('./_internal/placeholder')
15
15
  *
16
16
  * @synopsis
17
17
  * ```coffeescript [specscript]
18
- * type Monad = Array|String|Set|Iterator|AsyncIterator
18
+ * type Monad = Array|String|Set|Generator|AsyncGenerator
19
19
  * type Iterable = Iterable|AsyncIterable|Object<value any>
20
20
  *
21
21
  * _flatMap(
@@ -64,35 +64,36 @@ const _flatMap = function (value, flatMapper) {
64
64
  *
65
65
  * @synopsis
66
66
  * ```coffeescript [specscript]
67
- * type Monad = Array|String|Set|Iterator|AsyncIterator
68
- * type Flattenable = Iterable|AsyncIterable|Object<value any>
67
+ * type Monad = Array|String|Set|Generator|AsyncGenerator|{ flatMap: string }|{ chain: string }|Object
69
68
  *
70
69
  * type FlatMapper = (
71
70
  * item any,
72
- * indexOrKey string,
73
- * m Monad
74
- * )=>Promise|Flattenable|any
71
+ * indexOrKey number|string|any,
72
+ * mon Monad
73
+ * )=>Promise|Monad|any
75
74
  *
76
- * flatMap(m Monad, flatMapper FlatMapper) -> result Promise|Monad
77
- * flatMap(flatMapper FlatMapper)(m Monad) -> result Promise|Monad
75
+ * flatMap(mon Monad, flatMapper FlatMapper) -> result Promise|Monad
76
+ * flatMap(flatMapper FlatMapper)(mon Monad) -> result Promise|Monad
78
77
  * ```
79
78
  *
80
79
  * @description
81
- * Applies a flatMapper function concurrently to each item of a monad, returning a monad of the same type. A flatMapping operation iterates through each item of a monad and applies the flatMapper function to each item, flattening the result of the execution into the returned monad. The result of an individual execution can be any iterable, async iterable, or object with enumerable values. The flatMapper function may be asynchronous.
80
+ * Applies a flatMapper function to each item of a monad, returning a monad of the same type.
82
81
  *
83
- * The following data types are considered monads:
82
+ * A flatMapping operation iterates through each item of a monad and applies the flatMapper function to each item, flattening the result of the execution into the returned monad.
83
+ *
84
+ * If the flatMapper is asynchronous, it is executed concurrently. The execution result may be asynchronously iterable, in which case it is muxed into the returned monad.
85
+ *
86
+ * The following data types are considered to be monads, all are flattenable into other monads:
84
87
  * * `array`
85
88
  * * `string`
86
89
  * * `set`
87
- * * `iterator`
88
- * * `async iterator`
90
+ * * `genreator`
91
+ * * `async generator`
92
+ * * `object with .flatMap method`
93
+ * * `object with .chain method`
94
+ * * `object`
89
95
  *
90
- * The following data types are considered flattenable:
91
- * * `iterable` - the execution result is iterated and each item is added to the result collection
92
- * * `async iterable` - the execution result is asynchronously iterated and each item is added to the result collection
93
- * * `object` - the execution result values are added to the result collection
94
- *
95
- * `flatMap` can flatten various data types.
96
+ * `flatMap` flattens various data types.
96
97
  *
97
98
  * ```javascript [playground]
98
99
  * const identity = value => value
@@ -100,15 +101,15 @@ const _flatMap = function (value, flatMapper) {
100
101
  * flatMap(identity)([
101
102
  * [1, 1], // array
102
103
  * new Set([2, 2]), // set
103
- * (function* () { yield 3; yield 3 })(), // generator
104
- * (async function* () { yield 7; yield 7 })(), // asyncGenerator
104
+ * (function* () { yield 3; yield 3 })(),
105
+ * (async function* () { yield 7; yield 7 })(),
105
106
  * { a: 5, b: 5 }, // object
106
107
  * new Uint8Array([8]), // typedArray
107
108
  * ]).then(console.log)
108
109
  * // [1, 1, 2, 3, 3, 5, 5, 8, 7, 7]
109
110
  * ```
110
111
  *
111
- * `flatMap` muxes asynchronous values. Muxing, or asynchronously "mixing", is the process of combining multiple asynchronous sources into one source, with order determined by the asynchronous resolution of the individual items.
112
+ * Values from async generators are muxed. Muxing, or asynchronously "mixing", is the process of combining multiple asynchronous sources into one source, with order determined by the asynchronous resolution of the individual items.
112
113
  *
113
114
  * ```javascript [playground]
114
115
  * const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
@@ -129,12 +130,12 @@ const _flatMap = function (value, flatMapper) {
129
130
  * yield message
130
131
  * }
131
132
  *
132
- * // async is muxed
133
+ * // values from async generators are muxed
133
134
  * flatMap(['foo', 'bar', 'baz'], asyncRepeat3).then(console.log)
134
135
  * // ['foo', 'bar', 'baz', 'foo', 'bar', 'baz', 'foo', 'bar', 'baz']
135
136
  * ```
136
137
  *
137
- * For arrays (type `Array`), `flatMap` applies the flatMapper function to each item, pushing (`.push`) the items of each execution into a new array.
138
+ * `flatMap` applies the flatMapper function to each item of an array, flattening the results into a new array.
138
139
  *
139
140
  * ```javascript [playground]
140
141
  * const duplicate = value => [value, value]
@@ -161,6 +162,14 @@ const _flatMap = function (value, flatMapper) {
161
162
  * // [1, 1, 2, 2, 3, 3, 4, 4, 5, 5]
162
163
  * ```
163
164
  *
165
+ * See also:
166
+ * * [forEach](/docs/forEach)
167
+ * * [map](/docs/map)
168
+ * * [filter](/docs/filter)
169
+ * * [reduce](/docs/reduce)
170
+ * * [transform](/docs/transform)
171
+ * * [some](/docs/some)
172
+ *
164
173
  * @execution concurrent
165
174
  *
166
175
  * @transducing
package/forEach.js CHANGED
@@ -45,20 +45,86 @@ const _forEach = function (collection, callback) {
45
45
  *
46
46
  * @synopsis
47
47
  * ```coffeescript [specscript]
48
- * type Collection = Array|Iterable|AsyncIterable|{ forEach: function }|Object
48
+ * type Iterable = Array|Set|Map|Generator|AsyncGenerator|{ forEach: function }|Object
49
+ *
50
+ * type Callback = (
51
+ * item any,
52
+ * indexOrKey number|string|any,
53
+ * iter Iterable
54
+ * )=>Promise|undefined
49
55
  *
50
- * forEach(collection Collection, callback function) -> collection Promise|Collection
56
+ * forEach(iter Iterable, cb Callback) -> iter Promise|Iterable
51
57
  *
52
- * forEach(callback function)(collection Collection) -> collection Promise|Collection
58
+ * forEach(cb Callback)(iter Iterable) -> iter Promise|Iterable
53
59
  * ```
54
60
  *
55
61
  * @description
56
- * Execute a callback for each item of a collection, returning a Promise if the execution is asynchronous. Asynchronous execution happens concurrently.
62
+ * Execute a callback function for each item of an iterable, returning the original iterable unmodified.
63
+ *
64
+ * The following data types are considered to be iterables:
65
+ * * `array`
66
+ * * `set`
67
+ * * `map`
68
+ * * `generator`
69
+ * * `async generator`
70
+ * * `object with .forEach method`
71
+ * * `object`
72
+ *
73
+ * The callback function signature changes depending on the provided iterable.
74
+ *
75
+ * If the iterable is an array:
76
+ * ```coffeescript [specscript]
77
+ * callback(item any, index number, iter Array) -> Promise|undefined
78
+ * ```
79
+ *
80
+ * If the iterable is a set:
81
+ * ```coffeescript [specscript]
82
+ * callback(item any, key any, iter Set) -> Promise|undefined
83
+ * ```
84
+ *
85
+ * If the iterable is a map:
86
+ * ```coffeescript [specscript]
87
+ * callback(item any, key any, filt Map) -> Promise|undefined
88
+ * ```
89
+ *
90
+ * If the iterable is a generator:
91
+ * ```coffeescript [specscript]
92
+ * callback(item any) -> Promise|undefined
93
+ * ```
94
+ *
95
+ * If the iterable is an async generator:
96
+ * ```coffeescript [specscript]
97
+ * callback(item any) -> Promise|undefined
98
+ * ```
99
+ *
100
+ * If the iterable is an object with a `.forEach` method, the callback function signature is defined externally.
101
+ *
102
+ * If the iterable is a plain object:
103
+ * ```coffeescript [specscript]
104
+ * callback(item any, key string, iter Object) -> Promise|undefined
105
+ * ```
106
+ *
107
+ * If the callback function is asynchronous, it is executed concurrently.
108
+ *
109
+ * ```javascript [playground]
110
+ * forEach([1, 2, 3, 4, 5], async number => {
111
+ * await new Promise(resolve => {
112
+ * setTimeout(resolve, 1000)
113
+ * })
114
+ * console.log(number)
115
+ * })
116
+ * ```
117
+ *
118
+ * `forEach` works for arrays.
57
119
  *
58
120
  * ```javascript [playground]
59
- * forEach([1, 2, 3, 4, 5], console.log) // 1 2 3 4 5
121
+ * forEach([1, 2, 3, 4, 5], num => console.log(num)) // 1 2 3 4 5
122
+ * ```
123
+ *
124
+ * `forEach` works for objects.
60
125
  *
61
- * forEach({ a: 1, b: 2, c: 3 }, console.log) // 1 2 3
126
+ * ```javascript [playground]
127
+ * forEach({ a: 1, b: 2, c: 3 }, num => console.log(num)) // 1 2 3
62
128
  * ```
63
129
  *
64
130
  * Omit the data argument for a composable API
@@ -81,6 +147,13 @@ const _forEach = function (collection, callback) {
81
147
  * // 2
82
148
  * // 3
83
149
  * ```
150
+ *
151
+ * See also:
152
+ * * [pipe](/docs/pipe)
153
+ * * [tap](/docs/tap)
154
+ * * [all](/docs/all)
155
+ * * [forEach.series](/docs/forEach.series)
156
+ * * [map](/docs/map)
84
157
  */
85
158
  const forEach = function (arg0, arg1) {
86
159
  if (typeof arg0 == 'function') {
@@ -125,20 +198,34 @@ const _forEachSeries = function (collection, callback) {
125
198
  *
126
199
  * @synopsis
127
200
  * ```coffeescript [specscript]
128
- * type Collection = Array|Iterable|AsyncIterable|{ forEach: function }|Object
201
+ * type Iterable = Array|Set|Map|Generator|AsyncGenerator|{ forEach: function }|Object
202
+ *
203
+ * type Callback = (
204
+ * item any,
205
+ * indexOrKey number|string|any,
206
+ * iter Iterable
207
+ * )=>Promise|undefined
129
208
  *
130
- * forEach.series(collection Collection, callback function) -> collection Promise|Collection
209
+ * forEach(iter Iterable, cb Callback) -> iter Promise|Iterable
131
210
  *
132
- * forEach.series(callback function)(collection Collection) -> collection Promise|Collection
211
+ * forEach(cb Callback)(iter Iterable) -> iter Promise|Iterable
133
212
  * ```
134
213
  *
135
214
  * @description
136
- * Execute a callback for each item of a collection, returning a Promise if the execution is asynchronous. Asynchronous execution happens in series.
215
+ * [forEach](/docs/forEach) with serial execution.
137
216
  *
138
217
  * ```javascript [playground]
139
- * forEach.series([1, 2, 3, 4, 5], console.log) // 1 2 3 4 5
140
- *
141
- * forEach.series({ a: 1, b: 2, c: 3 }, console.log) // 1 2 3
218
+ * forEach.series([1, 2, 3, 4, 5], async number => {
219
+ * await new Promise(resolve => {
220
+ * setTimeout(resolve, 1000)
221
+ * })
222
+ * console.log(number)
223
+ * // 1
224
+ * // 2
225
+ * // 3
226
+ * // 4
227
+ * // 5
228
+ * })
142
229
  * ```
143
230
  *
144
231
  * Any promises passed in argument position are resolved for their values before further execution. This only applies to the eager version of the API.
@@ -149,6 +236,13 @@ const _forEachSeries = function (collection, callback) {
149
236
  * // 2
150
237
  * // 3
151
238
  * ```
239
+ *
240
+ * See also:
241
+ * * [pipe](/docs/pipe)
242
+ * * [tap](/docs/tap)
243
+ * * [all](/docs/all)
244
+ * * [forEach](/docs/forEach)
245
+ * * [map](/docs/map)
152
246
  */
153
247
  forEach.series = function forEachSeries(arg0, arg1) {
154
248
  if (typeof arg0 == 'function') {
package/get.js CHANGED
@@ -86,6 +86,15 @@ const _get = function (object, path, defaultValue) {
86
86
  * ```javascript [playground]
87
87
  * get(Promise.resolve({ a: 1 }), 'a').then(console.log) // 1
88
88
  * ```
89
+ *
90
+ * See also:
91
+ * * [pipe](/docs/pipe)
92
+ * * [all](/docs/all)
93
+ * * [assign](/docs/assign)
94
+ * * [set](/docs/set)
95
+ * * [pick](/docs/pick)
96
+ * * [omit](/docs/omit)
97
+ * * [forEach](/docs/forEach)
89
98
  */
90
99
 
91
100
  const get = function (arg0, arg1, arg2) {
package/gt.js CHANGED
@@ -53,6 +53,15 @@ const greaterThan = require('./_internal/greaterThan')
53
53
  * ```javascript [playground]
54
54
  * gt(Promise.resolve({ a: 2, b: 1 }), get('a'), get('b')).then(console.log) // true
55
55
  * ```
56
+ *
57
+ * See also:
58
+ * * [and](/docs/and)
59
+ * * [eq](/docs/eq)
60
+ * * [lt](/docs/lt)
61
+ * * [gte](/docs/gte)
62
+ * * [lte](/docs/lte)
63
+ * * [thunkify](/docs/thunkify)
64
+ *
56
65
  */
57
66
  const gt = ComparisonOperator(greaterThan)
58
67
 
package/gte.js CHANGED
@@ -55,6 +55,15 @@ const greaterThanOrEqual = require('./_internal/greaterThanOrEqual')
55
55
  * ```javascript [playground]
56
56
  * gte(Promise.resolve({ a: 1, b: 1 }), get('a'), get('b')).then(console.log) // true
57
57
  * ```
58
+ *
59
+ * See also:
60
+ * * [and](/docs/and)
61
+ * * [eq](/docs/eq)
62
+ * * [lt](/docs/lt)
63
+ * * [gt](/docs/gt)
64
+ * * [lte](/docs/lte)
65
+ * * [thunkify](/docs/thunkify)
66
+ *
58
67
  */
59
68
  const gte = ComparisonOperator(greaterThanOrEqual)
60
69
 
package/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * rubico v2.6.6
2
+ * rubico v2.7.0
3
3
  * https://github.com/a-synchronous/rubico
4
4
  * (c) 2019-2025 Richard Tong
5
5
  * rubico may be freely distributed under the MIT license.
@@ -73,6 +73,10 @@ const curry2 = function (baseFunc, arg0, arg1) {
73
73
  }
74
74
 
75
75
  const pipe = function (...args) {
76
+ if (typeof args[0] == 'function') {
77
+ return args.reduce(funcConcat)
78
+ }
79
+
76
80
  const funcs = args.pop()
77
81
  const pipeline = funcs.reduce(funcConcat)
78
82
 
@@ -88,6 +92,10 @@ const pipe = function (...args) {
88
92
  }
89
93
 
90
94
  const compose = function (...args) {
95
+ if (typeof args[0] == 'function') {
96
+ return args.reduceRight(funcConcat)
97
+ }
98
+
91
99
  const funcs = args.pop()
92
100
  const composition = funcs.reduceRight(funcConcat)
93
101
 
@@ -1745,17 +1753,17 @@ const genericReduce = function (collection, reducer, result) {
1745
1753
  : reducer(result, collection)
1746
1754
  }
1747
1755
 
1748
- // _reduce(collection any, reducer function, initialValue function|any) -> Promise
1749
- const _reduce = function (collection, reducer, initialValue) {
1750
- if (typeof initialValue == 'function') {
1751
- const actualInitialValue = initialValue(collection)
1756
+ // _reduce(collection any, reducer function, initial function|any) -> Promise
1757
+ const _reduce = function (collection, reducer, initial) {
1758
+ if (typeof initial == 'function') {
1759
+ const actualInitialValue = initial(collection)
1752
1760
  return isPromise(actualInitialValue)
1753
1761
  ? actualInitialValue.then(curry3(genericReduce, collection, reducer, __))
1754
1762
  : genericReduce(collection, reducer, actualInitialValue)
1755
1763
  }
1756
- return isPromise(initialValue)
1757
- ? initialValue.then(curry3(genericReduce, collection, reducer, __))
1758
- : genericReduce(collection, reducer, initialValue)
1764
+ return isPromise(initial)
1765
+ ? initial.then(curry3(genericReduce, collection, reducer, __))
1766
+ : genericReduce(collection, reducer, initial)
1759
1767
  }
1760
1768
 
1761
1769
  const reduce = function (...args) {
package/lte.js CHANGED
@@ -53,6 +53,15 @@ const lessThanOrEqual = require('./_internal/lessThanOrEqual')
53
53
  * ```javascript [playground]
54
54
  * lte(Promise.resolve({ a: 1, b: 1 }), get('a'), get('b')).then(console.log) // true
55
55
  * ```
56
+ *
57
+ * See also:
58
+ * * [and](/docs/and)
59
+ * * [eq](/docs/eq)
60
+ * * [lt](/docs/lt)
61
+ * * [gt](/docs/gt)
62
+ * * [gte](/docs/gte)
63
+ * * [thunkify](/docs/thunkify)
64
+ *
56
65
  */
57
66
  const lte = ComparisonOperator(lessThanOrEqual)
58
67