rubico 2.2.0 → 2.2.2

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 (376) hide show
  1. package/README.md +1 -3
  2. package/dist/Transducer.es.js +1 -1
  3. package/dist/Transducer.es.min.js +1 -1
  4. package/dist/Transducer.js +1 -1
  5. package/dist/Transducer.min.js +1 -1
  6. package/dist/Transducer.mjs +1 -1
  7. package/dist/__.es.js +1 -1
  8. package/dist/__.es.min.js +1 -1
  9. package/dist/__.js +1 -1
  10. package/dist/__.min.js +1 -1
  11. package/dist/__.mjs +1 -1
  12. package/dist/all.es.js +1 -1
  13. package/dist/all.es.min.js +1 -1
  14. package/dist/all.js +1 -1
  15. package/dist/all.min.js +1 -1
  16. package/dist/all.mjs +1 -1
  17. package/dist/always.es.js +1 -1
  18. package/dist/always.es.min.js +1 -1
  19. package/dist/always.js +1 -1
  20. package/dist/always.min.js +1 -1
  21. package/dist/always.mjs +1 -1
  22. package/dist/and.es.js +1 -1
  23. package/dist/and.es.min.js +1 -1
  24. package/dist/and.js +1 -1
  25. package/dist/and.min.js +1 -1
  26. package/dist/and.mjs +1 -1
  27. package/dist/assign.es.js +1 -1
  28. package/dist/assign.es.min.js +1 -1
  29. package/dist/assign.js +1 -1
  30. package/dist/assign.min.js +1 -1
  31. package/dist/assign.mjs +1 -1
  32. package/dist/compose.es.js +1 -1
  33. package/dist/compose.es.min.js +1 -1
  34. package/dist/compose.js +1 -1
  35. package/dist/compose.min.js +1 -1
  36. package/dist/compose.mjs +1 -1
  37. package/dist/curry.es.js +1 -1
  38. package/dist/curry.es.min.js +1 -1
  39. package/dist/curry.js +1 -1
  40. package/dist/curry.min.js +1 -1
  41. package/dist/curry.mjs +1 -1
  42. package/dist/eq.es.js +1 -1
  43. package/dist/eq.es.min.js +1 -1
  44. package/dist/eq.js +1 -1
  45. package/dist/eq.min.js +1 -1
  46. package/dist/eq.mjs +1 -1
  47. package/dist/every.es.js +1 -1
  48. package/dist/every.es.min.js +1 -1
  49. package/dist/every.js +1 -1
  50. package/dist/every.min.js +1 -1
  51. package/dist/every.mjs +1 -1
  52. package/dist/filter.es.js +1 -1
  53. package/dist/filter.es.min.js +1 -1
  54. package/dist/filter.js +1 -1
  55. package/dist/filter.min.js +1 -1
  56. package/dist/filter.mjs +1 -1
  57. package/dist/flatMap.es.js +1 -1
  58. package/dist/flatMap.es.min.js +1 -1
  59. package/dist/flatMap.js +1 -1
  60. package/dist/flatMap.min.js +1 -1
  61. package/dist/flatMap.mjs +1 -1
  62. package/dist/forEach.es.js +1 -1
  63. package/dist/forEach.es.min.js +1 -1
  64. package/dist/forEach.js +1 -1
  65. package/dist/forEach.min.js +1 -1
  66. package/dist/forEach.mjs +1 -1
  67. package/dist/get.es.js +1 -1
  68. package/dist/get.es.min.js +1 -1
  69. package/dist/get.js +1 -1
  70. package/dist/get.min.js +1 -1
  71. package/dist/get.mjs +1 -1
  72. package/dist/gt.es.js +1 -1
  73. package/dist/gt.es.min.js +1 -1
  74. package/dist/gt.js +1 -1
  75. package/dist/gt.min.js +1 -1
  76. package/dist/gt.mjs +1 -1
  77. package/dist/gte.es.js +1 -1
  78. package/dist/gte.es.min.js +1 -1
  79. package/dist/gte.js +1 -1
  80. package/dist/gte.min.js +1 -1
  81. package/dist/gte.mjs +1 -1
  82. package/dist/lt.es.js +1 -1
  83. package/dist/lt.es.min.js +1 -1
  84. package/dist/lt.js +1 -1
  85. package/dist/lt.min.js +1 -1
  86. package/dist/lt.mjs +1 -1
  87. package/dist/lte.es.js +1 -1
  88. package/dist/lte.es.min.js +1 -1
  89. package/dist/lte.js +1 -1
  90. package/dist/lte.min.js +1 -1
  91. package/dist/lte.mjs +1 -1
  92. package/dist/map.es.js +1 -1
  93. package/dist/map.es.min.js +1 -1
  94. package/dist/map.js +1 -1
  95. package/dist/map.min.js +1 -1
  96. package/dist/map.mjs +1 -1
  97. package/dist/not.es.js +1 -1
  98. package/dist/not.es.min.js +1 -1
  99. package/dist/not.js +1 -1
  100. package/dist/not.min.js +1 -1
  101. package/dist/not.mjs +1 -1
  102. package/dist/omit.es.js +1 -1
  103. package/dist/omit.es.min.js +1 -1
  104. package/dist/omit.js +1 -1
  105. package/dist/omit.min.js +1 -1
  106. package/dist/omit.mjs +1 -1
  107. package/dist/or.es.js +1 -1
  108. package/dist/or.es.min.js +1 -1
  109. package/dist/or.js +1 -1
  110. package/dist/or.min.js +1 -1
  111. package/dist/or.mjs +1 -1
  112. package/dist/pick.es.js +1 -1
  113. package/dist/pick.es.min.js +1 -1
  114. package/dist/pick.js +1 -1
  115. package/dist/pick.min.js +1 -1
  116. package/dist/pick.mjs +1 -1
  117. package/dist/pipe.es.js +1 -1
  118. package/dist/pipe.es.min.js +1 -1
  119. package/dist/pipe.js +1 -1
  120. package/dist/pipe.min.js +1 -1
  121. package/dist/pipe.mjs +1 -1
  122. package/dist/reduce.es.js +1 -1
  123. package/dist/reduce.es.min.js +1 -1
  124. package/dist/reduce.js +1 -1
  125. package/dist/reduce.min.js +1 -1
  126. package/dist/reduce.mjs +1 -1
  127. package/dist/rubico.es.js +1 -1
  128. package/dist/rubico.es.min.js +1 -1
  129. package/dist/rubico.global.js +1 -1
  130. package/dist/rubico.global.min.js +1 -1
  131. package/dist/rubico.js +1 -1
  132. package/dist/rubico.min.js +1 -1
  133. package/dist/rubico.mjs +1 -1
  134. package/dist/set.es.js +1 -1
  135. package/dist/set.es.min.js +1 -1
  136. package/dist/set.js +1 -1
  137. package/dist/set.min.js +1 -1
  138. package/dist/set.mjs +1 -1
  139. package/dist/some.es.js +1 -1
  140. package/dist/some.es.min.js +1 -1
  141. package/dist/some.js +1 -1
  142. package/dist/some.min.js +1 -1
  143. package/dist/some.mjs +1 -1
  144. package/dist/switchCase.es.js +1 -1
  145. package/dist/switchCase.es.min.js +1 -1
  146. package/dist/switchCase.js +1 -1
  147. package/dist/switchCase.min.js +1 -1
  148. package/dist/switchCase.mjs +1 -1
  149. package/dist/tap.es.js +1 -1
  150. package/dist/tap.es.min.js +1 -1
  151. package/dist/tap.js +1 -1
  152. package/dist/tap.min.js +1 -1
  153. package/dist/tap.mjs +1 -1
  154. package/dist/thunkify.es.js +1 -1
  155. package/dist/thunkify.es.min.js +1 -1
  156. package/dist/thunkify.js +1 -1
  157. package/dist/thunkify.min.js +1 -1
  158. package/dist/thunkify.mjs +1 -1
  159. package/dist/transform.es.js +1 -1
  160. package/dist/transform.es.min.js +1 -1
  161. package/dist/transform.js +1 -1
  162. package/dist/transform.min.js +1 -1
  163. package/dist/transform.mjs +1 -1
  164. package/dist/tryCatch.es.js +1 -1
  165. package/dist/tryCatch.es.min.js +1 -1
  166. package/dist/tryCatch.js +1 -1
  167. package/dist/tryCatch.min.js +1 -1
  168. package/dist/tryCatch.mjs +1 -1
  169. package/dist/x/append.es.js +1 -1
  170. package/dist/x/append.es.min.js +1 -1
  171. package/dist/x/append.js +1 -1
  172. package/dist/x/append.min.js +1 -1
  173. package/dist/x/append.mjs +1 -1
  174. package/dist/x/callProp.es.js +1 -1
  175. package/dist/x/callProp.es.min.js +1 -1
  176. package/dist/x/callProp.js +1 -1
  177. package/dist/x/callProp.min.js +1 -1
  178. package/dist/x/callProp.mjs +1 -1
  179. package/dist/x/defaultsDeep.es.js +1 -1
  180. package/dist/x/defaultsDeep.es.min.js +1 -1
  181. package/dist/x/defaultsDeep.js +1 -1
  182. package/dist/x/defaultsDeep.min.js +1 -1
  183. package/dist/x/defaultsDeep.mjs +1 -1
  184. package/dist/x/differenceWith.es.js +1 -1
  185. package/dist/x/differenceWith.es.min.js +1 -1
  186. package/dist/x/differenceWith.js +1 -1
  187. package/dist/x/differenceWith.min.js +1 -1
  188. package/dist/x/differenceWith.mjs +1 -1
  189. package/dist/x/filterOut.es.js +1 -1
  190. package/dist/x/filterOut.es.min.js +1 -1
  191. package/dist/x/filterOut.js +1 -1
  192. package/dist/x/filterOut.min.js +1 -1
  193. package/dist/x/filterOut.mjs +1 -1
  194. package/dist/x/find.es.js +1 -1
  195. package/dist/x/find.es.min.js +1 -1
  196. package/dist/x/find.js +1 -1
  197. package/dist/x/find.min.js +1 -1
  198. package/dist/x/find.mjs +1 -1
  199. package/dist/x/findIndex.es.js +1 -1
  200. package/dist/x/findIndex.es.min.js +1 -1
  201. package/dist/x/findIndex.js +1 -1
  202. package/dist/x/findIndex.min.js +1 -1
  203. package/dist/x/findIndex.mjs +1 -1
  204. package/dist/x/first.es.js +1 -1
  205. package/dist/x/first.es.min.js +1 -1
  206. package/dist/x/first.js +1 -1
  207. package/dist/x/first.min.js +1 -1
  208. package/dist/x/first.mjs +1 -1
  209. package/dist/x/flatten.es.js +1 -1
  210. package/dist/x/flatten.es.min.js +1 -1
  211. package/dist/x/flatten.js +1 -1
  212. package/dist/x/flatten.min.js +1 -1
  213. package/dist/x/flatten.mjs +1 -1
  214. package/dist/x/groupBy.es.js +1 -1
  215. package/dist/x/groupBy.es.min.js +1 -1
  216. package/dist/x/groupBy.js +1 -1
  217. package/dist/x/groupBy.min.js +1 -1
  218. package/dist/x/groupBy.mjs +1 -1
  219. package/dist/x/has.es.js +1 -1
  220. package/dist/x/has.es.min.js +1 -1
  221. package/dist/x/has.js +1 -1
  222. package/dist/x/has.min.js +1 -1
  223. package/dist/x/has.mjs +1 -1
  224. package/dist/x/identity.es.js +1 -1
  225. package/dist/x/identity.es.min.js +1 -1
  226. package/dist/x/identity.js +1 -1
  227. package/dist/x/identity.min.js +1 -1
  228. package/dist/x/identity.mjs +1 -1
  229. package/dist/x/includes.es.js +1 -1
  230. package/dist/x/includes.es.min.js +1 -1
  231. package/dist/x/includes.js +1 -1
  232. package/dist/x/includes.min.js +1 -1
  233. package/dist/x/includes.mjs +1 -1
  234. package/dist/x/isDeepEqual.es.js +1 -1
  235. package/dist/x/isDeepEqual.es.min.js +1 -1
  236. package/dist/x/isDeepEqual.js +1 -1
  237. package/dist/x/isDeepEqual.min.js +1 -1
  238. package/dist/x/isDeepEqual.mjs +1 -1
  239. package/dist/x/isEmpty.es.js +1 -1
  240. package/dist/x/isEmpty.es.min.js +1 -1
  241. package/dist/x/isEmpty.js +1 -1
  242. package/dist/x/isEmpty.min.js +1 -1
  243. package/dist/x/isEmpty.mjs +1 -1
  244. package/dist/x/isEqual.es.js +1 -1
  245. package/dist/x/isEqual.es.min.js +1 -1
  246. package/dist/x/isEqual.js +1 -1
  247. package/dist/x/isEqual.min.js +1 -1
  248. package/dist/x/isEqual.mjs +1 -1
  249. package/dist/x/isFunction.es.js +1 -1
  250. package/dist/x/isFunction.es.min.js +1 -1
  251. package/dist/x/isFunction.js +1 -1
  252. package/dist/x/isFunction.min.js +1 -1
  253. package/dist/x/isFunction.mjs +1 -1
  254. package/dist/x/isIn.es.js +1 -1
  255. package/dist/x/isIn.es.min.js +1 -1
  256. package/dist/x/isIn.js +1 -1
  257. package/dist/x/isIn.min.js +1 -1
  258. package/dist/x/isIn.mjs +1 -1
  259. package/dist/x/isObject.es.js +1 -1
  260. package/dist/x/isObject.es.min.js +1 -1
  261. package/dist/x/isObject.js +1 -1
  262. package/dist/x/isObject.min.js +1 -1
  263. package/dist/x/isObject.mjs +1 -1
  264. package/dist/x/isString.es.js +1 -1
  265. package/dist/x/isString.es.min.js +1 -1
  266. package/dist/x/isString.js +1 -1
  267. package/dist/x/isString.min.js +1 -1
  268. package/dist/x/isString.mjs +1 -1
  269. package/dist/x/keys.es.js +1 -1
  270. package/dist/x/keys.es.min.js +1 -1
  271. package/dist/x/keys.js +1 -1
  272. package/dist/x/keys.min.js +1 -1
  273. package/dist/x/keys.mjs +1 -1
  274. package/dist/x/last.es.js +1 -1
  275. package/dist/x/last.es.min.js +1 -1
  276. package/dist/x/last.js +1 -1
  277. package/dist/x/last.min.js +1 -1
  278. package/dist/x/last.mjs +1 -1
  279. package/dist/x/maxBy.es.js +1 -1
  280. package/dist/x/maxBy.es.min.js +1 -1
  281. package/dist/x/maxBy.js +1 -1
  282. package/dist/x/maxBy.min.js +1 -1
  283. package/dist/x/maxBy.mjs +1 -1
  284. package/dist/x/noop.es.js +1 -1
  285. package/dist/x/noop.es.min.js +1 -1
  286. package/dist/x/noop.js +1 -1
  287. package/dist/x/noop.min.js +1 -1
  288. package/dist/x/noop.mjs +1 -1
  289. package/dist/x/pluck.es.js +1 -1
  290. package/dist/x/pluck.es.min.js +1 -1
  291. package/dist/x/pluck.js +1 -1
  292. package/dist/x/pluck.min.js +1 -1
  293. package/dist/x/pluck.mjs +1 -1
  294. package/dist/x/prepend.es.js +1 -1
  295. package/dist/x/prepend.es.min.js +1 -1
  296. package/dist/x/prepend.js +1 -1
  297. package/dist/x/prepend.min.js +1 -1
  298. package/dist/x/prepend.mjs +1 -1
  299. package/dist/x/size.es.js +1 -1
  300. package/dist/x/size.es.min.js +1 -1
  301. package/dist/x/size.js +1 -1
  302. package/dist/x/size.min.js +1 -1
  303. package/dist/x/size.mjs +1 -1
  304. package/dist/x/trace.es.js +1 -1
  305. package/dist/x/trace.es.min.js +1 -1
  306. package/dist/x/trace.js +1 -1
  307. package/dist/x/trace.min.js +1 -1
  308. package/dist/x/trace.mjs +1 -1
  309. package/dist/x/unionWith.es.js +1 -1
  310. package/dist/x/unionWith.es.min.js +1 -1
  311. package/dist/x/unionWith.js +1 -1
  312. package/dist/x/unionWith.min.js +1 -1
  313. package/dist/x/unionWith.mjs +1 -1
  314. package/dist/x/uniq.es.js +1 -1
  315. package/dist/x/uniq.es.min.js +1 -1
  316. package/dist/x/uniq.js +1 -1
  317. package/dist/x/uniq.min.js +1 -1
  318. package/dist/x/uniq.mjs +1 -1
  319. package/dist/x/unless.es.js +1 -1
  320. package/dist/x/unless.es.min.js +1 -1
  321. package/dist/x/unless.js +1 -1
  322. package/dist/x/unless.min.js +1 -1
  323. package/dist/x/unless.mjs +1 -1
  324. package/dist/x/values.es.js +1 -1
  325. package/dist/x/values.es.min.js +1 -1
  326. package/dist/x/values.js +1 -1
  327. package/dist/x/values.min.js +1 -1
  328. package/dist/x/values.mjs +1 -1
  329. package/dist/x/when.es.js +1 -1
  330. package/dist/x/when.es.min.js +1 -1
  331. package/dist/x/when.js +1 -1
  332. package/dist/x/when.min.js +1 -1
  333. package/dist/x/when.mjs +1 -1
  334. package/eq.js +9 -0
  335. package/es.js +1 -1
  336. package/every.js +12 -3
  337. package/filter.js +3 -7
  338. package/flatMap.js +8 -7
  339. package/get.js +16 -0
  340. package/gt.js +9 -0
  341. package/gte.js +9 -0
  342. package/index.js +1 -1
  343. package/lt.js +9 -0
  344. package/lte.js +9 -0
  345. package/map.js +7 -14
  346. package/monad/AsyncPool.js +0 -0
  347. package/monad/BrokenPromise.js +63 -0
  348. package/monad/BrokenPromise.test.js +22 -0
  349. package/monad/Cancellable.js +84 -0
  350. package/monad/Cancellable.memoryUsage.js +60 -0
  351. package/monad/Cancellable.test.js +20 -0
  352. package/monad/Function.js +0 -0
  353. package/monad/Instance.benchmark.js +378 -0
  354. package/monad/Instance.js +351 -0
  355. package/monad/Instance.test.js +445 -0
  356. package/monad/Mux.benchmark.js +29 -0
  357. package/monad/Mux.js +589 -0
  358. package/monad/Mux.test.js +512 -0
  359. package/monad/PossiblePromise.benchmark.js +87 -0
  360. package/monad/PossiblePromise.js +144 -0
  361. package/monad/PossiblePromise.test.js +89 -0
  362. package/monad/README.md +75 -0
  363. package/monad/Reducer.js +0 -0
  364. package/monad/Sequence.benchmark.js +42 -0
  365. package/monad/Sequence.js +36 -0
  366. package/monad/SpecScript.js +0 -0
  367. package/monad/Stack.js +0 -0
  368. package/monad/Struct.benchmark.js +154 -0
  369. package/monad/Struct.js +249 -0
  370. package/monad/Struct.test.js +237 -0
  371. package/package.json +2 -1
  372. package/reduce.js +1 -0
  373. package/set.js +13 -4
  374. package/some.js +15 -4
  375. package/switchCase.js +21 -2
  376. package/transform.js +8 -8
