rubico 2.8.6 → 2.10.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 (378) hide show
  1. package/README.md +1 -1
  2. package/_internal/FlatMappingAsyncIterator.js +41 -30
  3. package/_internal/LinkedList.js +54 -0
  4. package/_internal/LinkedList.test.js +34 -0
  5. package/_internal/MappingAsyncIterator.js +65 -15
  6. package/_internal/SerialMappingAsyncIterator.js +79 -0
  7. package/_internal/iteratorFind.js +0 -2
  8. package/_internal/iteratorForEachSeries.js +1 -1
  9. package/_internal/objectFlatten.js +4 -1
  10. package/all.js +7 -8
  11. package/and.js +1 -1
  12. package/assign.js +1 -1
  13. package/compose.js +1 -1
  14. package/curry.js +1 -1
  15. package/dist/Transducer.es.js +1 -1
  16. package/dist/Transducer.es.min.js +1 -1
  17. package/dist/Transducer.js +1 -1
  18. package/dist/Transducer.min.js +1 -1
  19. package/dist/Transducer.mjs +1 -1
  20. package/dist/__.es.js +1 -1
  21. package/dist/__.es.min.js +1 -1
  22. package/dist/__.js +1 -1
  23. package/dist/__.min.js +1 -1
  24. package/dist/__.mjs +1 -1
  25. package/dist/all.es.js +1 -1
  26. package/dist/all.es.min.js +1 -1
  27. package/dist/all.js +1 -1
  28. package/dist/all.min.js +1 -1
  29. package/dist/all.mjs +1 -1
  30. package/dist/always.es.js +1 -1
  31. package/dist/always.es.min.js +1 -1
  32. package/dist/always.js +1 -1
  33. package/dist/always.min.js +1 -1
  34. package/dist/always.mjs +1 -1
  35. package/dist/and.es.js +1 -1
  36. package/dist/and.es.min.js +1 -1
  37. package/dist/and.js +1 -1
  38. package/dist/and.min.js +1 -1
  39. package/dist/and.mjs +1 -1
  40. package/dist/assign.es.js +1 -1
  41. package/dist/assign.es.min.js +1 -1
  42. package/dist/assign.js +1 -1
  43. package/dist/assign.min.js +1 -1
  44. package/dist/assign.mjs +1 -1
  45. package/dist/compose.es.js +1 -1
  46. package/dist/compose.es.min.js +1 -1
  47. package/dist/compose.js +1 -1
  48. package/dist/compose.min.js +1 -1
  49. package/dist/compose.mjs +1 -1
  50. package/dist/curry.es.js +1 -1
  51. package/dist/curry.es.min.js +1 -1
  52. package/dist/curry.js +1 -1
  53. package/dist/curry.min.js +1 -1
  54. package/dist/curry.mjs +1 -1
  55. package/dist/eq.es.js +1 -1
  56. package/dist/eq.es.min.js +1 -1
  57. package/dist/eq.js +1 -1
  58. package/dist/eq.min.js +1 -1
  59. package/dist/eq.mjs +1 -1
  60. package/dist/every.es.js +1 -1
  61. package/dist/every.es.min.js +1 -1
  62. package/dist/every.js +1 -1
  63. package/dist/every.min.js +1 -1
  64. package/dist/every.mjs +1 -1
  65. package/dist/filter.es.js +4 -4
  66. package/dist/filter.es.min.js +2 -2
  67. package/dist/filter.js +4 -4
  68. package/dist/filter.min.js +2 -2
  69. package/dist/filter.mjs +4 -4
  70. package/dist/flatMap.es.js +44 -28
  71. package/dist/flatMap.es.min.js +2 -2
  72. package/dist/flatMap.js +44 -28
  73. package/dist/flatMap.min.js +2 -2
  74. package/dist/flatMap.mjs +44 -28
  75. package/dist/forEach.es.js +6 -6
  76. package/dist/forEach.es.min.js +2 -2
  77. package/dist/forEach.js +6 -6
  78. package/dist/forEach.min.js +2 -2
  79. package/dist/forEach.mjs +6 -6
  80. package/dist/get.es.js +1 -1
  81. package/dist/get.es.min.js +1 -1
  82. package/dist/get.js +1 -1
  83. package/dist/get.min.js +1 -1
  84. package/dist/get.mjs +1 -1
  85. package/dist/gt.es.js +1 -1
  86. package/dist/gt.es.min.js +1 -1
  87. package/dist/gt.js +1 -1
  88. package/dist/gt.min.js +1 -1
  89. package/dist/gt.mjs +1 -1
  90. package/dist/gte.es.js +1 -1
  91. package/dist/gte.es.min.js +1 -1
  92. package/dist/gte.js +1 -1
  93. package/dist/gte.min.js +1 -1
  94. package/dist/gte.mjs +1 -1
  95. package/dist/lt.es.js +1 -1
  96. package/dist/lt.es.min.js +1 -1
  97. package/dist/lt.js +1 -1
  98. package/dist/lt.min.js +1 -1
  99. package/dist/lt.mjs +1 -1
  100. package/dist/lte.es.js +1 -1
  101. package/dist/lte.es.min.js +1 -1
  102. package/dist/lte.js +1 -1
  103. package/dist/lte.min.js +1 -1
  104. package/dist/lte.mjs +1 -1
  105. package/dist/map.es.js +187 -39
  106. package/dist/map.es.min.js +2 -2
  107. package/dist/map.js +187 -39
  108. package/dist/map.min.js +2 -2
  109. package/dist/map.mjs +187 -39
  110. package/dist/not.es.js +1 -1
  111. package/dist/not.es.min.js +1 -1
  112. package/dist/not.js +1 -1
  113. package/dist/not.min.js +1 -1
  114. package/dist/not.mjs +1 -1
  115. package/dist/omit.es.js +1 -1
  116. package/dist/omit.es.min.js +1 -1
  117. package/dist/omit.js +1 -1
  118. package/dist/omit.min.js +1 -1
  119. package/dist/omit.mjs +1 -1
  120. package/dist/or.es.js +1 -1
  121. package/dist/or.es.min.js +1 -1
  122. package/dist/or.js +1 -1
  123. package/dist/or.min.js +1 -1
  124. package/dist/or.mjs +1 -1
  125. package/dist/pick.es.js +1 -1
  126. package/dist/pick.es.min.js +1 -1
  127. package/dist/pick.js +1 -1
  128. package/dist/pick.min.js +1 -1
  129. package/dist/pick.mjs +1 -1
  130. package/dist/pipe.es.js +1 -1
  131. package/dist/pipe.es.min.js +1 -1
  132. package/dist/pipe.js +1 -1
  133. package/dist/pipe.min.js +1 -1
  134. package/dist/pipe.mjs +1 -1
  135. package/dist/reduce.es.js +1 -1
  136. package/dist/reduce.es.min.js +1 -1
  137. package/dist/reduce.js +1 -1
  138. package/dist/reduce.min.js +1 -1
  139. package/dist/reduce.mjs +1 -1
  140. package/dist/rubico.es.js +233 -78
  141. package/dist/rubico.es.min.js +2 -2
  142. package/dist/rubico.global.js +233 -78
  143. package/dist/rubico.global.min.js +2 -2
  144. package/dist/rubico.js +233 -78
  145. package/dist/rubico.min.js +2 -2
  146. package/dist/rubico.mjs +233 -78
  147. package/dist/set.es.js +1 -1
  148. package/dist/set.es.min.js +1 -1
  149. package/dist/set.js +1 -1
  150. package/dist/set.min.js +1 -1
  151. package/dist/set.mjs +1 -1
  152. package/dist/some.es.js +1 -1
  153. package/dist/some.es.min.js +1 -1
  154. package/dist/some.js +1 -1
  155. package/dist/some.min.js +1 -1
  156. package/dist/some.mjs +1 -1
  157. package/dist/switchCase.es.js +1 -1
  158. package/dist/switchCase.es.min.js +1 -1
  159. package/dist/switchCase.js +1 -1
  160. package/dist/switchCase.min.js +1 -1
  161. package/dist/switchCase.mjs +1 -1
  162. package/dist/tap.es.js +1 -1
  163. package/dist/tap.es.min.js +1 -1
  164. package/dist/tap.js +1 -1
  165. package/dist/tap.min.js +1 -1
  166. package/dist/tap.mjs +1 -1
  167. package/dist/thunkify.es.js +1 -1
  168. package/dist/thunkify.es.min.js +1 -1
  169. package/dist/thunkify.js +1 -1
  170. package/dist/thunkify.min.js +1 -1
  171. package/dist/thunkify.mjs +1 -1
  172. package/dist/transform.es.js +1 -1
  173. package/dist/transform.es.min.js +1 -1
  174. package/dist/transform.js +1 -1
  175. package/dist/transform.min.js +1 -1
  176. package/dist/transform.mjs +1 -1
  177. package/dist/tryCatch.es.js +1 -1
  178. package/dist/tryCatch.es.min.js +1 -1
  179. package/dist/tryCatch.js +1 -1
  180. package/dist/tryCatch.min.js +1 -1
  181. package/dist/tryCatch.mjs +1 -1
  182. package/dist/x/append.es.js +1 -1
  183. package/dist/x/append.es.min.js +1 -1
  184. package/dist/x/append.js +1 -1
  185. package/dist/x/append.min.js +1 -1
  186. package/dist/x/append.mjs +1 -1
  187. package/dist/x/callProp.es.js +1 -1
  188. package/dist/x/callProp.es.min.js +1 -1
  189. package/dist/x/callProp.js +1 -1
  190. package/dist/x/callProp.min.js +1 -1
  191. package/dist/x/callProp.mjs +1 -1
  192. package/dist/x/defaultsDeep.es.js +1 -1
  193. package/dist/x/defaultsDeep.es.min.js +1 -1
  194. package/dist/x/defaultsDeep.js +1 -1
  195. package/dist/x/defaultsDeep.min.js +1 -1
  196. package/dist/x/defaultsDeep.mjs +1 -1
  197. package/dist/x/differenceWith.es.js +1 -1
  198. package/dist/x/differenceWith.es.min.js +1 -1
  199. package/dist/x/differenceWith.js +1 -1
  200. package/dist/x/differenceWith.min.js +1 -1
  201. package/dist/x/differenceWith.mjs +1 -1
  202. package/dist/x/filterOut.es.js +4 -4
  203. package/dist/x/filterOut.es.min.js +2 -2
  204. package/dist/x/filterOut.js +4 -4
  205. package/dist/x/filterOut.min.js +2 -2
  206. package/dist/x/filterOut.mjs +4 -4
  207. package/dist/x/find.es.js +1 -3
  208. package/dist/x/find.es.min.js +1 -1
  209. package/dist/x/find.js +1 -3
  210. package/dist/x/find.min.js +1 -1
  211. package/dist/x/find.mjs +1 -3
  212. package/dist/x/findIndex.es.js +1 -1
  213. package/dist/x/findIndex.es.min.js +1 -1
  214. package/dist/x/findIndex.js +1 -1
  215. package/dist/x/findIndex.min.js +1 -1
  216. package/dist/x/findIndex.mjs +1 -1
  217. package/dist/x/first.es.js +1 -1
  218. package/dist/x/first.es.min.js +1 -1
  219. package/dist/x/first.js +1 -1
  220. package/dist/x/first.min.js +1 -1
  221. package/dist/x/first.mjs +1 -1
  222. package/dist/x/flatten.es.js +44 -28
  223. package/dist/x/flatten.es.min.js +2 -2
  224. package/dist/x/flatten.js +44 -28
  225. package/dist/x/flatten.min.js +2 -2
  226. package/dist/x/flatten.mjs +44 -28
  227. package/dist/x/groupBy.es.js +1 -1
  228. package/dist/x/groupBy.es.min.js +1 -1
  229. package/dist/x/groupBy.js +1 -1
  230. package/dist/x/groupBy.min.js +1 -1
  231. package/dist/x/groupBy.mjs +1 -1
  232. package/dist/x/has.es.js +1 -1
  233. package/dist/x/has.es.min.js +1 -1
  234. package/dist/x/has.js +1 -1
  235. package/dist/x/has.min.js +1 -1
  236. package/dist/x/has.mjs +1 -1
  237. package/dist/x/identity.es.js +1 -1
  238. package/dist/x/identity.es.min.js +1 -1
  239. package/dist/x/identity.js +1 -1
  240. package/dist/x/identity.min.js +1 -1
  241. package/dist/x/identity.mjs +1 -1
  242. package/dist/x/includes.es.js +1 -1
  243. package/dist/x/includes.es.min.js +1 -1
  244. package/dist/x/includes.js +1 -1
  245. package/dist/x/includes.min.js +1 -1
  246. package/dist/x/includes.mjs +1 -1
  247. package/dist/x/isDeepEqual.es.js +1 -1
  248. package/dist/x/isDeepEqual.es.min.js +1 -1
  249. package/dist/x/isDeepEqual.js +1 -1
  250. package/dist/x/isDeepEqual.min.js +1 -1
  251. package/dist/x/isDeepEqual.mjs +1 -1
  252. package/dist/x/isEmpty.es.js +1 -1
  253. package/dist/x/isEmpty.es.min.js +1 -1
  254. package/dist/x/isEmpty.js +1 -1
  255. package/dist/x/isEmpty.min.js +1 -1
  256. package/dist/x/isEmpty.mjs +1 -1
  257. package/dist/x/isEqual.es.js +1 -1
  258. package/dist/x/isEqual.es.min.js +1 -1
  259. package/dist/x/isEqual.js +1 -1
  260. package/dist/x/isEqual.min.js +1 -1
  261. package/dist/x/isEqual.mjs +1 -1
  262. package/dist/x/isFunction.es.js +1 -1
  263. package/dist/x/isFunction.es.min.js +1 -1
  264. package/dist/x/isFunction.js +1 -1
  265. package/dist/x/isFunction.min.js +1 -1
  266. package/dist/x/isFunction.mjs +1 -1
  267. package/dist/x/isIn.es.js +1 -1
  268. package/dist/x/isIn.es.min.js +1 -1
  269. package/dist/x/isIn.js +1 -1
  270. package/dist/x/isIn.min.js +1 -1
  271. package/dist/x/isIn.mjs +1 -1
  272. package/dist/x/isObject.es.js +1 -1
  273. package/dist/x/isObject.es.min.js +1 -1
  274. package/dist/x/isObject.js +1 -1
  275. package/dist/x/isObject.min.js +1 -1
  276. package/dist/x/isObject.mjs +1 -1
  277. package/dist/x/isString.es.js +1 -1
  278. package/dist/x/isString.es.min.js +1 -1
  279. package/dist/x/isString.js +1 -1
  280. package/dist/x/isString.min.js +1 -1
  281. package/dist/x/isString.mjs +1 -1
  282. package/dist/x/keys.es.js +1 -1
  283. package/dist/x/keys.es.min.js +1 -1
  284. package/dist/x/keys.js +1 -1
  285. package/dist/x/keys.min.js +1 -1
  286. package/dist/x/keys.mjs +1 -1
  287. package/dist/x/last.es.js +1 -1
  288. package/dist/x/last.es.min.js +1 -1
  289. package/dist/x/last.js +1 -1
  290. package/dist/x/last.min.js +1 -1
  291. package/dist/x/last.mjs +1 -1
  292. package/dist/x/maxBy.es.js +1 -1
  293. package/dist/x/maxBy.es.min.js +1 -1
  294. package/dist/x/maxBy.js +1 -1
  295. package/dist/x/maxBy.min.js +1 -1
  296. package/dist/x/maxBy.mjs +1 -1
  297. package/dist/x/noop.es.js +1 -1
  298. package/dist/x/noop.es.min.js +1 -1
  299. package/dist/x/noop.js +1 -1
  300. package/dist/x/noop.min.js +1 -1
  301. package/dist/x/noop.mjs +1 -1
  302. package/dist/x/pluck.es.js +187 -39
  303. package/dist/x/pluck.es.min.js +2 -2
  304. package/dist/x/pluck.js +187 -39
  305. package/dist/x/pluck.min.js +2 -2
  306. package/dist/x/pluck.mjs +187 -39
  307. package/dist/x/prepend.es.js +1 -1
  308. package/dist/x/prepend.es.min.js +1 -1
  309. package/dist/x/prepend.js +1 -1
  310. package/dist/x/prepend.min.js +1 -1
  311. package/dist/x/prepend.mjs +1 -1
  312. package/dist/x/size.es.js +1 -1
  313. package/dist/x/size.es.min.js +1 -1
  314. package/dist/x/size.js +1 -1
  315. package/dist/x/size.min.js +1 -1
  316. package/dist/x/size.mjs +1 -1
  317. package/dist/x/trace.es.js +1 -1
  318. package/dist/x/trace.es.min.js +1 -1
  319. package/dist/x/trace.js +1 -1
  320. package/dist/x/trace.min.js +1 -1
  321. package/dist/x/trace.mjs +1 -1
  322. package/dist/x/unionWith.es.js +1 -1
  323. package/dist/x/unionWith.es.min.js +1 -1
  324. package/dist/x/unionWith.js +1 -1
  325. package/dist/x/unionWith.min.js +1 -1
  326. package/dist/x/unionWith.mjs +1 -1
  327. package/dist/x/uniq.es.js +1 -1
  328. package/dist/x/uniq.es.min.js +1 -1
  329. package/dist/x/uniq.js +1 -1
  330. package/dist/x/uniq.min.js +1 -1
  331. package/dist/x/uniq.mjs +1 -1
  332. package/dist/x/unless.es.js +1 -1
  333. package/dist/x/unless.es.min.js +1 -1
  334. package/dist/x/unless.js +1 -1
  335. package/dist/x/unless.min.js +1 -1
  336. package/dist/x/unless.mjs +1 -1
  337. package/dist/x/values.es.js +1 -1
  338. package/dist/x/values.es.min.js +1 -1
  339. package/dist/x/values.js +1 -1
  340. package/dist/x/values.min.js +1 -1
  341. package/dist/x/values.mjs +1 -1
  342. package/dist/x/when.es.js +1 -1
  343. package/dist/x/when.es.min.js +1 -1
  344. package/dist/x/when.js +1 -1
  345. package/dist/x/when.min.js +1 -1
  346. package/dist/x/when.mjs +1 -1
  347. package/eq.js +2 -2
  348. package/es.js +233 -78
  349. package/every.js +2 -2
  350. package/filter.js +4 -4
  351. package/flatMap.js +61 -54
  352. package/forEach.js +33 -56
  353. package/get.js +5 -3
  354. package/gt.js +2 -2
  355. package/gte.js +2 -2
  356. package/index.js +233 -78
  357. package/lt.js +2 -2
  358. package/lte.js +2 -2
  359. package/map.js +115 -151
  360. package/monad/README.md +1 -1
  361. package/not.js +1 -1
  362. package/omit.js +22 -19
  363. package/or.js +1 -1
  364. package/package.json +1 -1
  365. package/pick.js +14 -11
  366. package/pipe.js +1 -1
  367. package/reduce.js +1 -1
  368. package/set.js +17 -18
  369. package/some.js +2 -2
  370. package/switchCase.js +12 -4
  371. package/tap.js +6 -4
  372. package/transform.js +1 -1
  373. package/tryCatch.js +1 -1
  374. package/x/defaultsDeep.js +1 -1
  375. package/x/defaultsDeep.test.js +1 -1
  376. package/_internal/NextIteration.js +0 -12
  377. package/_internal/generatorFunctionFilter.js +0 -28
  378. package/_internal/iterationMap.js +0 -27
