rubico 2.6.6 → 2.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (385) hide show
  1. package/Transducer.d.ts +1 -1
  2. package/Transducer.js +65 -16
  3. package/__.js +10 -1
  4. package/_internal/mapMapSeries.js +1 -0
  5. package/_internal/objectMapSeries.js +1 -0
  6. package/_internal/setMapSeries.js +1 -0
  7. package/all.d.ts +2 -2
  8. package/all.js +11 -2
  9. package/always.js +8 -0
  10. package/and.js +6 -0
  11. package/assign.js +9 -0
  12. package/compose.js +33 -8
  13. package/curry.js +18 -0
  14. package/dist/Transducer.es.js +1 -1
  15. package/dist/Transducer.es.min.js +1 -1
  16. package/dist/Transducer.js +1 -1
  17. package/dist/Transducer.min.js +1 -1
  18. package/dist/Transducer.mjs +1 -1
  19. package/dist/__.es.js +1 -1
  20. package/dist/__.es.min.js +1 -1
  21. package/dist/__.js +1 -1
  22. package/dist/__.min.js +1 -1
  23. package/dist/__.mjs +1 -1
  24. package/dist/all.es.js +1 -1
  25. package/dist/all.es.min.js +1 -1
  26. package/dist/all.js +1 -1
  27. package/dist/all.min.js +1 -1
  28. package/dist/all.mjs +1 -1
  29. package/dist/always.es.js +1 -1
  30. package/dist/always.es.min.js +1 -1
  31. package/dist/always.js +1 -1
  32. package/dist/always.min.js +1 -1
  33. package/dist/always.mjs +1 -1
  34. package/dist/and.es.js +1 -1
  35. package/dist/and.es.min.js +1 -1
  36. package/dist/and.js +1 -1
  37. package/dist/and.min.js +1 -1
  38. package/dist/and.mjs +1 -1
  39. package/dist/assign.es.js +1 -1
  40. package/dist/assign.es.min.js +1 -1
  41. package/dist/assign.js +1 -1
  42. package/dist/assign.min.js +1 -1
  43. package/dist/assign.mjs +1 -1
  44. package/dist/compose.es.js +5 -1
  45. package/dist/compose.es.min.js +2 -2
  46. package/dist/compose.js +5 -1
  47. package/dist/compose.min.js +2 -2
  48. package/dist/compose.mjs +5 -1
  49. package/dist/curry.es.js +1 -1
  50. package/dist/curry.es.min.js +1 -1
  51. package/dist/curry.js +1 -1
  52. package/dist/curry.min.js +1 -1
  53. package/dist/curry.mjs +1 -1
  54. package/dist/eq.es.js +1 -1
  55. package/dist/eq.es.min.js +1 -1
  56. package/dist/eq.js +1 -1
  57. package/dist/eq.min.js +1 -1
  58. package/dist/eq.mjs +1 -1
  59. package/dist/every.es.js +1 -1
  60. package/dist/every.es.min.js +1 -1
  61. package/dist/every.js +1 -1
  62. package/dist/every.min.js +1 -1
  63. package/dist/every.mjs +1 -1
  64. package/dist/filter.es.js +1 -1
  65. package/dist/filter.es.min.js +1 -1
  66. package/dist/filter.js +1 -1
  67. package/dist/filter.min.js +1 -1
  68. package/dist/filter.mjs +1 -1
  69. package/dist/flatMap.es.js +1 -1
  70. package/dist/flatMap.es.min.js +1 -1
  71. package/dist/flatMap.js +1 -1
  72. package/dist/flatMap.min.js +1 -1
  73. package/dist/flatMap.mjs +1 -1
  74. package/dist/forEach.es.js +1 -1
  75. package/dist/forEach.es.min.js +1 -1
  76. package/dist/forEach.js +1 -1
  77. package/dist/forEach.min.js +1 -1
  78. package/dist/forEach.mjs +1 -1
  79. package/dist/get.es.js +1 -1
  80. package/dist/get.es.min.js +1 -1
  81. package/dist/get.js +1 -1
  82. package/dist/get.min.js +1 -1
  83. package/dist/get.mjs +1 -1
  84. package/dist/gt.es.js +1 -1
  85. package/dist/gt.es.min.js +1 -1
  86. package/dist/gt.js +1 -1
  87. package/dist/gt.min.js +1 -1
  88. package/dist/gt.mjs +1 -1
  89. package/dist/gte.es.js +1 -1
  90. package/dist/gte.es.min.js +1 -1
  91. package/dist/gte.js +1 -1
  92. package/dist/gte.min.js +1 -1
  93. package/dist/gte.mjs +1 -1
  94. package/dist/lt.es.js +1 -1
  95. package/dist/lt.es.min.js +1 -1
  96. package/dist/lt.js +1 -1
  97. package/dist/lt.min.js +1 -1
  98. package/dist/lt.mjs +1 -1
  99. package/dist/lte.es.js +1 -1
  100. package/dist/lte.es.min.js +1 -1
  101. package/dist/lte.js +1 -1
  102. package/dist/lte.min.js +1 -1
  103. package/dist/lte.mjs +1 -1
  104. package/dist/map.es.js +1 -1
  105. package/dist/map.es.min.js +1 -1
  106. package/dist/map.js +1 -1
  107. package/dist/map.min.js +1 -1
  108. package/dist/map.mjs +1 -1
  109. package/dist/not.es.js +1 -1
  110. package/dist/not.es.min.js +1 -1
  111. package/dist/not.js +1 -1
  112. package/dist/not.min.js +1 -1
  113. package/dist/not.mjs +1 -1
  114. package/dist/omit.es.js +1 -1
  115. package/dist/omit.es.min.js +1 -1
  116. package/dist/omit.js +1 -1
  117. package/dist/omit.min.js +1 -1
  118. package/dist/omit.mjs +1 -1
  119. package/dist/or.es.js +1 -1
  120. package/dist/or.es.min.js +1 -1
  121. package/dist/or.js +1 -1
  122. package/dist/or.min.js +1 -1
  123. package/dist/or.mjs +1 -1
  124. package/dist/pick.es.js +1 -1
  125. package/dist/pick.es.min.js +1 -1
  126. package/dist/pick.js +1 -1
  127. package/dist/pick.min.js +1 -1
  128. package/dist/pick.mjs +1 -1
  129. package/dist/pipe.es.js +5 -1
  130. package/dist/pipe.es.min.js +2 -2
  131. package/dist/pipe.js +5 -1
  132. package/dist/pipe.min.js +2 -2
  133. package/dist/pipe.mjs +5 -1
  134. package/dist/reduce.es.js +8 -8
  135. package/dist/reduce.es.min.js +1 -1
  136. package/dist/reduce.js +8 -8
  137. package/dist/reduce.min.js +1 -1
  138. package/dist/reduce.mjs +8 -8
  139. package/dist/rubico.es.js +23 -11
  140. package/dist/rubico.es.min.js +2 -2
  141. package/dist/rubico.global.js +23 -11
  142. package/dist/rubico.global.min.js +2 -2
  143. package/dist/rubico.js +23 -11
  144. package/dist/rubico.min.js +2 -2
  145. package/dist/rubico.mjs +23 -11
  146. package/dist/set.es.js +1 -1
  147. package/dist/set.es.min.js +1 -1
  148. package/dist/set.js +1 -1
  149. package/dist/set.min.js +1 -1
  150. package/dist/set.mjs +1 -1
  151. package/dist/some.es.js +1 -1
  152. package/dist/some.es.min.js +1 -1
  153. package/dist/some.js +1 -1
  154. package/dist/some.min.js +1 -1
  155. package/dist/some.mjs +1 -1
  156. package/dist/switchCase.es.js +1 -1
  157. package/dist/switchCase.es.min.js +1 -1
  158. package/dist/switchCase.js +1 -1
  159. package/dist/switchCase.min.js +1 -1
  160. package/dist/switchCase.mjs +1 -1
  161. package/dist/tap.es.js +1 -1
  162. package/dist/tap.es.min.js +1 -1
  163. package/dist/tap.js +1 -1
  164. package/dist/tap.min.js +1 -1
  165. package/dist/tap.mjs +1 -1
  166. package/dist/thunkify.es.js +8 -4
  167. package/dist/thunkify.es.min.js +2 -2
  168. package/dist/thunkify.js +8 -4
  169. package/dist/thunkify.min.js +2 -2
  170. package/dist/thunkify.mjs +8 -4
  171. package/dist/transform.es.js +1 -1
  172. package/dist/transform.es.min.js +1 -1
  173. package/dist/transform.js +1 -1
  174. package/dist/transform.min.js +1 -1
  175. package/dist/transform.mjs +1 -1
  176. package/dist/tryCatch.es.js +1 -1
  177. package/dist/tryCatch.es.min.js +1 -1
  178. package/dist/tryCatch.js +1 -1
  179. package/dist/tryCatch.min.js +1 -1
  180. package/dist/tryCatch.mjs +1 -1
  181. package/dist/x/append.es.js +1 -1
  182. package/dist/x/append.es.min.js +1 -1
  183. package/dist/x/append.js +1 -1
  184. package/dist/x/append.min.js +1 -1
  185. package/dist/x/append.mjs +1 -1
  186. package/dist/x/callProp.es.js +1 -1
  187. package/dist/x/callProp.es.min.js +1 -1
  188. package/dist/x/callProp.js +1 -1
  189. package/dist/x/callProp.min.js +1 -1
  190. package/dist/x/callProp.mjs +1 -1
  191. package/dist/x/defaultsDeep.es.js +1 -1
  192. package/dist/x/defaultsDeep.es.min.js +1 -1
  193. package/dist/x/defaultsDeep.js +1 -1
  194. package/dist/x/defaultsDeep.min.js +1 -1
  195. package/dist/x/defaultsDeep.mjs +1 -1
  196. package/dist/x/differenceWith.es.js +1 -1
  197. package/dist/x/differenceWith.es.min.js +1 -1
  198. package/dist/x/differenceWith.js +1 -1
  199. package/dist/x/differenceWith.min.js +1 -1
  200. package/dist/x/differenceWith.mjs +1 -1
  201. package/dist/x/filterOut.es.js +1 -1
  202. package/dist/x/filterOut.es.min.js +1 -1
  203. package/dist/x/filterOut.js +1 -1
  204. package/dist/x/filterOut.min.js +1 -1
  205. package/dist/x/filterOut.mjs +1 -1
  206. package/dist/x/find.es.js +1 -1
  207. package/dist/x/find.es.min.js +1 -1
  208. package/dist/x/find.js +1 -1
  209. package/dist/x/find.min.js +1 -1
  210. package/dist/x/find.mjs +1 -1
  211. package/dist/x/findIndex.es.js +1 -1
  212. package/dist/x/findIndex.es.min.js +1 -1
  213. package/dist/x/findIndex.js +1 -1
  214. package/dist/x/findIndex.min.js +1 -1
  215. package/dist/x/findIndex.mjs +1 -1
  216. package/dist/x/first.es.js +1 -1
  217. package/dist/x/first.es.min.js +1 -1
  218. package/dist/x/first.js +1 -1
  219. package/dist/x/first.min.js +1 -1
  220. package/dist/x/first.mjs +1 -1
  221. package/dist/x/flatten.es.js +1 -1
  222. package/dist/x/flatten.es.min.js +1 -1
  223. package/dist/x/flatten.js +1 -1
  224. package/dist/x/flatten.min.js +1 -1
  225. package/dist/x/flatten.mjs +1 -1
  226. package/dist/x/groupBy.es.js +8 -8
  227. package/dist/x/groupBy.es.min.js +1 -1
  228. package/dist/x/groupBy.js +8 -8
  229. package/dist/x/groupBy.min.js +1 -1
  230. package/dist/x/groupBy.mjs +8 -8
  231. package/dist/x/has.es.js +1 -1
  232. package/dist/x/has.es.min.js +1 -1
  233. package/dist/x/has.js +1 -1
  234. package/dist/x/has.min.js +1 -1
  235. package/dist/x/has.mjs +1 -1
  236. package/dist/x/identity.es.js +1 -1
  237. package/dist/x/identity.es.min.js +1 -1
  238. package/dist/x/identity.js +1 -1
  239. package/dist/x/identity.min.js +1 -1
  240. package/dist/x/identity.mjs +1 -1
  241. package/dist/x/includes.es.js +1 -1
  242. package/dist/x/includes.es.min.js +1 -1
  243. package/dist/x/includes.js +1 -1
  244. package/dist/x/includes.min.js +1 -1
  245. package/dist/x/includes.mjs +1 -1
  246. package/dist/x/isDeepEqual.es.js +1 -1
  247. package/dist/x/isDeepEqual.es.min.js +1 -1
  248. package/dist/x/isDeepEqual.js +1 -1
  249. package/dist/x/isDeepEqual.min.js +1 -1
  250. package/dist/x/isDeepEqual.mjs +1 -1
  251. package/dist/x/isEmpty.es.js +1 -1
  252. package/dist/x/isEmpty.es.min.js +1 -1
  253. package/dist/x/isEmpty.js +1 -1
  254. package/dist/x/isEmpty.min.js +1 -1
  255. package/dist/x/isEmpty.mjs +1 -1
  256. package/dist/x/isEqual.es.js +1 -1
  257. package/dist/x/isEqual.es.min.js +1 -1
  258. package/dist/x/isEqual.js +1 -1
  259. package/dist/x/isEqual.min.js +1 -1
  260. package/dist/x/isEqual.mjs +1 -1
  261. package/dist/x/isFunction.es.js +1 -1
  262. package/dist/x/isFunction.es.min.js +1 -1
  263. package/dist/x/isFunction.js +1 -1
  264. package/dist/x/isFunction.min.js +1 -1
  265. package/dist/x/isFunction.mjs +1 -1
  266. package/dist/x/isIn.es.js +1 -1
  267. package/dist/x/isIn.es.min.js +1 -1
  268. package/dist/x/isIn.js +1 -1
  269. package/dist/x/isIn.min.js +1 -1
  270. package/dist/x/isIn.mjs +1 -1
  271. package/dist/x/isObject.es.js +1 -1
  272. package/dist/x/isObject.es.min.js +1 -1
  273. package/dist/x/isObject.js +1 -1
  274. package/dist/x/isObject.min.js +1 -1
  275. package/dist/x/isObject.mjs +1 -1
  276. package/dist/x/isString.es.js +1 -1
  277. package/dist/x/isString.es.min.js +1 -1
  278. package/dist/x/isString.js +1 -1
  279. package/dist/x/isString.min.js +1 -1
  280. package/dist/x/isString.mjs +1 -1
  281. package/dist/x/keys.es.js +1 -1
  282. package/dist/x/keys.es.min.js +1 -1
  283. package/dist/x/keys.js +1 -1
  284. package/dist/x/keys.min.js +1 -1
  285. package/dist/x/keys.mjs +1 -1
  286. package/dist/x/last.es.js +1 -1
  287. package/dist/x/last.es.min.js +1 -1
  288. package/dist/x/last.js +1 -1
  289. package/dist/x/last.min.js +1 -1
  290. package/dist/x/last.mjs +1 -1
  291. package/dist/x/maxBy.es.js +1 -1
  292. package/dist/x/maxBy.es.min.js +1 -1
  293. package/dist/x/maxBy.js +1 -1
  294. package/dist/x/maxBy.min.js +1 -1
  295. package/dist/x/maxBy.mjs +1 -1
  296. package/dist/x/noop.es.js +1 -1
  297. package/dist/x/noop.es.min.js +1 -1
  298. package/dist/x/noop.js +1 -1
  299. package/dist/x/noop.min.js +1 -1
  300. package/dist/x/noop.mjs +1 -1
  301. package/dist/x/pluck.es.js +1 -1
  302. package/dist/x/pluck.es.min.js +1 -1
  303. package/dist/x/pluck.js +1 -1
  304. package/dist/x/pluck.min.js +1 -1
  305. package/dist/x/pluck.mjs +1 -1
  306. package/dist/x/prepend.es.js +1 -1
  307. package/dist/x/prepend.es.min.js +1 -1
  308. package/dist/x/prepend.js +1 -1
  309. package/dist/x/prepend.min.js +1 -1
  310. package/dist/x/prepend.mjs +1 -1
  311. package/dist/x/size.es.js +1 -1
  312. package/dist/x/size.es.min.js +1 -1
  313. package/dist/x/size.js +1 -1
  314. package/dist/x/size.min.js +1 -1
  315. package/dist/x/size.mjs +1 -1
  316. package/dist/x/trace.es.js +1 -1
  317. package/dist/x/trace.es.min.js +1 -1
  318. package/dist/x/trace.js +1 -1
  319. package/dist/x/trace.min.js +1 -1
  320. package/dist/x/trace.mjs +1 -1
  321. package/dist/x/unionWith.es.js +1 -1
  322. package/dist/x/unionWith.es.min.js +1 -1
  323. package/dist/x/unionWith.js +1 -1
  324. package/dist/x/unionWith.min.js +1 -1
  325. package/dist/x/unionWith.mjs +1 -1
  326. package/dist/x/uniq.es.js +1 -1
  327. package/dist/x/uniq.es.min.js +1 -1
  328. package/dist/x/uniq.js +1 -1
  329. package/dist/x/uniq.min.js +1 -1
  330. package/dist/x/uniq.mjs +1 -1
  331. package/dist/x/unless.es.js +1 -1
  332. package/dist/x/unless.es.min.js +1 -1
  333. package/dist/x/unless.js +1 -1
  334. package/dist/x/unless.min.js +1 -1
  335. package/dist/x/unless.mjs +1 -1
  336. package/dist/x/values.es.js +1 -1
  337. package/dist/x/values.es.min.js +1 -1
  338. package/dist/x/values.js +1 -1
  339. package/dist/x/values.min.js +1 -1
  340. package/dist/x/values.mjs +1 -1
  341. package/dist/x/when.es.js +1 -1
  342. package/dist/x/when.es.min.js +1 -1
  343. package/dist/x/when.js +1 -1
  344. package/dist/x/when.min.js +1 -1
  345. package/dist/x/when.mjs +1 -1
  346. package/eq.d.ts +6 -6
  347. package/eq.js +14 -6
  348. package/es.js +23 -11
  349. package/every.js +19 -5
  350. package/filter.js +59 -15
  351. package/flatMap.js +32 -23
  352. package/forEach.js +107 -13
  353. package/get.js +9 -0
  354. package/gt.js +9 -0
  355. package/gte.js +9 -0
  356. package/index.js +23 -11
  357. package/lte.js +9 -0
  358. package/map.js +153 -36
  359. package/not.js +7 -0
  360. package/omit.d.ts +2 -2
  361. package/omit.js +11 -2
  362. package/or.js +6 -0
  363. package/package.json +1 -1
  364. package/pick.js +9 -0
  365. package/pipe.js +30 -3
  366. package/reduce.js +111 -30
  367. package/set.js +9 -0
  368. package/some.js +17 -3
  369. package/switchCase.js +6 -0
  370. package/tap.js +18 -0
  371. package/thunkify.js +30 -5
  372. package/transform.js +105 -29
  373. package/tryCatch.js +5 -0
  374. package/x/append.js +3 -0
  375. package/x/callProp.js +5 -0
  376. package/x/defaultsDeep.d.ts +2 -2
  377. package/x/defaultsDeep.js +7 -2
  378. package/x/differenceWith.js +5 -0
  379. package/x/find.d.ts +2 -2
  380. package/x/find.js +2 -2
  381. package/x/groupBy.d.ts +2 -2
  382. package/x/groupBy.js +2 -2
  383. package/x/pluck.d.ts +2 -2
  384. package/x/pluck.js +2 -2
  385. package/x/unionWith.test.js +3 -3