@@ -0,0 +1,249 @@
1
+ /* rubico v1.5.0
2
+ * https://github.com/a-synchronous/rubico
3
+ * (c) 2019-2020 Richard Tong
4
+ * rubico may be freely distributed under the MIT license.
5
+ */
6
+
7
+ 'use strict'
8
+
9
+ const Instance = require('./Instance')
10
+
11
+ const { isArray, isObject, isSet, isMap } = Instance
12
+
13
+ /**
14
+ * @synopsis
15
+ * isStruct(x any) -> boolean
16
+ */
17
+ const isStruct = x => isArray(x) || isObject(x) || isSet(x) || isMap(x)
18
+
19
+ /**
20
+ * @name Struct
21
+ *
22
+ * @synopsis
23
+ * new Struct(x Array|Object|Set|Map) -> Struct
24
+ *
25
+ * @catchphrase
26
+ * Finite data structure
27
+ */
28
+ const Struct = function(x) {
29
+ if (!isStruct(x)) {
30
+ throw new TypeError(`cannot convert ${x} to Struct`)
31
+ }
32
+ this.value = x
33
+ }
34
+
35
+ /**
36
+ * @name Struct.isStruct
37
+ *
38
+ * @synopsis
39
+ * Struct.isStruct(x any) -> boolean
40
+ *
41
+ * @catchphrase
42
+ * Tell if struct
43
+ */
44
+ Struct.isStruct = isStruct
45
+
46
+ /**
47
+ * @synopsis
48
+ * <T>objectEntriesGenerator(x Object<T>) -> Iterator<[key string, T]>
49
+ */
50
+ const objectEntriesGenerator = function*(x) {
51
+ for (const k in x) {
52
+ yield [k, x[k]]
53
+ }
54
+ }
55
+
56
+ /**
57
+ * @name Struct.entries
58
+ *
59
+ * @synopsis
60
+ * <T any>Struct.entries(x Array<T>) -> Iterator<[index number, T]>
61
+ *
62
+ * <T any>Struct.entries(x Object<T>) -> Iterator<[key string, T]>
63
+ *
64
+ * <T any>Struct.entries(x Set<T>) -> Iterator<[T, T]>
65
+ *
66
+ * <A any, B any>Struct.entries(x Map<A, B>) -> Iterator<[A, B]>
67
+ *
68
+ * @catchphrase
69
+ * Get an iterator of key value pairs
70
+ */
71
+ Struct.entries = x => isObject(x) ? objectEntriesGenerator(x) : x.entries()
72
+
73
+ /**
74
+ * @synopsis
75
+ * <T>objectValuesGenerator(x Object<T>) -> Iterator<T>
76
+ */
77
+ const objectValuesGenerator = function*(x) {
78
+ for (const k in x) {
79
+ yield x[k]
80
+ }
81
+ }
82
+
83
+ /**
84
+ * @name Struct.values
85
+ *
86
+ * @synopsis
87
+ * <T any>Struct.values(
88
+ * x Array<T>|Object<T>|Set<T>|Map<any, T>
89
+ * ) -> Iterator<T>
90
+ *
91
+ * @catchphrase
92
+ * Get an iterator of values
93
+ */
94
+ Struct.values = x => isObject(x) ? objectValuesGenerator(x) : x.values()
95
+
96
+ /**
97
+ * @name Struct.get
98
+ *
99
+ * @synopsis
100
+ * <T any>Struct.get(x Array<T>, index number) -> T|undefined
101
+ *
102
+ * <T any>Struct.get(x Object<T>, index string) -> T|undefined
103
+ *
104
+ * <T any>Struct.get(x Set<T>, index T) -> T|undefined
105
+ *
106
+ * <A any, B any>Struct.get(x Map<A, B>, index A) -> B|undefined
107
+ *
108
+ * @catchphrase
109
+ * Get an item by index
110
+ */
111
+ Struct.get = (x, index) => {
112
+ if (typeof x.get == 'function') return x.get(index)
113
+ if (typeof x.has == 'function') return x.has(index) ? index : undefined
114
+ return x[index]
115
+ }
116
+
117
+ /*
118
+ Struct.get.ternary = (x, index) => (typeof x.get == 'function'
119
+ ? x.get(index) : typeof x.has == 'function'
120
+ ? x.has(index) ? index : undefined : x[index])
121
+ */
122
+
123
+ /**
124
+ * @name Struct.set
125
+ *
126
+ * @synopsis
127
+ * Struct.set(x Array, value any, index number) -> mutated Array
128
+ *
129
+ * Struct.set(x Object, value any, index string) -> mutated Object
130
+ *
131
+ * Struct.set(x Set, value any) -> mutated Set
132
+ *
133
+ * Struct.set(x Map, value any, index any) -> mutated Map
134
+ *
135
+ * @catchphrase
136
+ * Set a value
137
+ */
138
+ Struct.set = (x, value, index) => {
139
+ if (typeof x.set == 'function') return x.set(index, value)
140
+ if (typeof x.add == 'function') return x.add(value)
141
+ x[index] = value
142
+ return x
143
+ }
144
+
145
+ /**
146
+ * @synopsis
147
+ * objectKeysCount(obj object) -> ct number
148
+ */
149
+ const objectKeysCount = obj => {
150
+ let ct = 0
151
+ for (const _ in obj) ct += 1
152
+ return ct
153
+ }
154
+
155
+ /**
156
+ * @name Struct.size
157
+ *
158
+ * @synopsis
159
+ * Struct.size(x Array|Object|Set|Map) -> number
160
+ *
161
+ * @catchphrase
162
+ * Count values
163
+ */
164
+ Struct.size = x => {
165
+ if (isObject(x)) return objectKeysCount(x)
166
+ return 'size' in x ? x.size : x.length
167
+ }
168
+
169
+ /*
170
+ Struct.size.objectKeys = x => {
171
+ if (isObject(x)) return Object.keys(x).length
172
+ return 'size' in x ? x.size : x.length
173
+ }
174
+ */
175
+
176
+ /**
177
+ * @synopsis
178
+ * copySet(x Set) -> y Set
179
+ */
180
+ const copySet = x => {
181
+ const y = new Set()
182
+ for (const item of x) y.add(item)
183
+ return y
184
+ }
185
+
186
+
187
+ /**
188
+ * @synopsis
189
+ * copyMap(x Map) -> y Map
190
+ */
191
+ const copyMap = x => {
192
+ const y = new Map()
193
+ for (const entry of x) y.set(...entry)
194
+ return y
195
+ }
196
+
197
+ /**
198
+ * @name Struct.copy
199
+ *
200
+ * @synopsis
201
+ * Struct.copy(x Array) -> copied Array
202
+ *
203
+ * Struct.copy(x Object) -> copied Object
204
+ *
205
+ * Struct.copy(x Set) -> copied Set
206
+ *
207
+ * Struct.copy(x Map) -> copied Map
208
+ *
209
+ * @catchphrase
210
+ * Shallow copy a struct
211
+ */
212
+ Struct.copy = x => {
213
+ if (isArray(x)) return x.slice()
214
+ if (isObject(x)) return { ...x }
215
+ return isSet(x) ? copySet(x) : copyMap(x)
216
+ }
217
+
218
+ const { entries: structEntries, set: structSet } = Struct
219
+
220
+ /**
221
+ * @name Struct.copyDeep
222
+ *
223
+ * @synopsis
224
+ * Struct.copyDeep(x Array) -> deeplyCopied Array
225
+ *
226
+ * Struct.copyDeep(x Object) -> deeplyCopied Object
227
+ *
228
+ * Struct.copyDeep(x Set) -> deeplyCopied Set
229
+ *
230
+ * Struct.copyDeep(x Map) -> deeplyCopied Map
231
+ *
232
+ * @catchphrase
233
+ * Deep copy a struct
234
+ */
235
+ const structCopyDeep = x => {
236
+ const y = new x.constructor()
237
+ for (const [index, value] of structEntries(x)) {
238
+ structSet(
239
+ y,
240
+ isStruct(value) ? structCopyDeep(value) : value,
241
+ index,
242
+ )
243
+ }
244
+ return y
245
+ }
246
+
247
+ Struct.copyDeep = structCopyDeep
248
+
249
+ module.exports = Struct
@@ -0,0 +1,237 @@
1
+ const assert = require('assert')
2
+ const Struct = require('./Struct')
3
+
4
+ describe('Struct', () => {
5
+ describe('new Struct(x Array|Object|Set|Map) -> Struct', () => {
6
+ it('x Array; Struct', async () => {
7
+ assert.equal(new Struct([1, 2, 3]).constructor, Struct)
8
+ })
9
+ it('x Object; Struct', async () => {
10
+ assert.equal(new Struct({ a: 1, b: 2, c: 3 }).constructor, Struct)
11
+ })
12
+ it('x Set; Struct', async () => {
13
+ assert.equal(new Struct(new Set([1, 2, 3])).constructor, Struct)
14
+ })
15
+ it('x Map; Struct', async () => {
16
+ assert.equal(new Struct(new Map([['a', 1], ['b', 2], ['c', 3]])).constructor, Struct)
17
+ })
18
+ it('x string; TypeError', async () => {
19
+ assert.throws(
20
+ () => new Struct('hey'),
21
+ new TypeError('cannot convert hey to Struct')
22
+ )
23
+ })
24
+ it('x null; TypeError', async () => {
25
+ assert.throws(
26
+ () => new Struct(null),
27
+ new TypeError('cannot convert null to Struct')
28
+ )
29
+ })
30
+ it('x undefined; TypeError', async () => {
31
+ assert.throws(
32
+ () => new Struct(undefined),
33
+ new TypeError('cannot convert undefined to Struct')
34
+ )
35
+ })
36
+ })
37
+
38
+ describe('Struct.isStruct(x any) -> boolean', () => {
39
+ it('x Array; true', async () => {
40
+ assert.equal(Struct.isStruct([]), true)
41
+ })
42
+ it('x Object; true', async () => {
43
+ assert.equal(Struct.isStruct({}), true)
44
+ })
45
+ it('x Set; true', async () => {
46
+ assert.equal(Struct.isStruct(new Set()), true)
47
+ })
48
+ it('x Map; true', async () => {
49
+ assert.equal(Struct.isStruct(new Map()), true)
50
+ })
51
+ it('x ArrayBuffer; false', async () => {
52
+ assert.equal(Struct.isStruct(new ArrayBuffer()), false)
53
+ })
54
+ it('x Number; false', async () => {
55
+ assert.equal(Struct.isStruct(1), false)
56
+ })
57
+ it('x String; false', async () => {
58
+ assert.equal(Struct.isStruct('hey'), false)
59
+ })
60
+ })
61
+
62
+ const nativeObjectToString = Object.prototype.toString
63
+
64
+ const objectToString = x => nativeObjectToString.call(x)
65
+
66
+ it('<T any>Struct.entries(x Array<T>) -> Iterator<[index number, T]>', async () => {
67
+ assert.equal(objectToString(Struct.entries([1, 2, 3])), '[object Array Iterator]')
68
+ assert.deepEqual([...Struct.entries([1, 2, 3])], [[0, 1], [1, 2], [2, 3]])
69
+ })
70
+
71
+ it('<T any>Struct.entries(x Object<T>) -> Iterator<[key string, T]>', async () => {
72
+ assert.equal(objectToString(Struct.entries({ a: 1, b: 2, c: 3 })), '[object Generator]')
73
+ assert.deepEqual([...Struct.entries({ a: 1, b: 2, c: 3 })], [['a', 1], ['b', 2], ['c', 3]])
74
+ })
75
+
76
+ it('<T any>Struct.entries(x Set<T>) -> Iterator<[T, T]>', async () => {
77
+ assert.equal(objectToString(Struct.entries(new Set([1, 2, 3]))), '[object Set Iterator]')
78
+ assert.deepEqual([...Struct.entries(new Set([1, 2, 3]))], [[1, 1], [2, 2], [3, 3]])
79
+ })
80
+
81
+ it('<A any, B any>Struct.entries(x Map<A, B>) -> Iterator<[A, B]>', async () => {
82
+ assert.equal(objectToString(Struct.entries(new Map([[1, 'a'], [2, 'b'], [3, 'c']]))), '[object Map Iterator]')
83
+ assert.deepEqual([...Struct.entries(new Map([[1, 'a'], [2, 'b'], [3, 'c']]))], [[1, 'a'], [2, 'b'], [3, 'c']])
84
+ })
85
+
86
+ describe('<T any>Struct.values(x Array<T>|Object<T>|Set<T>|Map<any, T>) -> Iterator<T>', () => {
87
+ it('x Array<T>; Iterator<T>', async () => {
88
+ assert.equal(objectToString(Struct.values([1, 2, 3])), '[object Array Iterator]')
89
+ assert.deepEqual([...Struct.values([1, 2, 3])], [1, 2, 3])
90
+ })
91
+ it('x Object<T>; Iterator<T>', async () => {
92
+ assert.equal(objectToString(Struct.values({ a: 1, b: 2, c: 3 })), '[object Generator]')
93
+ assert.deepEqual([...Struct.values({ a: 1, b: 2, c: 3 })], [1, 2, 3])
94
+ })
95
+ it('x Set<T>; Iterator<T>', async () => {
96
+ assert.equal(objectToString(Struct.values(new Set([1, 2, 3]))), '[object Set Iterator]')
97
+ assert.deepEqual([...Struct.values(new Set([1, 2, 3]))], [1, 2, 3])
98
+ })
99
+ it('x Map<T>; Iterator<T>', async () => {
100
+ assert.equal(objectToString(Struct.values(new Map([[1, 'a'], [2, 'b'], [3, 'c']]))), '[object Map Iterator]')
101
+ assert.deepEqual([...Struct.values(new Map([[1, 'a'], [2, 'b'], [3, 'c']]))], ['a', 'b', 'c'])
102
+ })
103
+ })
104
+
105
+ it('<T any>Struct.get(x Array<T>, index number) -> T|undefined', async () => {
106
+ assert.equal(Struct.get([1, 2, 3], 0), 1)
107
+ assert.strictEqual(Struct.get([1, 2, 3], 4), undefined)
108
+ })
109
+
110
+ it('<T any>Struct.get(x Object<T>, index string) -> T|undefined', async () => {
111
+ assert.equal(Struct.get({ a: 1, b: 2, c: 3 }, 'a'), 1)
112
+ assert.strictEqual(Struct.get({ a: 1, b: 2, c: 3 }, 'e'), undefined)
113
+ })
114
+
115
+ it('<T any>Struct.get(x Set<T>, index T) -> T|undefined', async () => {
116
+ assert.equal(Struct.get(new Set([1, 2, 3]), 1), 1)
117
+ assert.strictEqual(Struct.get(new Set([1, 2, 3]), 5), undefined)
118
+ })
119
+
120
+ it('<A any, B any>Struct.get(x Map<A, B>, index A) -> B|undefined', async () => {
121
+ const m = new Map([[1, 'a'], [2, 'b'], [3, 'c']])
122
+ assert.equal(Struct.get(m, 1), 'a')
123
+ assert.strictEqual(Struct.get(m, 5), undefined)
124
+ })
125
+
126
+ it('Struct.set(x Array, value any, index number) -> mutated Array', async () => {
127
+ const arr = [1, 2]
128
+ assert.deepEqual(Struct.set(arr, 3, 2), [1, 2, 3])
129
+ })
130
+
131
+ it('Struct.set(x Object, value any, index string) -> mutated Object', async () => {
132
+ const obj = { a: 1, b: 2 }
133
+ assert.deepEqual(Struct.set(obj, 3, 'c'), { a: 1, b: 2, c: 3 })
134
+ })
135
+
136
+ it('Struct.set(x Set, value any) -> mutated Set', async () => {
137
+ const set = new Set([1, 2])
138
+ assert.deepEqual(Struct.set(set, 3), new Set([1, 2, 3]))
139
+ })
140
+
141
+ it('Struct.set(x Map, value any, index any) -> mutated Map', async () => {
142
+ const map = new Map([['a', 1], ['b', 2]])
143
+ assert.deepEqual(Struct.set(map, 3, 'c'), new Map([['a', 1], ['b', 2], ['c', 3]]))
144
+ })
145
+
146
+ describe('Struct.size(x Array|Object|Set|Map) -> y number', () => {
147
+ it('x [1, 2, 3]; y 3', async () => {
148
+ assert.strictEqual(Struct.size([1, 2, 3]), 3)
149
+ })
150
+ it('x []; y 0', async () => {
151
+ assert.strictEqual(Struct.size([]), 0)
152
+ })
153
+ it('x { a: 1, b: 2, c: 3 }; y 3', async () => {
154
+ assert.strictEqual(Struct.size({ a: 1, b: 2, c: 3 }), 3)
155
+ })
156
+ it('x {}; y 0', async () => {
157
+ assert.strictEqual(Struct.size({}), 0)
158
+ })
159
+ it('x Set<[1, 2, 3]>; y 3', async () => {
160
+ assert.strictEqual(Struct.size(new Set([1, 2, 3])), 3)
161
+ })
162
+ it('x Set<[]>; y 0', async () => {
163
+ assert.strictEqual(Struct.size(new Set()), 0)
164
+ })
165
+ it('x Map<[[\'a\', 1], [\'b\', 2], [\'c\', 3]]>; y 3', async () => {
166
+ assert.strictEqual(Struct.size(new Map([['a', 1], ['b', 2], ['c', 3]])), 3)
167
+ })
168
+ it('x Map<[]>; y 0', async () => {
169
+ assert.strictEqual(Struct.size(new Map()), 0)
170
+ })
171
+ })
172
+
173
+ it('Struct.copy(x Array) -> copied Array', async () => {
174
+ const arr = [1, 2, 3]
175
+ const copied = Struct.copy(arr)
176
+ assert(copied !== arr)
177
+ assert.deepEqual(arr, copied)
178
+ })
179
+
180
+ it('Struct.copy(x Object) -> copied Object', async () => {
181
+ const obj = { a: 1, b: 2, c: 3 }
182
+ const copied = Struct.copy(obj)
183
+ assert(copied !== obj)
184
+ assert.deepEqual(obj, copied)
185
+ })
186
+
187
+ it('Struct.copy(x Set) -> copied Set', async () => {
188
+ const set = new Set([1, 2, 3])
189
+ const copied = Struct.copy(set)
190
+ assert(copied !== set)
191
+ assert.deepEqual(set, copied)
192
+ })
193
+
194
+ it('Struct.copy(x Map) -> copied Map', async () => {
195
+ const map = new Map([['a', 1], ['b', 2], ['c', 3]])
196
+ const copied = Struct.copy(map)
197
+ assert(copied !== map)
198
+ assert.deepEqual(map, copied)
199
+ })
200
+
201
+ it('Struct.copyDeep(x Array) -> deeplyCopied Array', async () => {
202
+ const arr = [1, [2], [[3], 'hey', new Uint8Array([1, 2, 3])]]
203
+ const copied = Struct.copyDeep(arr)
204
+ assert(copied !== arr)
205
+ assert.deepEqual(arr, copied)
206
+ })
207
+
208
+ it('Struct.copyDeep(x Object) -> deeplyCopied Object', async () => {
209
+ const obj = { a: 1, b: [2], c: [[3]], d: new Set([NaN, 'hey', { a: null }]) }
210
+ const copied = Struct.copy(obj)
211
+ assert(copied !== obj)
212
+ assert.deepEqual(obj, copied)
213
+ })
214
+
215
+ it('Struct.copyDeep(x Set) -> deeplyCopied Set', async () => {
216
+ const set = new Set([1, [2], [[[[3]]]], {}, [], undefined])
217
+ const copied = Struct.copy(set)
218
+ assert(copied !== set)
219
+ assert.deepEqual(set, copied)
220
+ })
221
+
222
+ it('Struct.copyDeep(x Map) -> deeplyCopied Map', async () => {
223
+ const map = new Map([
224
+ ['a', 1], ['b', 2], ['c', 3],
225
+ [Symbol.for('ayo'), {}], ['hey', {
226
+ a: [1, [2], [[3]]],
227
+ b: new Set([undefined, null, {}, [], new RegExp()]),
228
+ c: { d: { e: new BigInt64Array([1n, 2n, 3n]) } },
229
+ }],
230
+ ])
231
+ const copied = Struct.copy(map)
232
+ assert(copied !== map)
233
+ assert.deepEqual(map, copied)
234
+ assert.strictEqual(map.get('hey').c.d.e, copied.get('hey').c.d.e)
235
+ // anything not a struct is a reference. This is good for performance but could be dangerous
236
+ })
237
+ })
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rubico",
3
- "version": "2.2.0",
3
+ "version": "2.2.2",
4
4
  "description": "[a]synchronous functional programming",