package/forEach.js CHANGED
@@ -24,16 +24,16 @@ const _forEach = function (collection, callback) {
24
24
  if (collection == null) {
25
25
  return collection
26
26
  }
27
- if (typeof collection.forEach == 'function') {
28
- collection.forEach(callback)
29
- return collection
30
- }
31
27
  if (typeof collection[symbolIterator] == 'function') {
32
28
  return iteratorForEach(collection[symbolIterator](), callback)
33
29
  }
34
30
  if (typeof collection[symbolAsyncIterator] == 'function') {
35
31
  return asyncIteratorForEach(collection[symbolAsyncIterator](), callback)
36
32
  }
33
+ if (typeof collection.forEach == 'function') {
34
+ collection.forEach(callback)
35
+ return collection
36
+ }
37
37
  if (collection.constructor == Object) {
38
38
  return objectForEach(collection, callback)
39
39
  }
@@ -48,22 +48,19 @@ const _forEach = function (collection, callback) {
48
48
  * type Iterable = Array|Set|Map|Generator|AsyncGenerator|{ forEach: function }|Object
49
49
  *
50
50
  * type SyncOrAsyncCallback = (
51
- * element any,
51
+ * item any,
52
52
  * indexOrKey number|string|any,
53
- * iter Iterable
53
+ * iterable Iterable
54
54
  * )=>Promise|undefined
55
55
  *
56
- * iterable Iterable
57
- * cb SyncOrAsyncCallback
58
- *
59
- * forEach(iterable, cb) -> unmodifiedIterable Promise|Iterable
60
- * forEach(cb)(iterable) -> unmodifiedIterable Promise|Iterable
56
+ * forEach(iterable Promise|Iterable, callback SyncOrAsyncCallback) -> iterable Promise|Iterable
57
+ * forEach(callback SyncOrAsyncCallback)(iterable Iterable) -> iterable Promise|Iterable
61
58
  * ```
62
59
  *
63
60
  * @description
64
- * Execute a callback function for each element of an iterable, returning the original iterable unmodified.
61
+ * Executes a callback function for each item of an iterable, returning the original iterable unmodified.
65
62
  *
66
- * The following data types are considered to be iterables:
63
+ * The following data types are considered to be iterable:
67
64
  * * `array`
68
65
  * * `set`
69
66
  * * `map`
@@ -76,36 +73,44 @@ const _forEach = function (collection, callback) {
76
73
  *
77
74
  * If the iterable is an array:
78
75
  * ```coffeescript [specscript]
79
- * callback(element any, index number, iter Array) -> Promise|undefined
76
+ * callback(item any, index number, iterable Array) -> Promise|undefined
80
77
  * ```
81
78
  *
82
79
  * If the iterable is a set:
83
80
  * ```coffeescript [specscript]
84
- * callback(element any, key any, iter Set) -> Promise|undefined
81
+ * callback(item any, item any, iterable Set) -> Promise|undefined
85
82
  * ```
86
83
  *
87
84
  * If the iterable is a map:
88
85
  * ```coffeescript [specscript]
89
- * callback(element any, key any, filt Map) -> Promise|undefined
86
+ * callback(item any, key any, iterable Map) -> Promise|undefined
90
87
  * ```
91
88
  *
92
89
  * If the iterable is a generator:
93
90
  * ```coffeescript [specscript]
94
- * callback(element any) -> Promise|undefined
91
+ * callback(item any) -> Promise|undefined
95
92
  * ```
96
93
  *
97
94
  * If the iterable is an async generator:
98
95
  * ```coffeescript [specscript]
99
- * callback(element any) -> Promise|undefined
96
+ * callback(item any) -> Promise|undefined
100
97
  * ```
101
98
  *
102
- * If the iterable is an object with a `.forEach` method, the callback function signature is defined externally.
103
- *
104
99
  * If the iterable is a plain object:
105
100
  * ```coffeescript [specscript]
106
- * callback(element any, key string, iter Object) -> Promise|undefined
101
+ * callback(item any, key string, iterable Object) -> Promise|undefined
107
102
  * ```
108
103
  *
104
+ * ```javascript [playground]
105
+ * console.log('array')
106
+ * forEach([1, 2, 3, 4, 5], num => console.log(num))
107
+ *
108
+ * console.log('object')
109
+ * forEach({ a: 1, b: 2, c: 3 }, num => console.log(num))
110
+ * ```
111
+ *
112
+ * If the iterable is an object with a `.forEach` method, the callback function signature is defined externally.
113
+ *
109
114
  * If the callback function is asynchronous, it is executed concurrently.
110
115
  *
111
116
  * ```javascript [playground]
@@ -117,37 +122,20 @@ const _forEach = function (collection, callback) {
117
122
  * })
118
123
  * ```
119
124
  *
120
- * `forEach` works for arrays.
121
- *
122
- * ```javascript [playground]
123
- * forEach([1, 2, 3, 4, 5], num => console.log(num)) // 1 2 3 4 5
124
- * ```
125
- *
126
- * `forEach` works for objects.
127
- *
128
- * ```javascript [playground]
129
- * forEach({ a: 1, b: 2, c: 3 }, num => console.log(num)) // 1 2 3
130
- * ```
131
- *
132
- * Omit the data argument for a composable API
125
+ * `forEach` supports a lazy interface for composability.
133
126
  *
134
127
  * ```javascript [playground]
135
128
  * pipe([1, 2, 3, 4, 5], [
136
129
  * filter(number => number % 2 == 1),
137
130
  * map(number => number ** 2),
138
- * forEach(console.log), // 1
139
- * // 9
140
- * // 25
131
+ * forEach(console.log),
141
132
  * ])
142
133
  * ```
143
134
  *
144
- * Any promises passed in argument position are resolved for their values before further execution.
135
+ * If the iterable is a promise, it is resolved for its value before further execution for the eager interface only.
145
136
  *
146
137
  * ```javascript [playground]
147
138
  * forEach(Promise.resolve([1, 2, 3]), console.log)
148
- * // 1
149
- * // 2
150
- * // 3
151
139
  * ```
152
140
  *
153
141
  * See also:
@@ -203,16 +191,13 @@ const _forEachSeries = function (collection, callback) {
203
191
  * type Iterable = Array|Set|Map|Generator|AsyncGenerator|{ forEach: function }|Object
204
192
  *
205
193
  * type SyncOrAsyncCallback = (
206
- * element any,
194
+ * item any,
207
195
  * indexOrKey number|string|any,
208
196
  * iter Iterable
209
197
  * )=>Promise|undefined
210
198
  *
211
- * iterable Iterable
212
- * cb SyncOrAsyncCallback
213
- *
214
- * forEach(iterable, cb) -> unmodifiedIterable Promise|Iterable
215
- * forEach(cb)(iterable) -> unmodifiedIterable Promise|Iterable
199
+ * forEach.series(iterable Promise|Iterable, callback SyncOrAsyncCallback) -> iterable Promise|Iterable
200
+ * forEach.series(callback SyncOrAsyncCallback)(iterable Iterable) -> iterable Promise|Iterable
216
201
  * ```
217
202
  *
218
203
  * @description
@@ -224,21 +209,13 @@ const _forEachSeries = function (collection, callback) {
224
209
  * setTimeout(resolve, 1000)
225
210
  * })
