rubico 2.6.1 → 2.6.3

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 (345) hide show
  1. package/README.md +14 -14
  2. package/_internal/areAllValuesNonfunctions.js +16 -4
  3. package/_internal/areAnyValuesPromises.js +16 -4
  4. package/_internal/arrayMapPool.js +1 -1
  5. package/_internal/arrayMapRate.js +85 -0
  6. package/_internal/functionArrayAll.js +2 -1
  7. package/_internal/functionObjectAll.js +2 -1
  8. package/all.js +103 -34
  9. package/assign.js +19 -3
  10. package/dist/Transducer.es.js +1 -1
  11. package/dist/Transducer.es.min.js +1 -1
  12. package/dist/Transducer.js +1 -1
  13. package/dist/Transducer.min.js +1 -1
  14. package/dist/Transducer.mjs +1 -1
  15. package/dist/__.es.js +1 -1
  16. package/dist/__.es.min.js +1 -1
  17. package/dist/__.js +1 -1
  18. package/dist/__.min.js +1 -1
  19. package/dist/__.mjs +1 -1
  20. package/dist/all.es.js +107 -8
  21. package/dist/all.es.min.js +2 -2
  22. package/dist/all.js +107 -8
  23. package/dist/all.min.js +2 -2
  24. package/dist/all.mjs +107 -8
  25. package/dist/always.es.js +1 -1
  26. package/dist/always.es.min.js +1 -1
  27. package/dist/always.js +1 -1
  28. package/dist/always.min.js +1 -1
  29. package/dist/always.mjs +1 -1
  30. package/dist/and.es.js +30 -9
  31. package/dist/and.es.min.js +2 -2
  32. package/dist/and.js +30 -9
  33. package/dist/and.min.js +2 -2
  34. package/dist/and.mjs +30 -9
  35. package/dist/assign.es.js +3 -2
  36. package/dist/assign.es.min.js +2 -2
  37. package/dist/assign.js +3 -2
  38. package/dist/assign.min.js +2 -2
  39. package/dist/assign.mjs +3 -2
  40. package/dist/compose.es.js +17 -5
  41. package/dist/compose.es.min.js +2 -2
  42. package/dist/compose.js +17 -5
  43. package/dist/compose.min.js +2 -2
  44. package/dist/compose.mjs +17 -5
  45. package/dist/curry.es.js +1 -1
  46. package/dist/curry.es.min.js +1 -1
  47. package/dist/curry.js +1 -1
  48. package/dist/curry.min.js +1 -1
  49. package/dist/curry.mjs +1 -1
  50. package/dist/eq.es.js +17 -5
  51. package/dist/eq.es.min.js +2 -2
  52. package/dist/eq.js +17 -5
  53. package/dist/eq.min.js +2 -2
  54. package/dist/eq.mjs +17 -5
  55. package/dist/every.es.js +1 -1
  56. package/dist/every.es.min.js +1 -1
  57. package/dist/every.js +1 -1
  58. package/dist/every.min.js +1 -1
  59. package/dist/every.mjs +1 -1
  60. package/dist/filter.es.js +1 -1
  61. package/dist/filter.es.min.js +1 -1
  62. package/dist/filter.js +1 -1
  63. package/dist/filter.min.js +1 -1
  64. package/dist/filter.mjs +1 -1
  65. package/dist/flatMap.es.js +1 -1
  66. package/dist/flatMap.es.min.js +1 -1
  67. package/dist/flatMap.js +1 -1
  68. package/dist/flatMap.min.js +1 -1
  69. package/dist/flatMap.mjs +1 -1
  70. package/dist/forEach.es.js +1 -1
  71. package/dist/forEach.es.min.js +1 -1
  72. package/dist/forEach.js +1 -1
  73. package/dist/forEach.min.js +1 -1
  74. package/dist/forEach.mjs +1 -1
  75. package/dist/get.es.js +1 -1
  76. package/dist/get.es.min.js +1 -1
  77. package/dist/get.js +1 -1
  78. package/dist/get.min.js +1 -1
  79. package/dist/get.mjs +1 -1
  80. package/dist/gt.es.js +17 -5
  81. package/dist/gt.es.min.js +2 -2
  82. package/dist/gt.js +17 -5
  83. package/dist/gt.min.js +2 -2
  84. package/dist/gt.mjs +17 -5
  85. package/dist/gte.es.js +17 -5
  86. package/dist/gte.es.min.js +2 -2
  87. package/dist/gte.js +17 -5
  88. package/dist/gte.min.js +2 -2
  89. package/dist/gte.mjs +17 -5
  90. package/dist/lt.es.js +17 -5
  91. package/dist/lt.es.min.js +2 -2
  92. package/dist/lt.js +17 -5
  93. package/dist/lt.min.js +2 -2
  94. package/dist/lt.mjs +17 -5
  95. package/dist/lte.es.js +17 -5
  96. package/dist/lte.es.min.js +2 -2
  97. package/dist/lte.js +17 -5
  98. package/dist/lte.min.js +2 -2
  99. package/dist/lte.mjs +17 -5
  100. package/dist/map.es.js +1 -1
  101. package/dist/map.es.min.js +1 -1
  102. package/dist/map.js +1 -1
  103. package/dist/map.min.js +1 -1
  104. package/dist/map.mjs +1 -1
  105. package/dist/not.es.js +17 -5
  106. package/dist/not.es.min.js +2 -2
  107. package/dist/not.js +17 -5
  108. package/dist/not.min.js +2 -2
  109. package/dist/not.mjs +17 -5
  110. package/dist/omit.es.js +1 -1
  111. package/dist/omit.es.min.js +1 -1
  112. package/dist/omit.js +1 -1
  113. package/dist/omit.min.js +1 -1
  114. package/dist/omit.mjs +1 -1
  115. package/dist/or.es.js +30 -9
  116. package/dist/or.es.min.js +2 -2
  117. package/dist/or.js +30 -9
  118. package/dist/or.min.js +2 -2
  119. package/dist/or.mjs +30 -9
  120. package/dist/pick.es.js +1 -1
  121. package/dist/pick.es.min.js +1 -1
  122. package/dist/pick.js +1 -1
  123. package/dist/pick.min.js +1 -1
  124. package/dist/pick.mjs +1 -1
  125. package/dist/pipe.es.js +17 -5
  126. package/dist/pipe.es.min.js +2 -2
  127. package/dist/pipe.js +17 -5
  128. package/dist/pipe.min.js +2 -2
  129. package/dist/pipe.mjs +17 -5
  130. package/dist/reduce.es.js +1 -1
  131. package/dist/reduce.es.min.js +1 -1
  132. package/dist/reduce.js +1 -1
  133. package/dist/reduce.min.js +1 -1
  134. package/dist/reduce.mjs +1 -1
  135. package/dist/rubico.es.js +107 -44
  136. package/dist/rubico.es.min.js +2 -2
  137. package/dist/rubico.global.js +107 -44
  138. package/dist/rubico.global.min.js +2 -2
  139. package/dist/rubico.js +107 -44
  140. package/dist/rubico.min.js +2 -2
  141. package/dist/rubico.mjs +107 -44
  142. package/dist/set.es.js +1 -1
  143. package/dist/set.es.min.js +1 -1
  144. package/dist/set.js +1 -1
  145. package/dist/set.min.js +1 -1
  146. package/dist/set.mjs +1 -1
  147. package/dist/some.es.js +1 -1
  148. package/dist/some.es.min.js +1 -1
  149. package/dist/some.js +1 -1
  150. package/dist/some.min.js +1 -1
  151. package/dist/some.mjs +1 -1
  152. package/dist/switchCase.es.js +30 -9
  153. package/dist/switchCase.es.min.js +2 -2
  154. package/dist/switchCase.js +30 -9
  155. package/dist/switchCase.min.js +2 -2
  156. package/dist/switchCase.mjs +30 -9
  157. package/dist/tap.es.js +17 -5
  158. package/dist/tap.es.min.js +2 -2
  159. package/dist/tap.js +17 -5
  160. package/dist/tap.min.js +2 -2
  161. package/dist/tap.mjs +17 -5
  162. package/dist/thunkify.es.js +17 -5
  163. package/dist/thunkify.es.min.js +2 -2
  164. package/dist/thunkify.js +17 -5
  165. package/dist/thunkify.min.js +2 -2
  166. package/dist/thunkify.mjs +17 -5
  167. package/dist/transform.es.js +1 -1
  168. package/dist/transform.es.min.js +1 -1
  169. package/dist/transform.js +1 -1
  170. package/dist/transform.min.js +1 -1
  171. package/dist/transform.mjs +1 -1
  172. package/dist/tryCatch.es.js +17 -5
  173. package/dist/tryCatch.es.min.js +2 -2
  174. package/dist/tryCatch.js +17 -5
  175. package/dist/tryCatch.min.js +2 -2
  176. package/dist/tryCatch.mjs +17 -5
  177. package/dist/x/append.es.js +1 -1
  178. package/dist/x/append.es.min.js +1 -1
  179. package/dist/x/append.js +1 -1
  180. package/dist/x/append.min.js +1 -1
  181. package/dist/x/append.mjs +1 -1
  182. package/dist/x/callProp.es.js +1 -1
  183. package/dist/x/callProp.es.min.js +1 -1
  184. package/dist/x/callProp.js +1 -1
  185. package/dist/x/callProp.min.js +1 -1
  186. package/dist/x/callProp.mjs +1 -1
  187. package/dist/x/defaultsDeep.es.js +1 -1
  188. package/dist/x/defaultsDeep.es.min.js +1 -1
  189. package/dist/x/defaultsDeep.js +1 -1
  190. package/dist/x/defaultsDeep.min.js +1 -1
  191. package/dist/x/defaultsDeep.mjs +1 -1
  192. package/dist/x/differenceWith.es.js +1 -1
  193. package/dist/x/differenceWith.es.min.js +1 -1
  194. package/dist/x/differenceWith.js +1 -1
  195. package/dist/x/differenceWith.min.js +1 -1
  196. package/dist/x/differenceWith.mjs +1 -1
  197. package/dist/x/filterOut.es.js +15 -5
  198. package/dist/x/filterOut.es.min.js +2 -2
  199. package/dist/x/filterOut.js +15 -5
  200. package/dist/x/filterOut.min.js +2 -2
  201. package/dist/x/filterOut.mjs +15 -5
  202. package/dist/x/find.es.js +1 -1
  203. package/dist/x/find.es.min.js +1 -1
  204. package/dist/x/find.js +1 -1
  205. package/dist/x/find.min.js +1 -1
  206. package/dist/x/find.mjs +1 -1
  207. package/dist/x/findIndex.es.js +1 -1
  208. package/dist/x/findIndex.es.min.js +1 -1
  209. package/dist/x/findIndex.js +1 -1
  210. package/dist/x/findIndex.min.js +1 -1
  211. package/dist/x/findIndex.mjs +1 -1
  212. package/dist/x/first.es.js +1 -1
  213. package/dist/x/first.es.min.js +1 -1
  214. package/dist/x/first.js +1 -1
  215. package/dist/x/first.min.js +1 -1
  216. package/dist/x/first.mjs +1 -1
  217. package/dist/x/flatten.es.js +1 -1
  218. package/dist/x/flatten.es.min.js +1 -1
  219. package/dist/x/flatten.js +1 -1
  220. package/dist/x/flatten.min.js +1 -1
  221. package/dist/x/flatten.mjs +1 -1
  222. package/dist/x/groupBy.es.js +1 -1
  223. package/dist/x/groupBy.es.min.js +1 -1
  224. package/dist/x/groupBy.js +1 -1
  225. package/dist/x/groupBy.min.js +1 -1
  226. package/dist/x/groupBy.mjs +1 -1
  227. package/dist/x/has.es.js +1 -1
  228. package/dist/x/has.es.min.js +1 -1
  229. package/dist/x/has.js +1 -1
  230. package/dist/x/has.min.js +1 -1
  231. package/dist/x/has.mjs +1 -1
  232. package/dist/x/identity.es.js +1 -1
  233. package/dist/x/identity.es.min.js +1 -1
  234. package/dist/x/identity.js +1 -1
  235. package/dist/x/identity.min.js +1 -1
  236. package/dist/x/identity.mjs +1 -1
  237. package/dist/x/includes.es.js +1 -1
  238. package/dist/x/includes.es.min.js +1 -1
  239. package/dist/x/includes.js +1 -1
  240. package/dist/x/includes.min.js +1 -1
  241. package/dist/x/includes.mjs +1 -1
  242. package/dist/x/isDeepEqual.es.js +1 -1
  243. package/dist/x/isDeepEqual.es.min.js +1 -1
  244. package/dist/x/isDeepEqual.js +1 -1
  245. package/dist/x/isDeepEqual.min.js +1 -1
  246. package/dist/x/isDeepEqual.mjs +1 -1
  247. package/dist/x/isEmpty.es.js +1 -1
  248. package/dist/x/isEmpty.es.min.js +1 -1
  249. package/dist/x/isEmpty.js +1 -1
  250. package/dist/x/isEmpty.min.js +1 -1
  251. package/dist/x/isEmpty.mjs +1 -1
  252. package/dist/x/isEqual.es.js +1 -1
  253. package/dist/x/isEqual.es.min.js +1 -1
  254. package/dist/x/isEqual.js +1 -1
  255. package/dist/x/isEqual.min.js +1 -1
  256. package/dist/x/isEqual.mjs +1 -1
  257. package/dist/x/isFunction.es.js +1 -1
  258. package/dist/x/isFunction.es.min.js +1 -1
  259. package/dist/x/isFunction.js +1 -1
  260. package/dist/x/isFunction.min.js +1 -1
  261. package/dist/x/isFunction.mjs +1 -1
  262. package/dist/x/isIn.es.js +1 -1
  263. package/dist/x/isIn.es.min.js +1 -1
  264. package/dist/x/isIn.js +1 -1
  265. package/dist/x/isIn.min.js +1 -1
  266. package/dist/x/isIn.mjs +1 -1
  267. package/dist/x/isObject.es.js +1 -1
  268. package/dist/x/isObject.es.min.js +1 -1
  269. package/dist/x/isObject.js +1 -1
  270. package/dist/x/isObject.min.js +1 -1
  271. package/dist/x/isObject.mjs +1 -1
  272. package/dist/x/isString.es.js +1 -1
  273. package/dist/x/isString.es.min.js +1 -1
  274. package/dist/x/isString.js +1 -1
  275. package/dist/x/isString.min.js +1 -1
  276. package/dist/x/isString.mjs +1 -1
  277. package/dist/x/keys.es.js +1 -1
  278. package/dist/x/keys.es.min.js +1 -1
  279. package/dist/x/keys.js +1 -1
  280. package/dist/x/keys.min.js +1 -1
  281. package/dist/x/keys.mjs +1 -1
  282. package/dist/x/last.es.js +1 -1
  283. package/dist/x/last.es.min.js +1 -1
  284. package/dist/x/last.js +1 -1
  285. package/dist/x/last.min.js +1 -1
  286. package/dist/x/last.mjs +1 -1
  287. package/dist/x/maxBy.es.js +1 -1
  288. package/dist/x/maxBy.es.min.js +1 -1
  289. package/dist/x/maxBy.js +1 -1
  290. package/dist/x/maxBy.min.js +1 -1
  291. package/dist/x/maxBy.mjs +1 -1
  292. package/dist/x/noop.es.js +1 -1
  293. package/dist/x/noop.es.min.js +1 -1
  294. package/dist/x/noop.js +1 -1
  295. package/dist/x/noop.min.js +1 -1
  296. package/dist/x/noop.mjs +1 -1
  297. package/dist/x/pluck.es.js +1 -1
  298. package/dist/x/pluck.es.min.js +1 -1
  299. package/dist/x/pluck.js +1 -1
  300. package/dist/x/pluck.min.js +1 -1
  301. package/dist/x/pluck.mjs +1 -1
  302. package/dist/x/prepend.es.js +1 -1
  303. package/dist/x/prepend.es.min.js +1 -1
  304. package/dist/x/prepend.js +1 -1
  305. package/dist/x/prepend.min.js +1 -1
  306. package/dist/x/prepend.mjs +1 -1
  307. package/dist/x/size.es.js +1 -1
  308. package/dist/x/size.es.min.js +1 -1
  309. package/dist/x/size.js +1 -1
  310. package/dist/x/size.min.js +1 -1
  311. package/dist/x/size.mjs +1 -1
  312. package/dist/x/trace.es.js +17 -5
  313. package/dist/x/trace.es.min.js +2 -2
  314. package/dist/x/trace.js +17 -5
  315. package/dist/x/trace.min.js +2 -2
  316. package/dist/x/trace.mjs +17 -5
  317. package/dist/x/unionWith.es.js +1 -1
  318. package/dist/x/unionWith.es.min.js +1 -1
  319. package/dist/x/unionWith.js +1 -1
  320. package/dist/x/unionWith.min.js +1 -1
  321. package/dist/x/unionWith.mjs +1 -1
  322. package/dist/x/uniq.es.js +1 -1
  323. package/dist/x/uniq.es.min.js +1 -1
  324. package/dist/x/uniq.js +1 -1
  325. package/dist/x/uniq.min.js +1 -1
  326. package/dist/x/uniq.mjs +1 -1
  327. package/dist/x/unless.es.js +1 -1
  328. package/dist/x/unless.es.min.js +1 -1
  329. package/dist/x/unless.js +1 -1
  330. package/dist/x/unless.min.js +1 -1
  331. package/dist/x/unless.mjs +1 -1
  332. package/dist/x/values.es.js +1 -1
  333. package/dist/x/values.es.min.js +1 -1
  334. package/dist/x/values.js +1 -1
  335. package/dist/x/values.min.js +1 -1
  336. package/dist/x/values.mjs +1 -1
  337. package/dist/x/when.es.js +1 -1
  338. package/dist/x/when.es.min.js +1 -1
  339. package/dist/x/when.js +1 -1
  340. package/dist/x/when.min.js +1 -1
  341. package/dist/x/when.mjs +1 -1
  342. package/es.js +107 -44
  343. package/index.js +107 -44
  344. package/map.js +44 -24
  345. package/package.json +1 -1
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
  ![rubico](https://raw.githubusercontent.com/a-synchronous/assets/master/rubico-logo.png)
3
3
  > a shallow river in northeastern Italy, just south of Ravenna
4
4
 
5
- ![Node.js CI](https://github.com/a-synchronous/rubico/workflows/Node.js%20CI/badge.svg?branch=master)
5
+ ![Node.js CI](https://github.com/a-synchronous/rubico/workflows/Node.js%20CI/badge.svg)
6
6
  [![codecov](https://codecov.io/gh/a-synchronous/rubico/branch/master/graph/badge.svg)](https://codecov.io/gh/a-synchronous/rubico)
7
7
  [![npm version](https://img.shields.io/npm/v/rubico.svg?style=flat)](https://www.npmjs.com/package/rubico)
8
8
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
@@ -26,7 +26,7 @@ pipe(numbers, [
26
26
  ```
27
27
 
28
28
  # Installation
29
- [Core build](https://unpkg.com/rubico/index.js) ([~6.8 kB minified and gzipped](https://unpkg.com/rubico/dist/rubico.min.js))
29
+ [Core build](https://unpkg.com/rubico/index.js) ([~9.8 kB minified and gzipped](https://unpkg.com/rubico/dist/rubico.min.js))
30
30
 
31
31
  with `npm`
32
32
  ```bash
@@ -86,15 +86,12 @@ When you import this library, you obtain the freedom that comes from having thos
86
86
 
87
87
  # Introduction
88
88
 
89
- rubico is a library for async-enabled functional programming in JavaScript. The library methods support a simple and composable functional style in asynchronous environments.
89
+ rubico is a library for async-enabled functional programming in JavaScript. The library supports a simple and composable functional style in asynchronous environments.
90
90
 
91
91
  ```javascript
92
92
  const {
93
93
  // compose functions
94
- pipe, compose,
95
-
96
- // handle effects
97
- tap, forEach,
94
+ pipe, compose, tap,
98
95
 
99
96
  // control flow
100
97
  switchCase,
@@ -102,9 +99,12 @@ const {
102
99
  // handle errors
103
100
  tryCatch,
104
101
 
105
- // handle objects
102
+ // compose data
106
103
  all, assign, get, set, pick, omit,
107
104
 
105
+ // iterate
106
+ forEach,
107
+
108
108
  // transform data
109
109
  map, filter, reduce, transform, flatMap,
110
110
 
@@ -119,7 +119,7 @@ const {
119
119
  } = rubico
120
120
  ```
121
121
 
122
- With async-enabled, or [a]synchronous, functional programming, functions provided to the rubico methods may be asynchronous and return a Promise. Any promises in argument position are also resolved before continuing with the operation.
122
+ With async-enabled, or [a]synchronous, functional programming, functions provided to the rubico operators may be asynchronous and return a Promise. Any promises in argument position are also resolved before continuing with the operation.
123
123
 
124
124
  ```javascript [playground]
125
125
  const helloPromise = Promise.resolve('hello')
@@ -133,7 +133,7 @@ pipe(helloPromise, [ // helloPromise is resolved for 'hello'
133
133
  ])
134
134
  ```
135
135
 
136
- Most methods support both an eager and a lazy API. The eager API takes all required arguments and executes at once, while its lazy API takes only the non-data arguments and executes lazily, returning a function that expects the data arguments. This dual API supports a natural and composable code style.
136
+ All rubico operators support both an eager and a lazy API. The eager API takes all required arguments and executes at once, while its lazy API takes only the non-data arguments and executes lazily, returning a function that expects the data arguments. This dual API supports a natural and composable code style.
137
137
 
138
138
  ```javascript [playground]
139
139
  const myObj = { a: 1, b: 2, c: 3 }
@@ -150,7 +150,7 @@ console.log(myDuplicatedSquaredObject)
150
150
  // { a: [1, 1], b: [4, 4], c: [9, 9] }
151
151
  ```
152
152
 
153
- The rubico methods are versatile and act on a wide range of vanilla JavaScript types to create declarative, extensible, and async-enabled function compositions. The same operator `map` can act on an array and also a `Map` data structure.
153
+ The rubico operators are versatile and act on a wide range of vanilla JavaScript types to create declarative, extensible, and async-enabled function compositions. The same operator `map` can act on an array and also a `Map` data structure.
154
154
 
155
155
  ```javascript [playground]
156
156
  const { pipe, tap, map, filter } = rubico
@@ -203,7 +203,7 @@ pipe(todoIDs, [
203
203
  ])
204
204
  ```
205
205
 
206
- rubico offers transducers in its `Transducer` module. You can consume these transducers with the `transform` and `compose` methods. You should use `compose` over `pipe` to chain a left-to-right composition of transducers.
206
+ rubico offers transducers in its `Transducer` module. You can consume these transducers with the `transform` and `compose` operators. You should use `compose` over `pipe` to chain a left-to-right composition of transducers.
207
207
 
208
208
  ```javascript [playground]
209
209
  const isOdd = number => number % 2 == 1
@@ -227,12 +227,12 @@ pipe(generateNumbers(), [
227
227
  ])
228
228
  ```
229
229
 
230
- For advanced asynchronous use cases, some of the methods have property functions that have different asynchronous behavior, e.g.
230
+ For advanced asynchronous use cases, some of the operators have property functions that have different asynchronous behavior, e.g.
231
231
  * `map` - apply a mapper function concurrently
232
232
  * `map.pool` - apply a mapper function concurrently with a concurrency limit
233
233
  * `map.series` - apply a mapper function serially
234
234
 
235
- For more functions beyond the core methods, please visit `rubico/x`. You can find the full documentation at [rubico.land/docs](https://rubico.land/docs).
235
+ For more functions beyond the core operators, please visit `rubico/x`. You can find the full documentation at [rubico.land/docs](https://rubico.land/docs).
236
236
 
237
237
  # Benchmarks
238
238
  Please find the published benchmark output inside the [benchmark-output](https://github.com/a-synchronous/rubico/tree/master/benchmark-output) folder. You can run the benchmarks on your own system with the following command:
@@ -1,16 +1,28 @@
1
+ const isArray = require('./isArray')
2
+
1
3
  /**
2
4
  * @name areAllValuesNonfunctions
3
5
  *
4
6
  * @synopsis
5
7
  * ```coffeescript [specscript]
6
8
  * areAllValuesNonfunctions(values Array<function|value>) -> boolean
9
+ * areAllValuesNonfunctions(values Object<function|value>) -> boolean
7
10
  * ```
8
11
  */
9
12
  const areAllValuesNonfunctions = function (values) {
10
- const length = values.length
11
- let index = -1
12
- while (++index < length) {
13
- if (typeof values[index] == 'function') {
13
+ if (isArray(values)) {
14
+ const length = values.length
15
+ let index = -1
16
+ while (++index < length) {
17
+ if (typeof values[index] == 'function') {
18
+ return false
19
+ }
20
+ }
21
+ return true
22
+ }
23
+
24
+ for (const key in values) {
25
+ if (typeof values[key] == 'function') {
14
26
  return false
15
27
  }
16
28
  }
@@ -1,3 +1,4 @@
1
+ const isArray = require('./isArray')
1
2
  const isPromise = require('./isPromise')
2
3
 
3
4
  /**
@@ -6,13 +7,24 @@ const isPromise = require('./isPromise')
6
7
  * @synopsis
7
8
  * ```coffeescript [specscript]
8
9
  * areAnyValuesPromises(values Array) -> boolean
10
+ * areAnyValuesPromises(values Object) -> boolean
9
11
  * ```
10
12
  */
11
13
  const areAnyValuesPromises = function (values) {
12
- const length = values.length
13
- let index = -1
14
- while (++index < length) {
15
- const value = values[index]
14
+ if (isArray(values)) {
15
+ const length = values.length
16
+ let index = -1
17
+ while (++index < length) {
18
+ const value = values[index]
19
+ if (isPromise(value)) {
20
+ return true
21
+ }
22
+ }
23
+ return false
24
+ }
25
+
26
+ for (const key in values) {
27
+ const value = values[key]
16
28
  if (isPromise(value)) {
17
29
  return true
18
30
  }
@@ -48,7 +48,7 @@ const arrayMapPoolAsync = async function (
48
48
  *
49
49
  * @synopsis
50
50
  * ```coffeescript [specscript]
51
- * arrayMapPool(array Array, concurrency number, f function) -> Promise|string
51
+ * arrayMapPool(array Array, concurrency number, f function) -> Promise|array
52
52
  * ```
53
53
  *
54
54
  * @description
@@ -0,0 +1,85 @@
1
+ const curry3 = require('./curry3')
2
+ const __ = require('./placeholder')
3
+ const isPromise = require('./isPromise')
4
+ const promiseAll = require('./promiseAll')
5
+ const sleep = require('./sleep')
6
+
7
+ /**
8
+ * @name arrayMapRate
9
+ *
10
+ * @synopsis
11
+ * ```coffeescript [specscript]
12
+ * arrayMapRate(
13
+ * array Array,
14
+ * rate number,
15
+ * f function,
16
+ * ) -> Promise<Array>
17
+ * ```
18
+ */
19
+ const arrayMapRate = async function (array, rate, f) {
20
+ const length = array.length
21
+ const result = Array(length)
22
+ const minPeriodMs = 1 / rate * 1000
23
+ let index = -1
24
+ let lastExecutionTime = 0
25
+ const totalStart = performance.now()
26
+ while (++index < length) {
27
+ if (index > 0 && lastExecutionTime < minPeriodMs) {
28
+ await sleep(minPeriodMs - lastExecutionTime)
29
+ }
30
+ const start = performance.now()
31
+ let resultItem = f(array[index], index, array)
32
+ if (isPromise(resultItem)) {
33
+ resultItem = await resultItem
34
+ }
35
+ const end = performance.now()
36
+ const executionTime = end - start
37
+ lastExecutionTime = executionTime
38
+ result[index] = resultItem
39
+ }
40
+ const totalEnd = performance.now()
41
+ return result
42
+ }
43
+
44
+ /**
45
+ * @name range
46
+ *
47
+ * @synopsis
48
+ * ```coffeescript [specscript]
49
+ * range(lower number, upper number) -> numbers Array<number>
50
+ * ```
51
+ */
52
+ const range = function (lower, upper) {
53
+ const result = []
54
+ let start = lower
55
+ while (start <= upper) {
56
+ result.push(start)
57
+ start += 1
58
+ }
59
+ return result
60
+ }
61
+
62
+ /*
63
+ const start = performance.now()
64
+ arrayMapRate(
65
+ range(0, 10),
66
+ 2,
67
+ async n => {
68
+ const duration = Math.random() * 1000
69
+ console.log('duration', duration)
70
+ // const duration = 500
71
+ await sleep(duration)
72
+ return n ** 2
73
+ }
74
+ async n => {
75
+ console.log('n', n)
76
+ return n ** 2
77
+ },
78
+ ).then(result => {
79
+ const end = performance.now()
80
+ console.log('average period:', (end - start) / result.length)
81
+ console.log(result)
82
+ })
83
+ */
84
+
85
+ module.exports = arrayMapRate
@@ -14,7 +14,8 @@ const functionArrayAll = function (funcs, args) {
14
14
  result = Array(funcsLength)
15
15
  let funcsIndex = -1, isAsync = false
16
16
  while (++funcsIndex < funcsLength) {
17
- const resultItem = funcs[funcsIndex](...args)
17
+ const f = funcs[funcsIndex]
18
+ const resultItem = typeof f == 'function' ? f(...args) : f
18
19
  if (isPromise(resultItem)) {
19
20
  isAsync = true
20
21
  }
@@ -19,7 +19,8 @@ const objectSet = require('./objectSet')
19
19
  const functionObjectAll = function (funcs, args) {
20
20
  const result = {}, promises = []
21
21
  for (const key in funcs) {
22
- const resultItem = funcs[key](...args)
22
+ const f = funcs[key]
23
+ const resultItem = typeof f == 'function' ? f(...args) : f
23
24
  if (isPromise(resultItem)) {
24
25
  promises.push(resultItem.then(curry3(objectSet, result, key, __)))
25
26
  } else {
package/all.js CHANGED
@@ -1,5 +1,8 @@
1
+ const isPromise = require('./_internal/isPromise')
1
2
  const areAnyValuesPromises = require('./_internal/areAnyValuesPromises')
3
+ const areAllValuesNonfunctions = require('./_internal/areAllValuesNonfunctions')
2
4
  const promiseAll = require('./_internal/promiseAll')
5
+ const promiseObjectAll = require('./_internal/promiseObjectAll')
3
6
  const isArray = require('./_internal/isArray')
4
7
  const __ = require('./_internal/placeholder')
5
8
  const curry2 = require('./_internal/curry2')
@@ -9,21 +12,54 @@ const functionArrayAllSeries = require('./_internal/functionArrayAllSeries')
9
12
  const functionObjectAll = require('./_internal/functionObjectAll')
10
13
 
11
14
  /**
12
- * @name all
15
+ * @name _allValues
13
16
  *
14
17
  * @synopsis
15
18
  * ```coffeescript [specscript]
16
- * all(...args, funcsArray Array<function>) -> result Promise|Array
17
- *
18
- * all(funcsArray Array<function>)(...args) -> result Promise|Array
19
- *
20
- * all(...args, funcsObject Object<function>) -> result Promise|Object
19
+ * _allValues(values Array<Promise|any>) -> Promise<Array>
20
+ * _allValues(values Object<Promise|any>) -> Promise<Object>
21
+ * ```
22
+ */
23
+ const _allValues = function (values) {
24
+ if (isArray(values)) {
25
+ return areAnyValuesPromises(values)
26
+ ? promiseAll(values)
27
+ : values
28
+ }
29
+ return areAnyValuesPromises(values)
30
+ ? promiseObjectAll(values)
31
+ : values
32
+ }
33
+
34
+ /**
35
+ * @name all
21
36
  *
22
- * all(funcsObject Object<function>)(...args) -> result Promise|Object
37
+ * @synopsis
38
+ * ```coffeescript [specscript]
39
+ * all(values Promise|Array<Promise|any>) -> result Promise|Array
40
+ * all(values Promise|Object<Promise|any>) -> result Promise|Object
41
+ *
42
+ * all(
43
+ * ...args,
44
+ * resolversOrValues Array<function|Promise|any>
45
+ * ) -> result Promise|Array
46
+ *
47
+ * all(
48
+ * resolversOrValues Array<function|Promise|any>
49
+ * )(...args) -> result Promise|Array
50
+ *
51
+ * all(
52
+ * ...args,
53
+ * resolversOrValues Object<function|Promise|any>
54
+ * ) -> result Promise|Object
55
+ *
56
+ * all(
57
+ * resolversOrValues Object<function|Promise|any>
58
+ * )(...args) -> result Promise|Object
23
59
  * ```
24
60
  *
25
61
  * @description
26
- * Function executor and composer. Accepts either an array of functions or an object of functions. Calls each function of the provided array or object in parallel with the provided arguments. Returns either an array or object of the execution results.
62
+ * Calls an array or object of resolver functions or values `resolversOrValues` with provided arguments.
27
63
  *
28
64
  * ```javascript [playground]
29
65
  * const createArrayOfGreetingsFor = all([
@@ -32,24 +68,29 @@ const functionObjectAll = require('./_internal/functionObjectAll')
32
68
  * name => `Hello ${name}`,
33
69
  * ])
34
70
  *
35
- * const arrayOfGreetingsForFred = createArrayOfGreetingsFor('Fred')
71
+ * const arrayOfGreetingsFor1 = createArrayOfGreetingsFor('1')
36
72
  *
37
- * console.log(arrayOfGreetingsForFred)
38
- * // ['Hi Fred', 'Hey Fred', 'Hello Fred']
39
- *
40
- * const createObjectOfGreetingsFor = all({
41
- * hi: name => `Hi ${name}`,
42
- * hey: name => `Hey ${name}`,
43
- * hello: name => `Hello ${name}`,
44
- * })
73
+ * console.log(arrayOfGreetingsFor1)
74
+ * // ['Hi 1', 'Hey 1', 'Hello 1']
75
+ * ```
45
76
  *
46
- * const objectOfGreetingsForJane = createObjectOfGreetingsFor('Jane')
77
+ * If provided only values for `resolversOrValues`, returns an array or object with the same shape as `resolversOrValues` with any Promises resolved.
47
78
  *
48
- * console.log(objectOfGreetingsForJane)
49
- * // { hi: 'Hi Jane', hey: 'Hey Jane', hello: 'Hello Jane' }
79
+ * ```javascript [playground]
80
+ * all([
81
+ * Promise.resolve(1),
82
+ * Promise.resolve(2),
83
+ * 3,
84
+ * ]).then(console.log) // [1, 2, 3]
85
+ *
86
+ * all({
87
+ * a: Promise.resolve(1),
88
+ * b: Promise.resolve(2),
89
+ * c: 3,
90
+ * }).then(console.log) // { a: 1, b: 2, c: 3 }
50
91
  * ```
51
92
  *
52
- * `all` can simultaneously compose objects and handle promises.
93
+ * `all` can be used in a pipeline to compose and manpulate data.
53
94
  *
54
95
  * ```javascript [playground]
55
96
  * const identity = value => value
@@ -72,6 +113,24 @@ const functionObjectAll = require('./_internal/functionObjectAll')
72
113
  * getAndLogUserById('1') // Got user {"_id":1,"name":"George"} by id 1
73
114
  * ```
74
115
  *
116
+ * Values may be provided along with functions, in which case they are set on the result object or array directly. If any of these values are promises, they are resolved for their values before being set on the result object or array.
117
+ *
118
+ * ```javascript [playground]
119
+ * all({}, {
120
+ * a: Promise.resolve(1),
121
+ * b: 2,
122
+ * c: () => 3,
123
+ * d: async () => 4,
124
+ * }).then(console.log) // { a: 1, b: 2, c: 3, d: 4 }
125
+ *
126
+ * all([], [
127
+ * Promise.resolve(1),
128
+ * 2,
129
+ * () => 3,
130
+ * async () => 4,
131
+ * ]).then(console.log) // [1, 2, 3, 4]
132
+ * ```
133
+ *
75
134
  * Any promises passed in argument position are resolved for their values before further execution. This only applies to the eager version of the API.
76
135
  *
77
136
  * ```javascript [playground]
@@ -84,24 +143,34 @@ const functionObjectAll = require('./_internal/functionObjectAll')
84
143
  *
85
144
  * @execution concurrent
86
145
  */
87
-
88
146
  const all = function (...args) {
89
- const funcs = args.pop()
90
- if (args.length == 0) {
91
- return isArray(funcs)
92
- ? curryArgs2(functionArrayAll, funcs, __)
93
- : curryArgs2(functionObjectAll, funcs, __)
147
+ if (args.length == 1) {
148
+ const resolversOrValues = args[0]
149
+ if (isPromise(resolversOrValues)) {
150
+ return resolversOrValues.then(_allValues)
151
+ }
152
+ if (areAllValuesNonfunctions(resolversOrValues)) {
153
+ return _allValues(resolversOrValues)
154
+ }
155
+ return isArray(resolversOrValues)
156
+ ? curryArgs2(functionArrayAll, resolversOrValues, __)
157
+ : curryArgs2(functionObjectAll, resolversOrValues, __)
94
158
  }
95
159
 
96
- if (areAnyValuesPromises(args)) {
97
- return isArray(funcs)
98
- ? promiseAll(args).then(curry2(functionArrayAll, funcs, __))
99
- : promiseAll(args).then(curry2(functionObjectAll, funcs, __))
160
+ const resolversOrValues = args[args.length - 1]
161
+ const argValues = args.slice(0, -1)
162
+
163
+ if (areAnyValuesPromises(argValues)) {
164
+ return isArray(resolversOrValues)
165
+ ? promiseAll(argValues)
166
+ .then(curry2(functionArrayAll, resolversOrValues, __))
167
+ : promiseAll(argValues)
168
+ .then(curry2(functionObjectAll, resolversOrValues, __))
100
169
  }
101
170
 
102
- return isArray(funcs)
103
- ? functionArrayAll(funcs, args)
104
- : functionObjectAll(funcs, args)
171
+ return isArray(resolversOrValues)
172
+ ? functionArrayAll(resolversOrValues, argValues)
173
+ : functionObjectAll(resolversOrValues, argValues)
105
174
  }
106
175
 
107
176
  /**
package/assign.js CHANGED
@@ -18,13 +18,18 @@ const _assign = function (object, funcs) {
18
18
  *
19
19
  * @synopsis
20
20
  * ```coffeescript [specscript]
21
- * assign(object Promise|Object, resolvers Object<function>) -> result Promise|Object
21
+ * assign(
22
+ * o Promise|Object,
23
+ * resolversOrValues Object<function|Promise|any>
24
+ * ) -> result Promise|Object
22
25
  *
23
- * assign(resolvers Object<function>)(object Object) -> result Promise|Object
26
+ * assign(
27
+ * resolversOrValues Object<function|Promise|any>
28
+ * )(o Object) -> result Promise|Object
24
29
  * ```
25
30
  *
26
31
  * @description
27
- * Function executor and composer. Accepts an object of resolver functions and an argument object. Creates a result object from the argument object, evaluates each resolver with the argument object, and assigns to the result object the evaluations at the corresponding resolver keys.
32
+ * Function executor and composer. Accepts an object of resolver functions or values and an object `o`. Creates a result object from the argument object, evaluates each resolver with the argument object, and assigns to the result object the evaluations at the corresponding resolver keys.
28
33
  *
29
34
  * ```javascript [playground]
30
35
  * const assignSquaredAndCubed = assign({
@@ -55,6 +60,17 @@ const _assign = function (object, funcs) {
55
60
  * // { numbers: [1, 2, 3, 4, 5], total: 15 }
56
61
  * ```
57
62
  *
63
+ * Values passed in resolver position are set on the result object directly. If any of these values are promises, they are resolved for their values before being set on the result object.
64
+ *
65
+ * ```javascript [playground]
66
+ * assign({}, {
67
+ * a: 1,
68
+ * b: Promise.resolve(2),
69
+ * c: () => 3,
70
+ * d: async o => Object.keys(o).length,
71
+ * }).then(console.log) // { a: 1, b: 2, c: 3, d: 0 }
72
+ * ```
73
+ *
58
74
  * Any promises passed in argument position are resolved for their values before further execution. This only applies to the eager version of the API.
59
75
  *
60
76
  * ```javascript [playground]
@@ -1,5 +1,5 @@
1
1
  /**
2
- * rubico v2.6.1
2
+ * rubico v2.6.2
3
3
  * https://github.com/a-synchronous/rubico
4
4
  * (c) 2019-2024 Richard Tong
5
5
  * rubico may be freely distributed under the MIT license.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * rubico v2.6.1
2
+ * rubico v2.6.2
3
3
  * https://github.com/a-synchronous/rubico
4
4
  * (c) 2019-2024 Richard Tong
5
5
  * rubico may be freely distributed under the MIT license.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * rubico v2.6.1
2
+ * rubico v2.6.2
3
3
  * https://github.com/a-synchronous/rubico
4
4
  * (c) 2019-2024 Richard Tong
5
5
  * rubico may be freely distributed under the MIT license.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * rubico v2.6.1
2
+ * rubico v2.6.2
3
3
  * https://github.com/a-synchronous/rubico
4
4
  * (c) 2019-2024 Richard Tong
5
5
  * rubico may be freely distributed under the MIT license.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * rubico v2.6.1
2
+ * rubico v2.6.2
3
3
  * https://github.com/a-synchronous/rubico
4
4
  * (c) 2019-2024 Richard Tong
5
5
  * rubico may be freely distributed under the MIT license.
package/dist/__.es.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * rubico v2.6.1
2
+ * rubico v2.6.2
3
3
  * https://github.com/a-synchronous/rubico
4
4
  * (c) 2019-2024 Richard Tong
5
5
  * rubico may be freely distributed under the MIT license.
package/dist/__.es.min.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * rubico v2.6.1
2
+ * rubico v2.6.2
3
3
  * https://github.com/a-synchronous/rubico
4
4
  * (c) 2019-2024 Richard Tong
5
5
  * rubico may be freely distributed under the MIT license.
package/dist/__.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * rubico v2.6.1
2
+ * rubico v2.6.2
3
3
  * https://github.com/a-synchronous/rubico
4
4
  * (c) 2019-2024 Richard Tong
5
5
  * rubico may be freely distributed under the MIT license.
package/dist/__.min.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * rubico v2.6.1
2
+ * rubico v2.6.2
3
3
  * https://github.com/a-synchronous/rubico
4
4
  * (c) 2019-2024 Richard Tong
5
5
  * rubico may be freely distributed under the MIT license.
package/dist/__.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * rubico v2.6.1
2
+ * rubico v2.6.2
3
3
  * https://github.com/a-synchronous/rubico
4
4
  * (c) 2019-2024 Richard Tong
5
5
  * rubico may be freely distributed under the MIT license.