package/filter.js CHANGED
@@ -90,38 +90,74 @@ const _filter = function (value, predicate) {
90
90
  *
91
91
  * @synopsis
92
92
  * ```coffeescript [specscript]
93
- * type Filterable = Array|Object|Set|Generator|AsyncGenerator
93
+ * type Filterable = Array|Set|Map|Generator|AsyncGenerator|{ filter: function }|Object
94
94
  *
95
95
  * type Predicate = (
96
96
  * value any,
97
- * indexOrKey number|string,
98
- * collection Filterable,
97
+ * indexOrKey number|string|any,
98
+ * filt Filterable,
99
99
  * )=>boolean
100
100
  *
101
- * filter(f Map|Filterable, predicate Predicate) -> result Promise|Map|Filterable
102
- * filter(predicate Predicate)(f Map|Filterable) -> result Promise|Map|Filterable
101
+ * filter(filt Filterable, predicate Predicate) -> result Promise|Filterable
102
+ * filter(predicate Predicate)(filt Filterable) -> result Promise|Filterable
103
103
  * ```
104
104
  *
105
105
  * @description
106
- * Filter out items from a filterable. Returns a filterable of the same type.
106
+ * Filters out items from a filterable. Returns a filterable of the same type. The order of the items in the filterable is preserved.
107
107
  *
108
- * The following data types are considered filterable:
108
+ * The following data types are considered to be filterables:
109
109
  * * `array`
110
- * * `object`
111
110
  * * `set`
111
+ * * `map`
112
112
  * * `generator`
113
113
  * * `async generator`
114
+ * * `object with .filter method`
115
+ * * `object`
114
116
  *
115
117
  * The filtering operation is defined by a given predicate function. The predicate function dictates whether a given item from the filterable should be included in the returned filterable.
116
118
  *
117
119
  * ```javascript
118
120
  * const predicate = function (item) {
119
- * // condition is a boolean value involving item
121
+ * // condition is the boolean result of the predicate test on item
120
122
  * return condition
121
123
  * }
122
124
  * ```
123
125
  *
124
- * `filter` applies a provided predicate function to each item of a filterable, returning a filterable of the same type containing only the items with truthy conditions by the predicate. The order of the items is preserved.
126
+ * The predicate function signature changes depending on the provided filterable.
127
+ *
128
+ * If the filterable is an array:
129
+ * ```coffeescript [specscript]
130
+ * predicate(item any, index number, filt Array) -> condition Promise|boolean|any
131
+ * ```
132
+ *
133
+ * If the filterable is a set:
134
+ * ```coffeescript [specscript]
135
+ * predicate(item any, item any, filt Set) -> condition Promise|boolean|any
136
+ * ```
137
+ *
138
+ * If the filterable is a map:
139
+ * ```coffeescript [specscript]
140
+ * predicate(item any, key any, filt Map) -> condition Promise|boolean|any
141
+ * ```
142
+ *
143
+ * If the filterable is a generator:
144
+ * ```coffeescript [specscript]
145
+ * predicate(item any) -> condition Promise|boolean|any
146
+ * ```
147
+ *
148
+ * If the filterable is an async generator:
149
+ * ```coffeescript [specscript]
150
+ * predicate(item any) -> condition Promise|boolean|any
151
+ * ```
152
+ *
153
+ * If the filterable is an object with a `.filter` method, the predicate function signature is defined externally.
154
+ *
155
+ * If the filterable is a plain object:
156
+ * ```coffeescript [specscript]
157
+ * predicate(item any, key string, filt Object) -> condition Promise|boolean|any
158
+ * ```
159
+ *
160
+ * `filter` works for arrays.
125
161
  *
126
162
  * ```javascript [playground]
127
163
  * const isOdd = number => number % 2 == 1
@@ -132,7 +168,7 @@ const _filter = function (value, predicate) {
132
168
  * console.log(result) // [1, 3, 5]
133
169
  * ```
134
170
  *
135
- * The predicate may be asynchronous, in which case the returned promise is concurrently resolved for its boolean condition before deciding whether to include the corresponding item in the result.
171
+ * If the predicate is asynchronous, the returned promise is concurrently resolved for its boolean condition before continuing with the filtering operation.
136
172
  *
137
173
  * ```javascript [playground]
138
174
  * const asyncIsOdd = async number => number % 2 == 1
@@ -143,7 +179,7 @@ const _filter = function (value, predicate) {
143
179
  * promise.then(console.log) // [1, 3, 5]
144
180
  * ```
145
181
  *
146
- * For objects, `filter` applies the predicate function to just the values.
182
+ * `filter` applies the predicate function to just the values of an object.
147
183
  *
148
184
  * ```javascript [playground]
149
185
  * const isOdd = number => number % 2 == 1
@@ -154,7 +190,7 @@ const _filter = function (value, predicate) {
154
190
  * console.log(result) // { a: 1, c: 3, e: 5 }
155
191
  * ```
156
192
  *
157
- * For maps, `filter` applies the predicate to the values of the entries. The order of the entries is preserved.
193
+ * `filter` applies the predicate to the values of the entries of a map.
158
194
  *
159
195
  * ```javascript [playground]
160
196
  * const isOdd = number => number % 2 == 1
@@ -165,7 +201,7 @@ const _filter = function (value, predicate) {
165
201
  * console.log(result) // Map(3) { 'a' => 1, 'c' => 3, 'e' => 5 }
166
202
  * ```
167
203
  *
168
- * For generators, `filter` returns a lazily filtered generator. All values that are normally yielded by the generator that test falsy by the predicate are skipped.
204
+ * For generators, `filter` returns a lazily filtered generator. All values that are normally yielded by the generator that test false by the predicate are excluded from the returned generator.
169
205
  *
170
206
  * ```javascript [playground]
171
207
  * const isOdd = number => number % 2 == 1
@@ -192,7 +228,7 @@ const _filter = function (value, predicate) {
192
228
  * }
193
229
  * ```
194
230
  *
195
- * For async generators, `filter` returns a lazily filtered async generator. All values that are normally yielded by the async generator that test falsy by the predicate are skipped.
231
+ * For async generators, `filter` returns a lazily filtered async generator. All values that are normally yielded by the async generator that test falsy by the predicate are excluded from the returned async generator.
196
232
  *
197
233
  * ```javascript [playground]
198
234
  * const asyncIsOdd = async number => number % 2 == 1
@@ -229,6 +265,14 @@ const _filter = function (value, predicate) {
229
265
  * // [1, 3, 5]
230
266
  * ```
231
267
  *
268
+ * See also:
269
+ * * [forEach](/docs/forEach)
270
+ * * [map](/docs/map)
271
+ * * [reduce](/docs/reduce)
272
+ * * [transform](/docs/transform)
273
+ * * [flatMap](/docs/flatMap)
274
+ * * [some](/docs/some)
275
+ *
232
276
  * @execution concurrent
233
277
  *
234
278
  * @transducing
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.1
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) {
@@ -3274,11 +3282,15 @@ const omit = function (arg0, arg1) {
3274
3282
  return _omit(arg0, arg1)
3275
3283
  }
3276
3284
 
3277
- const thunkify = (func, ...args) => function thunk() {
3285
+ const thunkify = function (func, ...args) {
3278
3286
  if (areAnyValuesPromises(args)) {
3279
- return promiseAll(args).then(curry2(funcApply, func, __))
3287
+ return promiseAll(args).then(resolvedArgs => function thunk() {
3288
+ return func(...resolvedArgs)
3289
+ })
3290
+ }
3291
+ return function thunk() {
3292
+ return func(...args)
3280
3293
  }
3281
- return func(...args)
3282
3294
  }
3283
3295
 
3284
3296
  const curry = (func, ...args) => curryArity(func.length, func, 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