226
211
  * console.log(number)
227
- * // 1
228
- * // 2
229
- * // 3
230
- * // 4
231
- * // 5
232
212
  * })
233
213
  * ```
234
214
  *
235
- * Any promises passed in argument position are resolved for their values before further execution.
215
+ * If the iterable is a promise, it is resolved for its value before further execution for the eager interface only.
236
216
  *
237
217
  * ```javascript [playground]
238
218
  * forEach.series(Promise.resolve([1, 2, 3]), console.log)
239
- * // 1
240
- * // 2
241
- * // 3
242
219
  * ```
243
220
  *
244
221
  * See also:
package/get.js CHANGED
@@ -45,7 +45,7 @@ const _get = function (object, path, defaultValue) {
45
45
  * console.log(value)
46
46
  * ```
47
47
  *
48
- * `get` supports a lazy API for composability.
48
+ * `get` supports a lazy interface for composability.
49
49
  *
50
50
  * ```javascript [playground]
51
51
  * const obj = { hello: 'world' }
@@ -103,10 +103,12 @@ const _get = function (object, path, defaultValue) {
103
103
  * console.log(get00000ArrayNotation(nested))
104
104
  * ```
105
105
  *
106
- * Any promises passed in argument position are resolved for their values before further execution.
106
+ * If the argument object or default value is a promise, it is resolved for its value before further execution for the eager interface only.
107
107
  *
