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/map.js CHANGED
@@ -93,37 +93,73 @@ const _map = function (value, f) {
93
93
  *
94
94
  * @synopsis
95
95
  * ```coffeescript [specscript]
96
- * type Functor = Array|Object|Set|Generator|AsyncGenerator
96
+ * type Functor = Array|Set|Map|Generator|AsyncGenerator|{ map: function }|Object
97
97
  *
98
98
  * type Mapper = (
99
99
  * item any,
100
100
  * indexOrKey number|string|any,
101
- * f Map|Functor
101
+ * ftor Functor
102
102
  * )=>(resultItem Promise|any)
103
103
  *
104
- * map(f Promise|Map|Functor, mapper Mapper) -> result Promise|Map|Functor
105
- * map(mapper Mapper)(f Map|Functor) -> result Promise|Map|Functor
104
+ * map(ftor Promise|Functor, mapper Mapper) -> result Promise|Functor
105
+ * map(mapper Mapper)(ftor Functor) -> result Promise|Functor
106
106
  * ```
107
107
  *
108
108
  * @description
109
- * Applies a mapper function to each item of a functor, returning a functor of the same type with the transformed items. The order of the items is maintained.
109
+ * Applies a mapper function to each item of a functor, returning a functor of the same type with the mapped items. The order of the items is maintained.
110
110
  *
111
- * The following data types are considered functors:
111
+ * The following data types are considered to be functors:
112
112
  * * `array`
113
- * * `object`
114
113
  * * `set`
115
- * * `iterator`
116
- * * `async iterator`
114
+ * * `map`
115
+ * * `generator`
116
+ * * `async generator`
117
+ * * `object with .map method`
118
+ * * `object`
117
119
  *
118
- * The mapper function defines the transformation of a given item in the provided functor.
120
+ * The mapper function defines a mapping between a given item in the functor to a resulting item in the returned functor.
119
121
  *
120
122
  * ```javascript
121
123
  * const mapper = function (item) {
122
- * // resultItem is the result of some operation on item
124
+ * // resultItem is the result of a mapping from item
123
125
  * return resultItem
124
126
  * }
125
127
  * ```
126
128
  *
129
+ * The mapper function signature changes depending on the provided functor.
130
+ *
131
+ * If the functor is an array:
132
+ * ```coffeescript [specscript]
133
+ * mapper(item any, index number, ftor Array) -> resultItem Promise|any
134
+ * ```
135
+ *
136
+ * If the functor is a set:
137
+ * ```coffeescript [specscript]
138
+ * mapper(item any, item any, ftor Set) -> resultItem Promise|any
139
+ * ```
140
+ *
141
+ * If the functor is a map:
142
+ * ```coffeescript [specscript]
143
+ * mapper(item any, key any, ftor Map) -> resultItem Promise|any
144
+ * ```
145
+ *
146
+ * If the functor is a generator:
147
+ * ```coffeescript [specscript]
148
+ * mapper(item any) -> resultItem Promise|any
149
+ * ```
150
+ *
151
+ * If the functor is an async generator:
152
+ * ```coffeescript [specscript]
153
+ * mapper(item any) -> resultItem Promise|any
154
+ * ```
155
+ *
156
+ * If the functor is an object with a `.map` method, the mapper function signature is defined externally.
157
+ *
158
+ * If the functor is a plain object:
159
+ * ```coffeescript [specscript]
160
+ * mapper(item any, key string, ftor Object) -> resultItem Promise|any
161
+ * ```
162
+ *
127
163
  * `map` works for arrays.
128
164
  *
129
165
  * ```javascript [playground]
@@ -146,7 +182,7 @@ const _map = function (value, f) {
146
182
  * promise.then(console.log) // [1, 4, 9, 16, 25]
147
183
  * ```
148
184
  *
149
- * For objects, `map` applies the mapper function to just the values.
185
+ * `map` applies the mapper function to just the values of an object.
150
186
  *
151
187
  * ```javascript [playground]
152
188
  * const square = number => number ** 2
@@ -157,7 +193,7 @@ const _map = function (value, f) {
157
193
  * console.log(result) // { a: 1, b: 4, c: 9, d: 16, e: 25 }
158
194
  * ```
159
195
  *
160
- * For maps, `map` applies the mapper function to the values of the entries.
196
+ * `map` applies the mapper function to the values of the entries of a map.
161
197
  *
162
198
  * ```javascript [playground]
163
199
  * const square = number => number ** 2
@@ -168,7 +204,7 @@ const _map = function (value, f) {
168
204
  * console.log(result) // Map { 'a' => 1, 'b' => 4, 'c' => 9, 'd' => 16, 'e' => 25 }
169
205
  * ```
170
206
  *
171
- * For generators, `map` applies the mapper function lazily to each value of the iterator, creating a new iterator with transformed items.
207
+ * `map` applies the mapper function lazily to each value of a generator, creating a new generator with mapped items.
172
208
  *
173
209
  * ```javascript [playground]
174
210
  * const capitalize = string => string.toUpperCase()
@@ -185,7 +221,7 @@ const _map = function (value, f) {
185
221
  * console.log([...ABCGenerator]) // ['A', 'B', 'C']
186
222
  * ```
187
223
  *
188
- * For async generators, `map` applies the mapper function lazily to each value of the async generator, creating a new async generator with transformed items.
224
+ * `map` applies the mapper function lazily to each value of an async generator, creating a new async generator with mapped items.
189
225
  *
190
226
  * ```javascript [playground]
191
227
  * const capitalize = string => string.toUpperCase()
@@ -223,6 +259,17 @@ const _map = function (value, f) {
223
259
  * // [1, 4, 9, 16, 25]
224
260
  * ```
225
261
  *
262
+ * See also:
263
+ * * [forEach](/docs/forEach)
264
+ * * [map.entries](/docs/map.entries)
265
+ * * [map.series](/docs/map.series)
266
+ * * [map.pool](/docs/map.pool)
267
+ * * [filter](/docs/filter)
268
+ * * [reduce](/docs/reduce)
269
+ * * [transform](/docs/transform)
270
+ * * [flatMap](/docs/flatMap)
271
+ * * [some](/docs/some)
272
+ *
226
273
  * @execution concurrent
227
274
  *
228
275
  * @TODO streamMap
@@ -255,23 +302,49 @@ const _mapEntries = (value, f) => {
255
302
  *
256
303
  * @synopsis
257
304
  * ```coffeescript [specscript]
258
- * type EntriesMappable = Object|Map
305
+ * type FunctorWithEntries = Map|Object
259
306
  *
260
- * type Mapper = (
261
- * value any,
262
- * key string|any,
263
- * collection EntriesMappable
264
- * )=>(resultItem Promise|any)
307
+ * type EntryMapper = (
308
+ * entry [key string|any, value any],
309
+ * )=>(resultEntry Promise|[resultKey string|any, resultItem any])
265
310
  *
266
- * map.entries(value Promise|EntriesMappable, f Mapper)
267
- * -> Promise|EntriesMappable
311
+ * map.entries(
312
+ * value Promise|FunctorWithEntries,
313
+ * mapper EntryMapper
314
+ * ) -> Promise|FunctorWithEntries
268
315
  *
269
- * map.entries(f Mapper)(value EntriesMappable)
270
- * -> Promise|EntriesMappable
316
+ * map.entries(mapper EntryMapper)(value FunctorWithEntries)
317
+ * -> Promise|FunctorWithEntries
271
318
  * ```
272
319
  *
273
320
  * @description
274
- * `map` over the entries rather than the values of a collection. Accepts collections of type `Map` or `Object`.
321
+ * `map` over the entries of a functor as opposed to the values.
322
+ *
323
+ * The following data types are considered to be functors with entries:
324
+ * * `map`
325
+ * * `object`
326
+ *
327
+ * The signature of the mapper function changes depending on the provided functor:
328
+ *
329
+ * If the functor is a map:
330
+ *
331
+ * ```coffeescript [specscript]
332
+ * mapper(entry [key any, value any]) -> resultEntry Promise|[
333
+ * resultKey any,
334
+ * resultValue any,
335
+ * ]
336
+ * ```
337
+ *
338
+ * If the functor is an object:
339
+ *
340
+ * ```coffeescript [specscript]
341
+ * mapper(entry [key string, value any]) -> resultEntry Promise|[
342
+ * resultKey string,
343
+ * resultValue any,
344
+ * ]
345
+ * ```
346
+ *
347
+ * `map.entries` works for objects and maps.
275
348
  *
276
349
  * ```javascript [playground]
277
350
  * const upperCaseKeysAndSquareValues =
@@ -296,6 +369,17 @@ const _mapEntries = (value, f) => {
296
369
  * // { a: 1, b: 4, c: 9 }
297
370
  * ```
298
371
  *
372
+ * See also:
373
+ * * [forEach](/docs/forEach)
374
+ * * [map](/docs/map)
375
+ * * [map.series](/docs/map.series)
376
+ * * [map.pool](/docs/map.pool)
377
+ * * [filter](/docs/filter)
378
+ * * [reduce](/docs/reduce)
379
+ * * [transform](/docs/transform)
380
+ * * [flatMap](/docs/flatMap)
381
+ * * [some](/docs/some)
382
+ *
299
383
  * @since v1.7.0
300
384
  */
301
385
  map.entries = function mapEntries(arg0, arg1) {
@@ -351,16 +435,21 @@ const _mapSeries = function (collection, f) {
351
435
  *
352
436
  * @synopsis
353
437
  * ```coffeescript [specscript]
354
- * type Functor = Array|Object|Set|Map
438
+ * type MapSeriesFunctor = Array|Object|Set|Map
355
439
  *
356
440
  * type Mapper = (
357
441
  * value any,
358
442
  * indexOrKey number|string|any,
359
- * f Functor
443
+ * ftor MapSeriesFunctor,
360
444
  * )=>(mappedItem Promise|any)
361
445
  *
362
- * map.series(f Promise|Functor, f Mapper) -> result Functor
363
- * map.series(f Mapper)(f Functor) -> result Functor
446
+ * map.series(
447
+ * ftor Promise|MapSeriesFunctor,
448
+ * mapper Mapper
449
+ * ) -> result MapSeriesFunctor
450
+ *
451
+ * map.series(mapper Mapper)(ftor MapSeriesFunctor)
452
+ * -> result MapSeriesFunctor
364
453
  * ```
365
454
  *
366
455
  * @description
@@ -387,6 +476,17 @@ const _mapSeries = function (collection, f) {
387
476
  * // [1, 4, 9, 16, 25]
388
477
  * ```
389
478
  *
479
+ * See also:
480
+ * * [forEach](/docs/forEach)
481
+ * * [map](/docs/map)
482
+ * * [map.entries](/docs/map.entries)
483
+ * * [map.pool](/docs/map.pool)
484
+ * * [filter](/docs/filter)
485
+ * * [reduce](/docs/reduce)
486
+ * * [transform](/docs/transform)
487
+ * * [flatMap](/docs/flatMap)
488
+ * * [some](/docs/some)
489
+ *
390
490
  * @execution series
391
491
  */
392
492
  map.series = function mapSeries(arg0, arg1) {
@@ -435,18 +535,24 @@ const _mapPool = function (f, concurrency, mapper) {
435
535
  *
436
536
  * @synopsis
437
537
  * ```coffeescript [specscript]
438
- * type Functor = Array|Object|Set|Map
538
+ * type MapPoolFunctor = Array|Object|Set|Map
539
+ *
540
+ * type Mapper = (
541
+ * item any,
542
+ * indexOrKey number|string|any,
543
+ * ftor Functor
544
+ * )=>(resultItem Promise|any)
439
545
  *
440
546
  * map.pool(
547
+ * ftor MapPoolFunctor,
441
548
  * concurrency number,
442
- * mapper (value any)=>Promise|any,
443
- * )(f Functor) -> result Promise|Array
549
+ * mapper Mapper
550
+ * ) -> result Promise|Array
444
551
  *
445
552
  * map.pool(
446
- * f Functor,
447
553
  * concurrency number,
448
- * mapper (value any)=>Promise|any,
449
- * ) -> result Promise|Array
554
+ * mapper Mapper
555
+ * )(ftor MapPoolFunctor) -> result Promise|Array
450
556
  * ```
451
557
  *
452
558
  * @description
@@ -477,6 +583,17 @@ const _mapPool = function (f, concurrency, mapper) {
477
583
  * // [1, 4, 9, 16, 25]
478
584
  * ```
479
585
  *
586
+ * See also:
587
+ * * [forEach](/docs/forEach)
588
+ * * [map](/docs/map)
589
+ * * [map.entries](/docs/map.entries)
590
+ * * [map.series](/docs/map.series)
591
+ * * [filter](/docs/filter)
592
+ * * [reduce](/docs/reduce)
593
+ * * [transform](/docs/transform)
594
+ * * [flatMap](/docs/flatMap)
595
+ * * [some](/docs/some)
596
+ *
480
597
  * @TODO objectMapPool
481
598
  *
482
599
  * @execution concurrent
package/not.js CHANGED
@@ -53,6 +53,13 @@ const _not = function (args, predicate) {
53
53
  *
54
54
  * not(Promise.resolve(3), isOdd).then(console.log) // false
55
55
  * ```
56
+ *
57
+ * See also:
58
+ * * [some](/docs/some)
59
+ * * [and](/docs/and)
60
+ * * [or](/docs/or)
61
+ * * [eq](/docs/eq)
62
+ *
56
63
  */
57
64
 
58
65
  const not = function (...args) {
package/omit.d.ts CHANGED
@@ -14,8 +14,8 @@ export = omit;
14
14
  *
15
15
  * ```javascript [playground]
16
16
  * console.log(
17
- * omit({ _id: '1', name: 'George' }, ['_id']),
18
- * ) // { name: 'George' }
17
+ * omit({ _id: '1', name: 'John' }, ['_id']),
18
+ * ) // { name: 'John' }
19
19
  * ```
20
20
  *
21
21
  * `omit` supports three types of path patterns for nested property access
package/omit.js CHANGED
@@ -30,8 +30,8 @@ const _omit = function (source, paths) {
30
30
  *
31
31
  * ```javascript [playground]
32
32
  * console.log(
33
- * omit({ _id: '1', name: 'George' }, ['_id']),
34
- * ) // { name: 'George' }
33
+ * omit({ _id: '1', name: 'John' }, ['_id']),
34
+ * ) // { name: 'John' }
35
35
  * ```
36
36
  *
37
37
  * `omit` supports three types of path patterns for nested property access
@@ -69,6 +69,15 @@ const _omit = function (source, paths) {
69
69
  * omit(Promise.resolve({ a: 1, b: 2, c: 3 }), ['a', 'b']).then(console.log)
70
70
  * // { c: 3 }
71
71
  * ```
72
+ *
73
+ * See also:
74
+ * * [pipe](/docs/pipe)
75
+ * * [all](/docs/all)
76
+ * * [assign](/docs/assign)
77
+ * * [get](/docs/get)
78
+ * * [set](/docs/set)
79
+ * * [pick](/docs/pick)
80
+ * * [forEach](/docs/forEach)
72
81
  */
73
82
  const omit = function (arg0, arg1) {
74
83
  if (arg1 == null) {
package/or.js CHANGED
@@ -138,6 +138,12 @@ const areAnyPredicatesTruthy = function (args, predicates) {
138
138
  * ]).then(console.log) // true
139
139
  * ```
140
140
  *
141
+ * See also:
142
+ * * [some](/docs/some)
143
+ * * [and](/docs/and)
144
+ * * [not](/docs/not)
145
+ * * [eq](/docs/eq)
146
+ *
141
147
  * @execution series
142
148
  *
143
149
  * @note ...args slows down here by an order of magnitude
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rubico",
3
- "version": "2.6.6",
3
+ "version": "2.7.1",
4
4
  "description": "[a]synchronous functional programming",
5
5
  "author": "Richard Tong",
6
6
  "license": "MIT",
package/pick.js CHANGED
@@ -69,6 +69,15 @@ const _pick = function (source, keys) {
69
69
  * pick(Promise.resolve({ a: 1, b: 2, c: 3 }), ['a', 'b']).then(console.log)
70
70
  * // { a: 1, b: 2 }
71
71
  * ```
72
+ *
73
+ * See also:
74
+ * * [pipe](/docs/pipe)
75
+ * * [all](/docs/all)
76
+ * * [assign](/docs/assign)
77
+ * * [get](/docs/get)
78
+ * * [set](/docs/set)
79
+ * * [omit](/docs/omit)
80
+ * * [forEach](/docs/forEach)
72
81
  */
73
82
  const pick = function (arg0, arg1) {
74
83
  if (arg1 == null) {
package/pipe.js CHANGED
@@ -10,13 +10,19 @@ const __ = require('./_internal/placeholder')
10
10
  *
11
11
  * @synopsis
12
12
  * ```coffeescript [specscript]
13
- * pipe(funcs Array<function>)(...args) -> result Promise|any
13
+ * funcs Array<function>
14
+ * args Array<any>
15
+ * argsWithPromises Array<Promise|any>
14
16
  *
15
- * pipe(...args, funcs Array<function>) -> result Promise|any
17
+ * pipe(funcs)(...args) -> result Promise|any
18
+ *
19
+ * pipe(...argsWithPromises, funcs Array<function>) -> result Promise|any
20
+ *
21
+ * pipe(...funcs)(...args) -> result Promise|any
16
22
  * ```
17
23
  *
18
24
  * @description
19
- * Creates a function pipeline from an array of functions, where each function passes its return value as a single argument to the next function until all functions have executed. The first function is called with the arguments to the pipeline, while the result of the pipeline execution is the return of its last function. If any function of the pipeline is asynchronous, the result of the execution is a Promise.
25
+ * Creates a function pipeline from multiple functions. Each function in the pipeline is evaluated in series, passing its return value as an argument to the next function. The result of a pipeline execution is the return value of the last function in the pipeline. If any function in the pipeline is asynchronous, the result of the pipeline execution is a Promise.
20
26
  *
21
27
  * ```javascript [playground]
22
28
  * const syncAdd123 = pipe([
@@ -36,6 +42,17 @@ const __ = require('./_internal/placeholder')
36
42
  * asyncAdd123(5).then(console.log) // 11
37
43
  * ```
38
44
  *
45
+ * `pipe` supports a mathematical API.
46
+ *
47
+ * ```javascript [playground]
48
+ * const appendB = x => x + 'b'
49
+ * const appendC = x => x + 'c'
50
+ *
51
+ * const appendBC = pipe(appendB, appendC)
52
+ *
53
+ * console.log(appendBC('a')) // 'abc'
54
+ * ```
55
+ *
39
56
  * When passed any amount of arguments before the array of functions, `pipe` executes eagerly; the array of functions is immediately invoked with the supplied arguments.
40
57
  *
41
58
  * ```javascript [playground]
@@ -54,6 +71,12 @@ const __ = require('./_internal/placeholder')
54
71
  * ])
55
72
  * ```
56
73
  *
74
+ * See also:
75
+ * * [compose](/docs/compose)
76
+ * * [tap](/docs/tap)
77
+ * * [switchCase](/docs/switchCase)
78
+ * * [tryCatch](/docs/tryCatch)
79
+ *
57
80
  * @execution series
58
81
  *
59
82
  * @transducing
@@ -61,6 +84,10 @@ const __ = require('./_internal/placeholder')
61
84
  * @since 1.6.0
62
85
  */
63
86
  const pipe = function (...args) {
87
+ if (typeof args[0] == 'function') {
88
+ return args.reduce(funcConcat)
89
+ }
90
+
64
91
  const funcs = args.pop()
65
92
  const pipeline = funcs.reduce(funcConcat)
66
93
 
package/reduce.js CHANGED
@@ -3,17 +3,17 @@ const __ = require('./_internal/placeholder')
3
3
  const curry3 = require('./_internal/curry3')
4
4
  const genericReduce = require('./_internal/genericReduce')
5
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)
6
+ // _reduce(collection any, reducer function, initial function|any) -> Promise
7
+ const _reduce = function (collection, reducer, initial) {
8
+ if (typeof initial == 'function') {
9
+ const actualInitialValue = initial(collection)
10
10
  return isPromise(actualInitialValue)
11
11
  ? actualInitialValue.then(curry3(genericReduce, collection, reducer, __))
12
12
  : genericReduce(collection, reducer, actualInitialValue)
13
13
  }
14
- return isPromise(initialValue)
15
- ? initialValue.then(curry3(genericReduce, collection, reducer, __))
16
- : genericReduce(collection, reducer, initialValue)
14
+ return isPromise(initial)
15
+ ? initial.then(curry3(genericReduce, collection, reducer, __))
16
+ : genericReduce(collection, reducer, initial)
17
17
  }
18
18
 
19
19
  /**
@@ -21,55 +21,110 @@ const _reduce = function (collection, reducer, initialValue) {
21
21
  *
22
22
  * @synopsis
23
23
  * ```coffeescript [specscript]
24
- * type Foldable = Iterable|AsyncIterable|Object<value any>
24
+ * type Foldable = Array|Set|Map|Generator|AsyncGenerator|{ reduce: function }|Object
25
25
  *
26
26
  * type Reducer = (
27
27
  * accumulator any,
28
28
  * item any,
29
- * indexOrKey? number|string,
30
- * f? Map|Foldable,
29
+ * indexOrKey number|string|any,
30
+ * fold Foldable
31
31
  * )=>(nextAccumulator Promise|any)
32
32
  *
33
- * type Resolver = (f Map|Foldable)=>Promise|any
33
+ * type Resolver = (fold Foldable)=>Promise|any
34
34
  *
35
35
  * reduce(
36
- * f Map|Foldable,
36
+ * fold Foldable,
37
37
  * reducer Reducer,
38
- * initialValue? Resolver|any
38
+ * initial? Resolver|any
39
39
  * ) -> result Promise|any
40
40
  *
41
41
  * reduce(
42
42
  * reducer Reducer,
43
- * initialValue? Resolver|any
44
- * )(f Map|Foldable) -> result Promise|any
43
+ * initial? Resolver|any
44
+ * )(fold Foldable) -> result Promise|any
45
45
  * ```
46
46
  *
47
47
  * @description
48
- * Reduces a map or foldable to a single value.
48
+ * Reduces a foldable to a single value.
49
49
  *
50
- * The following data types are considered foldables:
51
- * * `iterable`
52
- * * `async iterable`
53
- * * `object`; only the values of the object are transformed
54
- *
55
- * The following data types are considered iterable:
50
+ * The following data types are considered to be foldables:
56
51
  * * `array`
57
52
  * * `set`
58
53
  * * `map`
54
+ * * `generator`
55
+ * * `async generator`
56
+ * * `object with .reduce method`
57
+ * * `object`
59
58
  *
60
- * The reducing operation is dictated by a provided reducer function, which defines a transformation between the accumulator and a given item of the map or foldable.
59
+ * The reducing operation is dictated by a provided reducer function, which defines a transformation between the accumulator and a given item of the foldable.
61
60
  *
62
61
  * ```javascript
63
62
  * const reducer = function (accumulator, item) {
64
- * const nextAccumulator = f(accumulator, item)
63
+ * // nextAccumulator is the result of some operation between accumulator and item
64
+ * // and becomes the accumulator for the next iteration and invocation of the reducer
65
65
  * return nextAccumulator
66
- * // nextAccumulator becomes the accumulator for the next iteration and invocation of the reducer
67
66
  * }
68
67
  * ```
69
68
  *
70
- * The result of the last invocation of the reducer is the result of the reducing operation. The reducer may be asynchronous and return a promise, in which case the promise is resolved for its value before continuing with the reducing operation.
69
+ * The reducer function signature changes depending on the provided foldable.
70
+ *
71
+ * If the foldable is an array:
72
+ * ```coffeescript [specscript]
73
+ * reducer(
74
+ * accumulator any,
75
+ * item any,
76
+ * index number,
77
+ * fold Array
78
+ * ) -> nextAccumulator Promise|any
79
+ * ```
80
+ *
81
+ * If the foldable is a set:
82
+ * ```coffeescript [specscript]
83
+ * reducer(
84
+ * accumulator any,
85
+ * item any
86
+ * ) -> nextAccumulator Promise|any
87
+ * ```
88
+ *
89
+ * If the foldable is a map:
90
+ * ```coffeescript [specscript]
91
+ * reducer(
92
+ * accumulator any,
93
+ * item any,
94
+ * key any,
95
+ * fold Map
96
+ * ) -> nextAccumulator Promise|any
97
+ * ```
98
+ *
99
+ * If the foldable is a generator:
100
+ * ```coffeescript [specscript]
101
+ * reducer(
102
+ * accumulator any,
103
+ * item any
104
+ * ) -> nextAccumulator Promise|any
105
+ * ```
106
+ *
107
+ * If the foldable is a async generator:
108
+ * ```coffeescript [specscript]
109
+ * reducer(
110
+ * accumulator any,
111
+ * item any
112
+ * ) -> nextAccumulator Promise|any
113
+ * ```
114
+ *
115
+ * If the foldable is an object with a `.reduce` method, the reducer function signature is defined externally.
71
116
  *
72
- * `reduce` executes a reducer function for each item of the array in order. If no initial value is provided, `reduce` uses the first item of the map or foldable as the initial value and starts iterating from the second item of the map or foldable.
117
+ * If the foldable is a plain object:
118
+ * ```coffeescript [specscript]
119
+ * reducer(
120
+ * accumulator any,
121
+ * item any,
122
+ * key string,
123
+ * fold Object
124
+ * ) -> nextAccumulator Promise|any
125
+ * ```
126
+ *
127
+ * `reduce` executes a reducer function for each item of the array in order. If no initial value is provided, `reduce` uses the first item of the foldable as the initial value and starts iterating from the second item of the foldable.
73
128
  *
74
129
  * ```javascript [playground]
75
130
  * const max = (a, b) => a > b ? a : b
@@ -78,7 +133,7 @@ const _reduce = function (collection, reducer, initialValue) {
78
133
  * console.log(result) // 5
79
134
  * ```
80
135
  *
81
- * If an initial value is provided, the accumulator starts as the initial value rather than the first item of the map or foldable.
136
+ * If an initial value is provided, the accumulator starts as the initial value rather than the first item of the foldable.
82
137
  *
83
138
  * ```javascript [playground]
84
139
  * const add = (a, b) => a + b
@@ -87,7 +142,16 @@ const _reduce = function (collection, reducer, initialValue) {
87
142
  * console.log(result) // 15
88
143
  * ```
89
144
  *
90
- * If the initialization parameter is a function, it is treated as a resolver of the initial value and called with the map or foldable.
145
+ * If the reducer is asynchronous, all promises created by the reducer are resolved before continuing with the reducing operation.
146
+ *
147
+ * ```javascript [playground]
148
+ * const asyncAdd = async (a, b) => a + b
149
+ *
150
+ * const promise = reduce([1, 2, 3, 4, 5], asyncAdd, 0)
151
+ * promise.then(console.log) // 15
152
+ * ```
153
+ *
154
+ * If the initialization parameter is a function, it is treated as a resolver of the initial value and called with the foldable.
91
155
  *
92
156
  * ```javascript [playground]
93
157
  * const concatSquares = (array, value) => array.concat(value ** 2)
@@ -122,7 +186,7 @@ const _reduce = function (collection, reducer, initialValue) {
122
186
  * console.log(result) // 15
123
187
  * ```
124
188
  *
125
- * `reduce` works for async iterators.
189
+ * `reduce` works for async generators.
126
190
  *
127
191
  * ```javascript [playground]
128
192
  * const asyncAdd = async (a, b) => a + b
@@ -142,6 +206,23 @@ const _reduce = function (collection, reducer, initialValue) {
142
206
  * reduce(Promise.resolve([1, 2, 3, 4, 5]), add, 0).then(console.log) // 15
143
207
  * ```
144
208
  *
209
+ * Any promises passed for the initial value are also resolved before further execution.
210
+ *
211
+ * ```javascript [playground]
212
+ * const add = (a, b) => a + b
213
+ *
214
+ * const promise = reduce([1, 2, 3, 4, 5], add, Promise.resolve(0))
215
+ * promise.then(console.log) // 15
216
+ * ```
217
+ *
218
+ * See also:
219
+ * * [forEach](/docs/forEach)
220
+ * * [map](/docs/map)
221
+ * * [filter](/docs/filter)
222
+ * * [transform](/docs/transform)
223
+ * * [flatMap](/docs/flatMap)
224
+ * * [some](/docs/some)
225
+ *
145
226
  * @execution series
146
227
  *
147
228
  * @transducing