5
5
  "author": "Richard Tong",
6
6
  "license": "MIT",
@@ -14,6 +14,7 @@
14
14
  "_internal",
15
15
  "dist",
16
16
  "x",
17
+ "monad",
17
18
  "index.js",
18
19
  "es.js",
19
20
  "global.js",
package/reduce.js CHANGED
@@ -22,6 +22,7 @@ const _reduce = function (collection, reducer, initialValue) {
22
22
  * @synopsis
23
23
  * ```coffeescript [specscript]
24
24
  * type Foldable = Array|Object|Map|Iterator|AsyncIterator
25
+ *
25
26
  * type Reducer = (
26
27
  * accumulator any,
27
28
  * value any,
package/set.js CHANGED
@@ -39,7 +39,7 @@ const _set = function (obj, path, value) {
39
39
  * @synopsis
40
40
  * ```coffeescript [specscript]
41
41
  * set(
42
- * object Object,
42
+ * object Promise|Object,
43
43
  * path string|Array<string|number>,
44
44
  * value function|any,
45
45
  * ) -> result Promise|Object
@@ -60,15 +60,15 @@ const _set = function (obj, path, value) {
60
60
  * * an array of keys or indices - `['a', 0, 'value']`
61
61
  *
62
62
  * ```javascript [playground]
63
- * console.log(set('a', 1)({ b: 2 })) // { a: 1, b: 2 }
63
+ * console.log(set({ b: 2 }, 'a', 1)) // { a: 1, b: 2 }
64
64
  *
65
65
  * const nestedAC2 = { a: { c: 2 } }
66
66
  *
67
- * console.log(set('a.b', 1)(nestedAC2)) // { a : { b: 1, c: 2 }}
67
+ * console.log(set(nestedAC2, 'a.b', 1)) // { a : { b: 1, c: 2 }}
68
68
  *
69
69
  * const nestedA0BC3 = { a: [{ b: { c: 3 } }] }
70
70
  *
71
- * console.log(set('a[0].b.c', 4)(nestedA0BC3)) // { a: [{ b: { c: 4 } }] }
71
+ * console.log(set(nestedA0BC3, 'a[0].b.c', 4)) // { a: [{ b: { c: 4 } }] }
72
72
  * ```
73
73
  *
74
74
  * The property value may be a function, in which case it is treated as a resolver and provided the argument object to resolve the value to set.
@@ -81,6 +81,15 @@ const _set = function (obj, path, value) {
81
81
  * console.log(myNewObj) // { a: 1, b: 3 }
82
82
  * ```
83
83
  *
84
+ * `set` supports a tacit API for composability.
85
+ *
86
+ * ```javascript [playground]
87
+ * pipe({ a: 1 }, [
88
+ * set('b', 2),
89
+ * console.log, // { a: 1, b: 2 }
90
+ * ])
91
+ * ```
92
+ *
84
93
  * @since 1.7.0
85
94
  */
86
95
 
package/some.js CHANGED
@@ -75,10 +75,21 @@ const _some = function (collection, predicate) {
75
75
  * yield 1; yield 2; yield 3; yield 4; yield 5
76
76
  * }
77
77
  *
78
- * some(pipe([
79
- * fetchTodo,
80
- * todo => todo.title.startsWith('fugiat'),
81
- * ]))(todoIDsGenerator()).then(console.log) // true
78
+ * const promise = some(todoIDsGenerator(), async id => {
79
+ * const todo = await fetchTodo(id)
80
+ * return todo.title.startsWith('fugiat')
81
+ * })
82
+ *
83
+ * promise.then(console.log) // true
84
+ * ```
85
+ *
86
+ * `some` supports a tacit API for composability.
87
+ *
88
+ * ```javascript [playground]
89
+ * pipe([1, 2, 3], [
90
+ * some(number => number < 5),
91
+ * console.log, // true
92
+ * ])
82
93
  * ```
83
94
  *
84
95
  * @execution concurrent
package/switchCase.js CHANGED
@@ -15,12 +15,31 @@ const curryArgs3 = require('./_internal/curryArgs3')
15
15
  * switchCase(conditionalValues Array<boolean|any>) -> Promise|any
16
16
  *
17
17
  * switchCase(
18
+ * ...args,
19
+ * conditionalFuncsOrValues Array<function|boolean|any>
20
+ * ) -> Promise|any
21
+ *
22
+ * switchCase(
18
23
  * conditionalFuncsOrValues Array<function|boolean|any>
19
24
  * )(...args) -> Promise|any
20
25
  * ```
21
26
  *
22
27
  * @description
23
- * Functional equivalent to the [Conditional (ternary) operator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Conditional_Operator). Accepts an array of conditional functions that specifies cases as pairings of `predicate` and `resolver` functions with the exception of the last, default resolver. All functions are provided with the same arguments and executed in series. The result of a `switchCase` execution is either the result of the execution the last default resolver, or the result of the execution of the first resolver where the associated predicate tested truthy.
28
+ * Functional equivalent to the [Conditional (ternary) operator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Conditional_Operator). Accepts an array of conditional functions that specifies cases as pairings of `predicate` and `resolver` functions with the exception of the last, default resolver. All functions are provided with the same arguments and executed in series. The result of a `switchCase` operation is either the result of the execution the last default resolver, or the result of the execution of the first resolver where the associated predicate tested true.
29
+ *
30
+ * ```javascript [playground]
31
+ * const fruitIsYellow = fruit => fruit.color == 'yellow'
32
+ *
33
+ * console.log(
34
+ * switchCase({ name: 'plantain', color: 'yellow' }, [
35
+ * fruitIsYellow,
36
+ * fruit => fruit.name + ' is possibly a banana',
37
+ * fruit => fruit.name + ' is probably not a banana',
38
+ * ])
39
+ * ) // plantain is possibly a banana
40
+ * ```
41
+ *
42
+ * For composability `switchCase` supports a tacit API.
24
43
  *
25
44
  * ```javascript [playground]
26
45
  * const fruitIsYellow = fruit => fruit.color == 'yellow'
@@ -38,7 +57,7 @@ const curryArgs3 = require('./_internal/curryArgs3')
38
57
  * // apple is probably not a banana
39
58
  * ```
40
59
  *
41
- * Any function can be replaced with a nonfunction (object or primitive) value so that the value is treated as an already resolved value.
60
+ * Any function can be replaced with a nonfunction (object or primitive) value to be used directly in the operation.
42
61
  *
43
62
  * ```javascript [playground]
44
63
  * switchCase([
package/transform.js CHANGED
@@ -26,8 +26,6 @@ const _transform = function (collection, transducer, initialValue) {
26
26
  * type Transformable = Array|String|Set|TypedArray|{ concat: function }|{ write: function }|Object
27
27
  * type Foldable = Iterable|AsyncIterable|Object<value any>
28
28
  *
29
- * initialValue Transformable|((foldable Foldable)=>Promise|Transformable)
30
- *
31
29
  * transform(
32
30
  * foldable Foldable,
33
31
  * transducer Transducer,
@@ -58,9 +56,9 @@ const _transform = function (collection, transducer, initialValue) {
58
56
  *
59
57
  * const isOdd = number => number % 2 == 1
60
58
  *
61
- * const squaredOdds = pipe([
62
- * filter(isOdd),
63
- * map(square),
59
+ * const squaredOdds = compose([
60
+ * Transducer.filter(isOdd),
61
+ * Transducer.map(square),
64
62
  * ])
65
63
  *
66
64
  * // transform arrays into arrays
@@ -96,7 +94,7 @@ const _transform = function (collection, transducer, initialValue) {
96
94
  * },
97
95
  * }
98
96
  *
99
- * transform(map(square), Stdout)([1, 2, 3, 4, 5])
97
+ * transform(Transducer.map(square), Stdout)([1, 2, 3, 4, 5])
100
98
  * // 1
101
99
  * // 4
102
100
  * // 9
@@ -124,8 +122,10 @@ const _transform = function (collection, transducer, initialValue) {
124
122
  * }
125
123
  *
126
124
  * transform(
127
- * map(pipe([square, toString])), process.stdout,
128
- * )(streamRandomInts()) // 9216576529289484980147613249169774446246768649...
125
+ * streamRandomInts(),
126
+ * Transducer.map(pipe([square, toString])),
127
+ * process.stdout,
128
+ * ) // 9216576529289484980147613249169774446246768649...
129
129
  * ```
130
130
  *
131
131
  * @execution series