108
108
  * ```javascript [playground]
109
- * get(Promise.resolve({ a: 1 }), 'a').then(console.log) // 1
109
+ * get(Promise.resolve({ a: 1 }), 'a').then(console.log)
110
+ *
111
+ * get({}, 'a', Promise.resolve('default-value')).then(console.log)
110
112
  * ```
111
113
  *
112
114
  * See also:
package/gt.js CHANGED
@@ -56,7 +56,7 @@ const greaterThan = require('./_internal/greaterThan')
56
56
  * asyncIsOfLegalAge(juvenile).then(console.log) // false
57
57
  * ```
58
58
  *
59
- * `gt` supports a lazy API for composability.
59
+ * `gt` supports a lazy interface for composability.
60
60
  *
61
61
  * ```javascript [playground]
62
62
  * pipe({ value: 1 }, [
@@ -65,7 +65,7 @@ const greaterThan = require('./_internal/greaterThan')
65
65
  * ])
66
66
  * ```
67
67
  *
68
- * Any promises passed in argument position are resolved for their values before further execution.
68
+ * Any promises passed in data argument position are resolved for their values before further execution.
69
69
  *
70
70
  * ```javascript [playground]
71
71
  * gt(Promise.resolve({ a: 2, b: 1 }), get('a'), get('b')).then(console.log) // true
package/gte.js CHANGED
@@ -60,7 +60,7 @@ const greaterThanOrEqual = require('./_internal/greaterThanOrEqual')
60
60
  * asyncIsAtLeast100(101).then(console.log) // true
61
61
  * ```
62
62
  *
63
- * `gte` supports a lazy API for composability.
63
+ * `gte` supports a lazy interface for composability.
64
64
  *
65
65
  * ```javascript [playground]
66
66
  * pipe({ value: 1 }, [
@@ -69,7 +69,7 @@ const greaterThanOrEqual = require('./_internal/greaterThanOrEqual')
69
69
  * ])
70
70
  * ```
71
71
  *
72
- * Any promises passed in argument position are resolved for their values before further execution.
72
+ * Any promises passed in data argument position are resolved for their values before further execution.
73
73
  *
74
74
  * ```javascript [playground]
75
75
  * gte(Promise.resolve({ a: 1, b: 1 }), get('a'), get('b')).then(console.log) // true
package/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Rubico v2.8.6
2
+ * Rubico v2.10.0
3
3
  * https://rubico.land/
4
4
  *
5
5
  * © Richard Yufei Tong, King of Software
@@ -607,26 +607,167 @@ const MappingIterator = (iterator, mapper) => ({
607
607
  },
608
608
  })
609
609
 
610
- const NextIteration = value => ({ value, done: false })
610
+ const promiseRace = Promise.race.bind(Promise)
611
611
 
612
- const symbolAsyncIterator = Symbol.asyncIterator
612
+ class LinkedList {
613
+ constructor() {
614
+ this.first = null
615
+ this.last = null
616
+ this.length = 0
617
+ }
613
618
 
614
- const MappingAsyncIterator = (asyncIterator, mapper) => ({
615
- [symbolAsyncIterator]() {
616
- return this
617
- },
618
- async next() {
619
- const iteration = await asyncIterator.next()
620
- if (iteration.done) {
621
- return iteration
619
+ // popFirst() -> firstValue any
620
+ popFirst() {
621
+ const first = this.first
622
+
623
+ if (first == null) {
624
+ return undefined
625
+ }
626
+
627
+ if (first.next) {
628
+ this.first = first.next
629
+ } else {
630
+ this.first = null
631
+ }
632
+
633
+ this.length -= 1
634
+
635
+ return first.value
636
+ }
637
+
638
+ // append(value any) -> undefined
639
+ append(value) {
640
+ const node = { value }
641
+ if (this.first == null) {
642
+ this.first = node
643
+ }
644
+
645
+ if (this.last == null) {
646
+ this.last = node
647
+ } else {
648
+ this.last.next = node
649
+ this.last = node
622
650
  }
623
- const mapped = mapper(iteration.value)
624
- return isPromise(mapped)
625
- ? mapped.then(NextIteration)
626
- : { value: mapped, done: false }
651
+
652
+ this.length += 1
627
653
  }
654
+
655
+ }
656
+
657
+ const symbolAsyncIterator = Symbol.asyncIterator
658
+
659
+ const arrayPush = function (array, value) {
660
+ array.push(value)
661
+ return array
662
+ }
663
+
664
+ const sleep = time => new Promise(resolve => {
665
+ setTimeout(resolve, time)
628
666
  })
629
667
 
668
+ const MappingAsyncIterator = (asyncIterator, mapper) => {
669
+ const buffer = new LinkedList()
670
+
671
+ let index = -1
672
+ let consumingAsyncIterator = false
673
+ let isAsyncIteratorDone = false
674
+
675
+ return {
676
+ [symbolAsyncIterator]() {
677
+ return this
678
+ },
679
+
680
+ // _consumeAsyncIterator() -> Promise<>
681
+ async _consumeAsyncIterator() {
682
+ for await (const item of asyncIterator) {
683
+ index += 1
684
+ const mappedItem = mapper(item)
685
+ buffer.append(mappedItem)
686
+ }
687
+ isAsyncIteratorDone = true
688
+ },
689
+
690
+
691
+ async next() {
692
+ if (!consumingAsyncIterator) {
693
+ this._consumeAsyncIterator()
694
+ consumingAsyncIterator = true
695
+ }
696
+
697
+ while (!isAsyncIteratorDone) {
698
+ if (buffer.length > 0) {
699
+ let value = buffer.popFirst()
700
+ if (isPromise(value)) {
701
+ value = await value
702
+ }
703
+ return { value, done: false }
704
+ }
705
+ await sleep(10)
706
+ }
707
+
708
+ if (buffer.length > 0) {
709
+ let value = buffer.popFirst()
710
+ if (isPromise(value)) {
711
+ value = await value
712
+ }
713
+ return { value, done: false }
714
+ }
715
+
716
+ return { value: undefined, done: true }
717
+ },
718
+
719
+ }
720
+ }
721
+
722
+ const SerialMappingAsyncIterator = (asyncIterator, mapper) => {
723
+ const buffer = new LinkedList()
724
+
725
+ let index = -1
726
+ let consumingAsyncIterator = false
727
+ let isAsyncIteratorDone = false
728
+
729
+ return {
730
+ [symbolAsyncIterator]() {
731
+ return this
732
+ },
733
+
734
+ // _consumeAsyncIterator() -> Promise<>
735
+ async _consumeAsyncIterator() {
736
+ for await (const item of asyncIterator) {
737
+ index += 1
738
+ let mappedItem = mapper(item)
739
+ if (isPromise(mappedItem)) {
740
+ mappedItem = await mappedItem
741
+ }
742
+ buffer.append(mappedItem)
743
+ }
744
+ isAsyncIteratorDone = true
745
+ },
746
+
747
+
748
+ async next() {
749
+ if (!consumingAsyncIterator) {
750
+ this._consumeAsyncIterator()
751
+ consumingAsyncIterator = true
752
+ }
753
+
754
+ while (!isAsyncIteratorDone) {
755
+ if (buffer.length > 0) {
756
+ return { value: buffer.popFirst(), done: false }
757
+ }
758
+ await sleep(10)
759
+ }
760
+
761
+ if (buffer.length > 0) {
762
+ return { value: buffer.popFirst(), done: false }
763
+ }
764
+
765
+ return { value: undefined, done: true }
766
+ },
767
+
768
+ }
769
+ }
770
+
630
771
  const isObject = value => {
631
772
  if (value == null) {
632
773
  return false
@@ -872,8 +1013,6 @@ const tapSync = func => function tapping(...args) {
872
1013
  return args[0]
873
1014
  }
874
1015
 
875
- const promiseRace = Promise.race.bind(Promise)
876
-
877
1016
  const arrayMapPoolAsync = async function (
878
1017
  array, f, concurrencyLimit, result, index, promises,
879
1018
  ) {
@@ -1196,9 +1335,6 @@ const _map = function (value, f) {
1196
1335
  if (typeof value.then == 'function') {
1197
1336
  return value.then(f)
1198
1337
  }
1199
- if (typeof value.map == 'function') {
1200
- return value.map(f)
1201
- }
1202
1338
  if (typeof value == 'string' || value.constructor == String) {
1203
1339
  return stringMap(value, f)
1204
1340
  }
@@ -1214,6 +1350,9 @@ const _map = function (value, f) {
1214
1350
  if (typeof value[symbolAsyncIterator] == 'function') {
1215
1351
  return MappingAsyncIterator(value[symbolAsyncIterator](), f)
1216
1352
  }
1353
+ if (typeof value.map == 'function') {
1354
+ return value.map(f)
1355
+ }
1217
1356
  if (value.constructor == Object) {
1218
1357
  return objectMap(value, f)
1219
1358
  }
@@ -1252,27 +1391,36 @@ map.entries = function mapEntries(arg0, arg1) {
1252
1391
  : _mapEntries(arg0, arg1)
1253
1392
  }
1254
1393
 
1255
- const _mapSeries = function (collection, f) {
1256
- if (isArray(collection)) {
1257
- return arrayMapSeries(collection, f)
1394
+ const _mapSeries = function (functor, f) {
1395
+ if (isArray(functor)) {
1396
+ return arrayMapSeries(functor, f)
1258
1397
  }
1259
- if (collection == null) {
1260
- throw new TypeError(`invalid collection ${collection}`)
1398
+ if (functor == null) {
1399
+ throw new TypeError(`invalid functor ${functor}`)
1261
1400
  }
1262
1401
 
1263
- if (typeof collection == 'string' || collection.constructor == String) {
1264
- return stringMapSeries(collection, f)
1402
+ if (typeof functor == 'string' || functor.constructor == String) {
1403
+ return stringMapSeries(functor, f)
1265
1404
  }
1266
- if (collection.constructor == Set) {
1267
- return setMapSeries(collection, f)
1405
+ if (functor.constructor == Set) {
1406
+ return setMapSeries(functor, f)
1268
1407
  }
1269
- if (collection.constructor == Map) {
1270
- return mapMapSeries(collection, f)
1408
+ if (functor.constructor == Map) {
1409
+ return mapMapSeries(functor, f)
1271
1410
  }
1272
- if (collection.constructor == Object) {
1273
- return objectMapSeries(collection, f)
1411
+ if (typeof functor[symbolIterator] == 'function') {
1412
+ return MappingIterator(functor[symbolIterator](), f)
1274
1413
  }
1275
- throw new TypeError(`invalid collection ${collection}`)
1414
+ if (typeof functor[symbolAsyncIterator] == 'function') {
1415
+ return SerialMappingAsyncIterator(functor[symbolAsyncIterator](), f)
1416
+ }
1417
+ if (typeof functor.map == 'function') {
1418
+ return functor.map(f)
1419
+ }
1420
+ if (functor.constructor == Object) {
1421
+ return objectMapSeries(functor, f)
1422
+ }
1423
+ throw new TypeError(`invalid functor ${functor}`)
1276
1424
  }
1277
1425
 
1278
1426
  map.series = function mapSeries(arg0, arg1) {
@@ -1489,15 +1637,15 @@ const _filter = function (value, predicate) {
1489
1637
  if (value.constructor == Map) {
1490
1638
  return mapFilter(value, predicate)
1491
1639
  }
1492
- if (typeof value.filter == 'function') {
1493
- return value.filter(predicate)
1494
- }
1495
1640
  if (typeof value[symbolIterator] == 'function') {
1496
1641
  return FilteringIterator(value[symbolIterator](), predicate)
1497
1642
  }
1498
1643
  if (typeof value[symbolAsyncIterator] == 'function') {
1499
1644
  return FilteringAsyncIterator(value[symbolAsyncIterator](), predicate)
1500
1645
  }
1646
+ if (typeof value.filter == 'function') {
1647
+ return value.filter(predicate)
1648
+ }
1501
1649
  if (value.constructor == Object) {
1502
1650
  return objectFilter(value, predicate)
1503
1651
  }
@@ -1944,11 +2092,6 @@ const transform = function (...args) {
1944
2092
  return _transform(args[0], args[1], args[2])
1945
2093
  }
1946
2094
 
1947
- const arrayPush = function (array, value) {
1948
- array.push(value)
1949
- return array
1950
- }
1951
-
1952
2095
  const FlatMappingIterator = function (iterator, flatMapper) {
1953
2096
  let buffer = [],
1954
2097
  bufferIndex = 0
@@ -1983,13 +2126,12 @@ const FlatMappingIterator = function (iterator, flatMapper) {
1983
2126
  }
1984
2127
  }
1985
2128
 
1986
- const sleep = time => new Promise(resolve => {
1987
- setTimeout(resolve, time)
1988
- })
1989
-
1990
2129
  const FlatMappingAsyncIterator = function (asyncIterator, flatMapper) {
1991
- const buffer = [],
1992
- promises = new Set()
2130
+ const buffer = []
2131
+ const promises = new Set()
2132
+
2133
+ let consumingAsyncIterator = false
2134
+ let isAsyncIteratorDone = false
1993
2135
 
1994
2136
  return {
1995
2137
  isAsyncIteratorDone: false,
@@ -2000,38 +2142,48 @@ const FlatMappingAsyncIterator = function (asyncIterator, flatMapper) {
2000
2142
  return '[object FlatMappingAsyncIterator]'
2001
2143
  },
2002
2144
 
2003
-
2004
- async next() {
2005
- while (
2006
- !this.isAsyncIteratorDone || buffer.length > 0 || promises.size > 0
2007
- ) {
2008
- if (!this.isAsyncIteratorDone) {
2009
- const { value, done } = await asyncIterator.next()
2010
- if (done) {
2011
- this.isAsyncIteratorDone = done
2012
- } else {
2013
- const monad = flatMapper(value)
2014
- if (isPromise(monad)) {
2015
- const bufferLoading =
2016
- monad.then(curry3(genericReduce, __, arrayPush, buffer))
2017
- const promise = bufferLoading.then(() => promises.delete(promise))
2018
- promises.add(promise)
2019
- } else {
2020
- const bufferLoading = genericReduce(monad, arrayPush, buffer)
2021
- if (isPromise(bufferLoading)) {
2022
- const promise = bufferLoading.then(() => promises.delete(promise))
2023
- promises.add(promise)
2024
- }
2025
- }
2145
+ // _consumeAsyncIterator() -> Promise<>
2146
+ async _consumeAsyncIterator() {
2147
+ for await (const item of asyncIterator) {
2148
+ const monad = flatMapper(item)
2149
+ if (isPromise(monad)) {
2150
+ const bufferLoading =
2151
+ monad.then(curry3(genericReduce, __, arrayPush, buffer))
2152
+ const promise = bufferLoading.then(() => promises.delete(promise))
2153
+ promises.add(promise)
2154
+ } else {
2155
+ const bufferLoading = genericReduce(monad, arrayPush, buffer)
2156
+ if (isPromise(bufferLoading)) {
2157
+ const promise = bufferLoading.then(() => promises.delete(promise))
2158
+ promises.add(promise)
2026
2159
  }
2027
2160
  }
2161
+ }
2162
+ isAsyncIteratorDone = true
2163
+ },
2164
+
2165
+
2166
+ async next() {
2167
+ if (!consumingAsyncIterator) {
2168
+ this._consumeAsyncIterator()
2169
+ consumingAsyncIterator = true
2170
+ }
2171
+
2172
+ while (!isAsyncIteratorDone || promises.size > 0) {
2028
2173
  if (buffer.length > 0) {
2029
2174
  return { value: buffer.shift(), done: false }
2030
2175
  }
2031
2176
  if (promises.size > 0) {
2032
- await promiseRace([sleep(1000), ...promises])
2177
+ await promiseRace(promises)
2178
+ } else {
2179
+ await sleep(10)
2033
2180
  }
2034
2181
  }
2182
+
2183
+ if (buffer.length > 0) {
2184
+ return { value: buffer.shift(), done: false }
2185
+ }
2186
+
2035
2187
  return { value: undefined, done: true }
2036
2188
  },
2037
2189
  }
@@ -2127,9 +2279,12 @@ const objectFlatten = function (object) {
2127
2279
 
2128
2280
  for (const key in object) {
2129
2281
  const element = object[key]
2282
+
2130
2283
  if (element == null) {
2131
2284
  continue
2132
- } else if (typeof element[symbolIterator] == 'function') {
2285
+ }
2286
+
2287
+ if (typeof element[symbolIterator] == 'function') {
2133
2288
  for (const monadElement of element) {
2134
2289
  objectAssign(result, monadElement)
2135
2290
  }
@@ -2390,7 +2545,7 @@ const _iteratorForEachSeriesAsync = async function (iterator, callback) {
2390
2545
 
2391
2546
  const iteratorForEachSeries = function (iterator, callback) {
2392
2547
  let iteration = iterator.next()
2393
- while (!iterator.done) {
2548
+ while (!iteration.done) {
2394
2549
  const operation = callback(iteration.value)
2395
2550
  if (isPromise(operation)) {
2396
2551
  return operation
@@ -2420,16 +2575,16 @@ const _forEach = function (collection, callback) {
2420
2575
  if (collection == null) {
2421
2576
  return collection
2422
2577
  }
2423
- if (typeof collection.forEach == 'function') {
2424
- collection.forEach(callback)
2425
- return collection
2426
- }
2427
2578
  if (typeof collection[symbolIterator] == 'function') {
2428
2579
  return iteratorForEach(collection[symbolIterator](), callback)
2429
2580
  }
2430
2581
  if (typeof collection[symbolAsyncIterator] == 'function') {
2431
2582
  return asyncIteratorForEach(collection[symbolAsyncIterator](), callback)
2432
2583
  }
2584
+ if (typeof collection.forEach == 'function') {
2585
+ collection.forEach(callback)
2586
+ return collection
2587
+ }
2433
2588
  if (collection.constructor == Object) {
2434
2589
  return objectForEach(collection, callback)
2435
2590
  }
package/lt.js CHANGED
@@ -58,7 +58,7 @@ const lessThan = require('./_internal/lessThan')
58
58
  * asyncIsLessThan3(5).then(console.log) // false
59
59
  * ```
60
60
  *
61
- * `lt` supports a lazy API for composability.
61
+ * `lt` supports a lazy interface for composability.
62
62
  *
63
63
  * ```javascript [playground]
64
64
  * pipe({ value: 1 }, [
@@ -67,7 +67,7 @@ const lessThan = require('./_internal/lessThan')
67
67
  * ])
68
68
  * ```
69
69
  *
70
- * Any promises passed in argument position are resolved for their values before further execution.
70
+ * Any promises passed in data argument position are resolved for their values before further execution.
71
71
  *
72
72
  * ```javascript [playground]
73
73
  * lt(Promise.resolve({ a: 1, b: 2 }), get('a'), get('b')).then(console.log) // true