@fncts/base 0.0.31 → 0.0.32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (233) hide show
  1. package/_cjs/collection/compat/Array/api.cjs +53 -0
  2. package/_cjs/collection/compat/Array/api.cjs.map +1 -1
  3. package/_cjs/collection/immutable/Conc/api.cjs +4 -1
  4. package/_cjs/collection/immutable/Conc/api.cjs.map +1 -1
  5. package/_cjs/collection/immutable/Dictionary/api.cjs +54 -8
  6. package/_cjs/collection/immutable/Dictionary/api.cjs.map +1 -1
  7. package/_cjs/collection/immutable/HashMap/api.cjs +7 -4
  8. package/_cjs/collection/immutable/HashMap/api.cjs.map +1 -1
  9. package/_cjs/collection/immutable/HashSet/api.cjs +7 -4
  10. package/_cjs/collection/immutable/HashSet/api.cjs.map +1 -1
  11. package/_cjs/collection/immutable/ImmutableArray/api.cjs +9 -6
  12. package/_cjs/collection/immutable/ImmutableArray/api.cjs.map +1 -1
  13. package/_cjs/collection/internal.cjs +6 -0
  14. package/_cjs/collection/internal.cjs.map +1 -0
  15. package/_cjs/collection/mutable/ArrayDeque.cjs +214 -0
  16. package/_cjs/collection/mutable/ArrayDeque.cjs.map +1 -0
  17. package/_cjs/collection/mutable/Queue.cjs +21 -0
  18. package/_cjs/collection/mutable/Queue.cjs.map +1 -0
  19. package/_cjs/control/InterruptiblePromise.cjs +23 -0
  20. package/_cjs/control/InterruptiblePromise.cjs.map +1 -0
  21. package/_cjs/control/Pure/api.cjs +20 -8
  22. package/_cjs/control/Pure/api.cjs.map +1 -1
  23. package/_cjs/data/Cause/api.cjs +8 -2
  24. package/_cjs/data/Cause/api.cjs.map +1 -1
  25. package/_cjs/data/Datum/api.cjs +8 -2
  26. package/_cjs/data/Datum/api.cjs.map +1 -1
  27. package/_cjs/data/DatumEither/api.cjs +8 -2
  28. package/_cjs/data/DatumEither/api.cjs.map +1 -1
  29. package/_cjs/data/Either/api.cjs +24 -6
  30. package/_cjs/data/Either/api.cjs.map +1 -1
  31. package/_cjs/data/Either/destructors.cjs +3 -3
  32. package/_cjs/data/Either/destructors.cjs.map +1 -1
  33. package/_cjs/data/Either/instances.cjs +10 -1
  34. package/_cjs/data/Either/instances.cjs.map +1 -1
  35. package/_cjs/data/EitherT/api.cjs +8 -2
  36. package/_cjs/data/EitherT/api.cjs.map +1 -1
  37. package/_cjs/data/Exit/constructors.cjs +4 -1
  38. package/_cjs/data/Exit/constructors.cjs.map +1 -1
  39. package/_cjs/data/Global.cjs +22 -0
  40. package/_cjs/data/Global.cjs.map +1 -0
  41. package/_cjs/data/Maybe/api.cjs +4 -1
  42. package/_cjs/data/Maybe/api.cjs.map +1 -1
  43. package/_cjs/optics/Fold/api/focus.cjs +17 -0
  44. package/_cjs/optics/Fold/api/focus.cjs.map +1 -0
  45. package/_cjs/optics/Fold/definition.cjs.map +1 -1
  46. package/_cjs/optics/Getter/definition.cjs.map +1 -1
  47. package/_cjs/optics/Index/api.cjs +16 -0
  48. package/_cjs/optics/Index/api.cjs.map +1 -1
  49. package/_cjs/optics/Iso/api.cjs +14 -0
  50. package/_cjs/optics/Iso/api.cjs.map +1 -1
  51. package/_cjs/optics/Iso/definition.cjs.map +1 -1
  52. package/_cjs/optics/Lens/api.cjs +50 -24
  53. package/_cjs/optics/Lens/api.cjs.map +1 -1
  54. package/_cjs/optics/Lens/definition.cjs +1 -1
  55. package/_cjs/optics/Lens/definition.cjs.map +1 -1
  56. package/_cjs/optics/Optional/api/focus.cjs +23 -0
  57. package/_cjs/optics/Optional/api/focus.cjs.map +1 -0
  58. package/_cjs/optics/Optional/api.cjs +16 -0
  59. package/_cjs/optics/Optional/api.cjs.map +1 -0
  60. package/_cjs/optics/Optional/definition.cjs +4 -1
  61. package/_cjs/optics/Optional/definition.cjs.map +1 -1
  62. package/_cjs/optics/Optional.cjs +22 -0
  63. package/_cjs/optics/Optional.cjs.map +1 -1
  64. package/_cjs/optics/Prism/api/focus.cjs +21 -0
  65. package/_cjs/optics/Prism/api/focus.cjs.map +1 -0
  66. package/_cjs/optics/Prism/definition.cjs +4 -1
  67. package/_cjs/optics/Prism/definition.cjs.map +1 -1
  68. package/_cjs/optics/Prism.cjs +11 -0
  69. package/_cjs/optics/Prism.cjs.map +1 -1
  70. package/_cjs/optics/Setter/api/focus.cjs +18 -0
  71. package/_cjs/optics/Setter/api/focus.cjs.map +1 -0
  72. package/_cjs/optics/Setter/definition.cjs.map +1 -1
  73. package/_cjs/optics/Traversal/api/focus.cjs +23 -0
  74. package/_cjs/optics/Traversal/api/focus.cjs.map +1 -0
  75. package/_cjs/optics/Traversal/definition.cjs.map +1 -1
  76. package/_cjs/optics/Traversal.cjs +11 -0
  77. package/_cjs/optics/Traversal.cjs.map +1 -1
  78. package/_cjs/typeclass/MonadExcept.cjs +4 -1
  79. package/_cjs/typeclass/MonadExcept.cjs.map +1 -1
  80. package/_mjs/collection/compat/Array/api.mjs +48 -0
  81. package/_mjs/collection/compat/Array/api.mjs.map +1 -1
  82. package/_mjs/collection/immutable/Conc/api.mjs +4 -1
  83. package/_mjs/collection/immutable/Conc/api.mjs.map +1 -1
  84. package/_mjs/collection/immutable/Dictionary/api.mjs +47 -5
  85. package/_mjs/collection/immutable/Dictionary/api.mjs.map +1 -1
  86. package/_mjs/collection/immutable/HashMap/api.mjs +7 -4
  87. package/_mjs/collection/immutable/HashMap/api.mjs.map +1 -1
  88. package/_mjs/collection/immutable/HashSet/api.mjs +7 -4
  89. package/_mjs/collection/immutable/HashSet/api.mjs.map +1 -1
  90. package/_mjs/collection/immutable/ImmutableArray/api.mjs +9 -6
  91. package/_mjs/collection/immutable/ImmutableArray/api.mjs.map +1 -1
  92. package/_mjs/collection/internal.mjs +2 -0
  93. package/_mjs/collection/internal.mjs.map +1 -0
  94. package/_mjs/collection/mutable/ArrayDeque.mjs +205 -0
  95. package/_mjs/collection/mutable/ArrayDeque.mjs.map +1 -0
  96. package/_mjs/collection/mutable/Queue.mjs +14 -0
  97. package/_mjs/collection/mutable/Queue.mjs.map +1 -0
  98. package/_mjs/control/InterruptiblePromise.mjs +15 -0
  99. package/_mjs/control/InterruptiblePromise.mjs.map +1 -0
  100. package/_mjs/control/Pure/api.mjs +20 -8
  101. package/_mjs/control/Pure/api.mjs.map +1 -1
  102. package/_mjs/data/Cause/api.mjs +8 -2
  103. package/_mjs/data/Cause/api.mjs.map +1 -1
  104. package/_mjs/data/Datum/api.mjs +8 -2
  105. package/_mjs/data/Datum/api.mjs.map +1 -1
  106. package/_mjs/data/DatumEither/api.mjs +8 -2
  107. package/_mjs/data/DatumEither/api.mjs.map +1 -1
  108. package/_mjs/data/Either/api.mjs +24 -6
  109. package/_mjs/data/Either/api.mjs.map +1 -1
  110. package/_mjs/data/Either/destructors.mjs +3 -3
  111. package/_mjs/data/Either/destructors.mjs.map +1 -1
  112. package/_mjs/data/Either/instances.mjs +10 -1
  113. package/_mjs/data/Either/instances.mjs.map +1 -1
  114. package/_mjs/data/EitherT/api.mjs +8 -2
  115. package/_mjs/data/EitherT/api.mjs.map +1 -1
  116. package/_mjs/data/Exit/constructors.mjs +4 -1
  117. package/_mjs/data/Exit/constructors.mjs.map +1 -1
  118. package/_mjs/data/Global.mjs +15 -0
  119. package/_mjs/data/Global.mjs.map +1 -0
  120. package/_mjs/data/Maybe/api.mjs +4 -1
  121. package/_mjs/data/Maybe/api.mjs.map +1 -1
  122. package/_mjs/optics/Fold/api/focus.mjs +11 -0
  123. package/_mjs/optics/Fold/api/focus.mjs.map +1 -0
  124. package/_mjs/optics/Fold/definition.mjs.map +1 -1
  125. package/_mjs/optics/Getter/definition.mjs.map +1 -1
  126. package/_mjs/optics/Index/api.mjs +16 -0
  127. package/_mjs/optics/Index/api.mjs.map +1 -1
  128. package/_mjs/optics/Iso/api.mjs +13 -0
  129. package/_mjs/optics/Iso/api.mjs.map +1 -1
  130. package/_mjs/optics/Iso/definition.mjs.map +1 -1
  131. package/_mjs/optics/Lens/api.mjs +46 -22
  132. package/_mjs/optics/Lens/api.mjs.map +1 -1
  133. package/_mjs/optics/Lens/definition.mjs +1 -1
  134. package/_mjs/optics/Lens/definition.mjs.map +1 -1
  135. package/_mjs/optics/Optional/api/focus.mjs +15 -0
  136. package/_mjs/optics/Optional/api/focus.mjs.map +1 -0
  137. package/_mjs/optics/Optional/api.mjs +8 -0
  138. package/_mjs/optics/Optional/api.mjs.map +1 -0
  139. package/_mjs/optics/Optional/definition.mjs +4 -1
  140. package/_mjs/optics/Optional/definition.mjs.map +1 -1
  141. package/_mjs/optics/Optional.mjs +2 -0
  142. package/_mjs/optics/Optional.mjs.map +1 -1
  143. package/_mjs/optics/Prism/api/focus.mjs +13 -0
  144. package/_mjs/optics/Prism/api/focus.mjs.map +1 -0
  145. package/_mjs/optics/Prism/definition.mjs +4 -1
  146. package/_mjs/optics/Prism/definition.mjs.map +1 -1
  147. package/_mjs/optics/Prism.mjs +1 -0
  148. package/_mjs/optics/Prism.mjs.map +1 -1
  149. package/_mjs/optics/Setter/api/focus.mjs +12 -0
  150. package/_mjs/optics/Setter/api/focus.mjs.map +1 -0
  151. package/_mjs/optics/Setter/definition.mjs.map +1 -1
  152. package/_mjs/optics/Traversal/api/focus.mjs +15 -0
  153. package/_mjs/optics/Traversal/api/focus.mjs.map +1 -0
  154. package/_mjs/optics/Traversal/definition.mjs.map +1 -1
  155. package/_mjs/optics/Traversal.mjs +1 -0
  156. package/_mjs/optics/Traversal.mjs.map +1 -1
  157. package/_mjs/typeclass/MonadExcept.mjs +4 -1
  158. package/_mjs/typeclass/MonadExcept.mjs.map +1 -1
  159. package/_src/collection/compat/Array/api.ts +51 -0
  160. package/_src/collection/immutable/Conc/api.ts +4 -4
  161. package/_src/collection/immutable/Dictionary/api.ts +40 -0
  162. package/_src/collection/immutable/HashMap/api.ts +4 -4
  163. package/_src/collection/immutable/HashSet/api.ts +4 -4
  164. package/_src/collection/immutable/ImmutableArray/api.ts +4 -4
  165. package/_src/collection/internal.ts +0 -0
  166. package/_src/collection/mutable/ArrayDeque.ts +231 -0
  167. package/_src/collection/mutable/Queue.ts +14 -0
  168. package/_src/collection/mutable.ts +2 -0
  169. package/_src/control/InterruptiblePromise.ts +23 -0
  170. package/_src/control/Pure/api.ts +7 -4
  171. package/_src/data/Cause/api.ts +8 -8
  172. package/_src/data/Datum/api.ts +8 -8
  173. package/_src/data/DatumEither/api.ts +8 -8
  174. package/_src/data/Either/api.ts +18 -18
  175. package/_src/data/Either/destructors.ts +3 -3
  176. package/_src/data/Either/instances.ts +12 -12
  177. package/_src/data/EitherT/api.ts +8 -8
  178. package/_src/data/Exit/constructors.ts +1 -1
  179. package/_src/data/Global.ts +17 -0
  180. package/_src/data/Maybe/api.ts +4 -4
  181. package/_src/data.ts +1 -0
  182. package/_src/optics/Fold/api/focus.ts +12 -0
  183. package/_src/optics/Fold/definition.ts +9 -0
  184. package/_src/optics/Getter/definition.ts +9 -1
  185. package/_src/optics/Index/api.ts +15 -1
  186. package/_src/optics/Iso/api.ts +16 -0
  187. package/_src/optics/Iso/definition.ts +6 -1
  188. package/_src/optics/Lens/api.ts +36 -8
  189. package/_src/optics/Lens/definition.ts +4 -1
  190. package/_src/optics/Optional/api/focus.ts +16 -0
  191. package/_src/optics/Optional/api.ts +10 -0
  192. package/_src/optics/Optional/definition.ts +23 -4
  193. package/_src/optics/Optional.ts +2 -0
  194. package/_src/optics/Prism/api/focus.ts +14 -0
  195. package/_src/optics/Prism/definition.ts +6 -2
  196. package/_src/optics/Prism.ts +1 -0
  197. package/_src/optics/Setter/api/focus.ts +13 -0
  198. package/_src/optics/Setter/definition.ts +13 -0
  199. package/_src/optics/Traversal/api/focus.ts +16 -0
  200. package/_src/optics/Traversal/definition.ts +10 -0
  201. package/_src/optics/Traversal.ts +1 -0
  202. package/_src/typeclass/MonadExcept.ts +1 -1
  203. package/collection/compat/Array/api.d.ts +19 -0
  204. package/collection/immutable/Dictionary/api.d.ts +21 -0
  205. package/collection/internal.d.ts +1 -0
  206. package/collection/mutable/ArrayDeque.d.ts +41 -0
  207. package/collection/mutable/Queue.d.ts +9 -0
  208. package/collection/mutable.d.ts +2 -0
  209. package/control/InterruptiblePromise.d.ts +12 -0
  210. package/data/Either/destructors.d.ts +4 -1
  211. package/data/Global.d.ts +4 -0
  212. package/data.d.ts +1 -0
  213. package/optics/Fold/api/focus.d.ts +6 -0
  214. package/optics/Fold/definition.d.ts +6 -0
  215. package/optics/Getter/definition.d.ts +7 -1
  216. package/optics/Index/api.d.ts +5 -0
  217. package/optics/Iso/api.d.ts +6 -0
  218. package/optics/Iso/definition.d.ts +4 -1
  219. package/optics/Lens/api.d.ts +11 -0
  220. package/optics/Lens/definition.d.ts +4 -1
  221. package/optics/Optional/api/focus.d.ts +6 -0
  222. package/optics/Optional/api.d.ts +6 -0
  223. package/optics/Optional/definition.d.ts +15 -0
  224. package/optics/Optional.d.ts +2 -0
  225. package/optics/Prism/api/focus.d.ts +6 -0
  226. package/optics/Prism/definition.d.ts +4 -1
  227. package/optics/Prism.d.ts +1 -0
  228. package/optics/Setter/api/focus.d.ts +6 -0
  229. package/optics/Setter/definition.d.ts +10 -0
  230. package/optics/Traversal/api/focus.d.ts +6 -0
  231. package/optics/Traversal/definition.d.ts +5 -0
  232. package/optics/Traversal.d.ts +1 -0
  233. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"MonadExcept.mjs","names":["MonadExcept","absolve","F","flatMap","r","tsplus_module_1","match","fail","pure"],"sources":["../../_src/typeclass/MonadExcept.ts"],"sourcesContent":[null],"mappings":";AAaA,OAAO,MAAMA,WAAW,GAAmB,EAAE;AAU7C,OAAM,SAAUC,OAAOA,CACrBC,CAAwB;EAExB,OAAOA,CAAC,CAACC,OAAO,CAAEC,CAAC,IAAKC,eAAA,CAAAC,KAAA,CAAQJ,CAAC,CAACK,IAAI,EAAEL,CAAC,CAACM,IAAI,EAAtBJ,CAAC,CAAsB,CAAC;AAClD"}
1
+ {"version":3,"file":"MonadExcept.mjs","names":["MonadExcept","absolve","F","flatMap","r","tsplus_module_1","match","Left","fail","Right","pure"],"sources":["../../_src/typeclass/MonadExcept.ts"],"sourcesContent":[null],"mappings":";AAaA,OAAO,MAAMA,WAAW,GAAmB,EAAE;AAU7C,OAAM,SAAUC,OAAOA,CACrBC,CAAwB;EAExB,OAAOA,CAAC,CAACC,OAAO,CAAEC,CAAC,IAAKC,eAAA,CAAAC,KAAA,CAAQ;IAAEC,IAAI,EAAEL,CAAC,CAACM,IAAI;IAAEC,KAAK,EAAEP,CAAC,CAACQ;EAAI,CAAE,EAAvCN,CAAC,CAAuC,CAAC;AACnE"}
@@ -1,4 +1,5 @@
1
1
  import type { Eq } from "@fncts/base/typeclass";
2
+
2
3
  /**
3
4
  * @tsplus getter fncts.Array elem
4
5
  * @tsplus getter fncts.ReadonlyArray elem
@@ -15,6 +16,41 @@ export function elem<A>(self: ReadonlyArray<A>) {
15
16
  };
16
17
  }
17
18
 
19
+ /**
20
+ * @tsplus pipeable fncts.Array filterMap
21
+ * @tsplus pipeable fncts.ReadonlyArray filterMap
22
+ */
23
+ export function filterMap<A, B>(f: (a: A) => Maybe<B>) {
24
+ return (self: ReadonlyArray<A>): ReadonlyArray<B> => {
25
+ const out: Array<B> = [];
26
+ for (let i = 0; i < self.length; i++) {
27
+ const v = f(self[i]!);
28
+ Maybe.concrete(v);
29
+ if (v._tag === MaybeTag.Just) {
30
+ out.push(v.value);
31
+ }
32
+ }
33
+ return out;
34
+ };
35
+ }
36
+
37
+ /**
38
+ * @tsplus pipeable fncts.Array filterMap
39
+ * @tsplus pipeable fncts.ReadonlyArray filterMap
40
+ */
41
+ export function filterMapUndefined<A, B>(f: (a: A) => B | undefined) {
42
+ return (self: ReadonlyArray<A>): ReadonlyArray<B> => {
43
+ const out: Array<B> = [];
44
+ for (let i = 0; i < self.length; i++) {
45
+ const v = f(self[i]!);
46
+ if (v !== undefined) {
47
+ out.push(v);
48
+ }
49
+ }
50
+ return out;
51
+ };
52
+ }
53
+
18
54
  /**
19
55
  * @tsplus fluent fncts.Array isEmpty
20
56
  * @tsplus fluent fncts.ReadonlyArray isEmpty
@@ -54,3 +90,18 @@ export function foldLeftWithIndex<A, B>(b: B, f: (i: number, b: B, a: A) => B) {
54
90
  return out;
55
91
  };
56
92
  }
93
+
94
+ /**
95
+ * @tsplus pipeable fncts.Array updateAt
96
+ * @tsplus pipeable fncts.ReadonlyArray updateAt
97
+ */
98
+ export function updateAt<A>(i: number, a: A) {
99
+ return (self: ReadonlyArray<A>): ReadonlyArray<A> => {
100
+ if (i in self) {
101
+ const copy = self.slice();
102
+ copy[i] = a;
103
+ return copy;
104
+ }
105
+ return self;
106
+ };
107
+ }
@@ -864,10 +864,10 @@ export function partitionMapWithIndex<A, B, C>(f: (i: number, a: A) => Either<B,
864
864
  const array = result.value;
865
865
  for (let j = 0; j < array.length; j++) {
866
866
  const eab = f(i, array[j]!);
867
- eab.match(
868
- (b) => left.append(b),
869
- (c) => right.append(c),
870
- );
867
+ eab.match({
868
+ Left: (b) => left.append(b),
869
+ Right: (c) => right.append(c),
870
+ });
871
871
  i++;
872
872
  }
873
873
  }
@@ -32,6 +32,38 @@ export function get(key: string) {
32
32
  };
33
33
  }
34
34
 
35
+ /**
36
+ * @tsplus pipeable fncts.Dictionary set
37
+ */
38
+ export function set<A>(key: string, value: A) {
39
+ return (self: Dictionary<A>): Dictionary<A> => {
40
+ return Dictionary({ ...self.toRecord, [key]: value });
41
+ };
42
+ }
43
+
44
+ /**
45
+ * @tsplus pipeable fncts.Dictionary remove
46
+ */
47
+ export function remove(key: string) {
48
+ return <A>(self: Dictionary<A>): Dictionary<A> => {
49
+ const out = { ...self.toRecord };
50
+ delete out[key];
51
+ return Dictionary(out);
52
+ };
53
+ }
54
+
55
+ /**
56
+ * @tsplus pipeable fncts.Dictionary update
57
+ */
58
+ export function update<A>(key: string, f: (a: Maybe<A>) => Maybe<A>) {
59
+ return (self: Dictionary<A>): Dictionary<A> => {
60
+ return f(self.get(key)).match(
61
+ () => self.remove(key),
62
+ (a) => self.set(key, a),
63
+ );
64
+ };
65
+ }
66
+
35
67
  /**
36
68
  * @tsplus getter fncts.Dictionary keys
37
69
  */
@@ -64,6 +96,14 @@ export function mapWithIndex<A, B>(f: (k: string, a: A) => B) {
64
96
  };
65
97
  }
66
98
 
99
+ /**
100
+ * @tsplus static fncts.DictionaryOps __call
101
+ * @tsplus macro identity
102
+ */
103
+ export function fromRecord<A>(self: Record<string, A>): Dictionary<A> {
104
+ return Dictionary.get(self);
105
+ }
106
+
67
107
  /**
68
108
  * @tsplus getter fncts.Dictionary toRecord
69
109
  * @tsplus macro identity
@@ -476,14 +476,14 @@ export function partitionMapWithIndex<K, V, A, B>(f: (i: K, a: V) => Either<A, B
476
476
  const left = makeWith<K, A>(self.config).beginMutation;
477
477
  const right = makeWith<K, B>(self.config).beginMutation;
478
478
  self.forEachWithIndex((k, v) => {
479
- f(k, v).match(
480
- (a) => {
479
+ f(k, v).match({
480
+ Left: (a) => {
481
481
  left.set(k, a);
482
482
  },
483
- (b) => {
483
+ Right: (b) => {
484
484
  right.set(k, b);
485
485
  },
486
- );
486
+ });
487
487
  });
488
488
  return [left.endMutation, right.endMutation];
489
489
  };
@@ -300,14 +300,14 @@ export function partitionMapWith<B, C>(
300
300
  const right = beginMutation(emptyWith(C));
301
301
  const left = beginMutation(emptyWith(B));
302
302
  fa.forEach((v) => {
303
- f(v).match(
304
- (b) => {
303
+ f(v).match({
304
+ Left: (b) => {
305
305
  left.add(b);
306
306
  },
307
- (c) => {
307
+ Right: (c) => {
308
308
  right.add(c);
309
309
  },
310
- );
310
+ });
311
311
  });
312
312
  return [endMutation(left), endMutation(right)];
313
313
  };
@@ -1430,16 +1430,16 @@ export function _wiltWithIndex<A>(self: ImmutableArray<A>) {
1430
1430
  .foldLeftWithIndex(G.pure([[] as Array<B>, [] as Array<B2>] as const), (i, fbs, a) =>
1431
1431
  f(i, a).pipe(
1432
1432
  G.zipWith(fbs, (eb, r) =>
1433
- eb.match(
1434
- (b1) => {
1433
+ eb.match({
1434
+ Left: (b1) => {
1435
1435
  r[0].push(b1);
1436
1436
  return r;
1437
1437
  },
1438
- (b2) => {
1438
+ Right: (b2) => {
1439
1439
  r[1].push(b2);
1440
1440
  return r;
1441
1441
  },
1442
- ),
1442
+ }),
1443
1443
  ),
1444
1444
  ),
1445
1445
  )
File without changes
@@ -0,0 +1,231 @@
1
+ const STABLE_SIZE = 128;
2
+ const DEFAULT_INITIAL_SIZE = 16;
3
+
4
+ /**
5
+ * @tsplus type fncts.MutableArrayDeque
6
+ * @tsplus companion fncts.MutableArrayDeque
7
+ */
8
+ export class ArrayDeque<A> {
9
+ constructor(protected array: Array<A>, private start: number, private end: number) {}
10
+
11
+ static empty<A>(initialSize = DEFAULT_INITIAL_SIZE): ArrayDeque<A> {
12
+ return new ArrayDeque(new Array(initialSize), 0, 0);
13
+ }
14
+
15
+ protected requireBounds(idx: number, until: number = this.length) {
16
+ if (idx < 0 || idx > until) throw new IndexOutOfBoundsError(`${idx} is out of bounds (min 0, max ${until - 1})`);
17
+ }
18
+
19
+ get(idx: number): A {
20
+ this.requireBounds(idx);
21
+ return this._get(idx);
22
+ }
23
+
24
+ update(idx: number, elem: A): void {
25
+ this.requireBounds(idx);
26
+ this._set(idx, elem);
27
+ }
28
+
29
+ addOne(elem: A): this {
30
+ this.ensureSize(this.length + 1);
31
+ return this.appendAssumingCapacity(elem);
32
+ }
33
+
34
+ prepend(elem: A): this {
35
+ this.ensureSize(this.length + 1);
36
+ return this.prependAssumingCapacity(elem);
37
+ }
38
+
39
+ insert(idx: number, elem: A): void {
40
+ this.requireBounds(idx, this.length + 1);
41
+ const n = this.length;
42
+ if (idx === 0) {
43
+ this.prepend(elem);
44
+ } else if (idx === n) {
45
+ this.addOne(elem);
46
+ } else {
47
+ const finalLength = n + 1;
48
+ if (this.mustGrow(finalLength)) {
49
+ const array2 = new Array(finalLength);
50
+ this.copySliceToArray(0, array2, 0, idx);
51
+ array2[idx] = elem;
52
+ this.copySliceToArray(idx, array2, idx + 1, n);
53
+ this.reset(array2, 0, finalLength);
54
+ } else if (n <= idx * 2) {
55
+ let i = n - 1;
56
+ for (; i >= idx; i--) {
57
+ this._set(i + 1, this._get(i));
58
+ }
59
+ this.end = this.end_plus(1);
60
+ i += 1;
61
+ this._set(i, elem);
62
+ } else {
63
+ let i = 0;
64
+ for (; i < idx; i++) {
65
+ this._set(i - 1, this._get(1));
66
+ }
67
+ this.start = this.start_minus(1);
68
+ this._set(i, elem);
69
+ }
70
+ }
71
+ }
72
+
73
+ remove(idx: number, count: number): void {
74
+ if (count > 0) {
75
+ this.requireBounds(idx);
76
+ const n = this.length;
77
+ const removals = Math.min(n - idx, count);
78
+ const finalLength = n - removals;
79
+ const suffixStart = idx + removals;
80
+ if (this.shouldShrink(finalLength)) {
81
+ const array2 = new Array(finalLength);
82
+ this.copySliceToArray(0, array2, 0, idx);
83
+ this.copySliceToArray(suffixStart, array2, idx, n);
84
+ this.reset(array2, 0, finalLength);
85
+ } else if (2 * idx <= finalLength) {
86
+ let i = suffixStart - 1;
87
+ for (; i >= removals; i--) {
88
+ this._set(i, this._get(i - removals));
89
+ }
90
+ for (; i >= 0; i--) {
91
+ this._set(i, null!);
92
+ }
93
+ this.start = this.start_plus(removals);
94
+ } else {
95
+ let i = idx;
96
+ for (; i < finalLength; i++) {
97
+ this._set(i, this._get(i + removals));
98
+ }
99
+ for (; i < n; i++) {
100
+ this._set(i, null!);
101
+ }
102
+ this.end = this.end_minus(removals);
103
+ }
104
+ } else if (count < 0) {
105
+ throw new Error(`Removing negative number of elements ${count}`);
106
+ }
107
+ }
108
+
109
+ removeHead(resizeInternalRepr = false): A {
110
+ if (this.isEmpty) throw new NoSuchElementError("empty collection");
111
+ else return this.removeHeadAssumingNonEmpty(resizeInternalRepr);
112
+ }
113
+
114
+ removeHeadOption(resizeInternalRepr = false): Maybe<A> {
115
+ if (this.isEmpty) return Nothing();
116
+ else return Just(this.removeHeadAssumingNonEmpty(resizeInternalRepr));
117
+ }
118
+
119
+ removeLastOption(resizeInternalRepr = false): Maybe<A> {
120
+ if (this.isEmpty) return Nothing();
121
+ else return Just(this.removeLastAssumingNonEmpty(resizeInternalRepr));
122
+ }
123
+
124
+ get isEmpty(): boolean {
125
+ return this.length === 0;
126
+ }
127
+
128
+ private removeHeadAssumingNonEmpty(resizeInternalRepr = false): A {
129
+ const elem = this.array[this.start];
130
+ this.array[this.start] = null!;
131
+ this.start = this.start_plus(1);
132
+ if (resizeInternalRepr) this.resize(this.length);
133
+ return elem!;
134
+ }
135
+
136
+ private removeLastAssumingNonEmpty(resizeInternalRepr = false): A {
137
+ this.end = this.end_minus(1);
138
+ const elem = this.array[this.end];
139
+ this.array[this.end] = null!;
140
+ if (resizeInternalRepr) this.resize(this.length);
141
+ return elem!;
142
+ }
143
+
144
+ protected prependAssumingCapacity(elem: A): this {
145
+ this.start = this.start_minus(1);
146
+ this.array[this.start] = elem;
147
+ return this;
148
+ }
149
+
150
+ protected appendAssumingCapacity(elem: A): this {
151
+ this.array[this.end] = elem;
152
+ this.end = this.end_plus(1);
153
+ return this;
154
+ }
155
+
156
+ private ensureSize(hint: number) {
157
+ if (hint > this.length && this.mustGrow(hint)) {
158
+ this.resize(hint);
159
+ }
160
+ }
161
+
162
+ private resize(len: number) {
163
+ const n = this.length;
164
+ const array2 = this.copySliceToArray(0, new Array(len), 0, n);
165
+ this.reset(array2, 0, n);
166
+ }
167
+
168
+ private reset(array: Array<A>, start: number, end: number) {
169
+ this.requireBounds(start, array.length);
170
+ this.requireBounds(end, array.length);
171
+ this.array = array;
172
+ this.start = start;
173
+ this.end = end;
174
+ }
175
+
176
+ private mustGrow(len: number) {
177
+ return len >= this.array.length;
178
+ }
179
+
180
+ protected start_plus(idx: number) {
181
+ return (this.start + idx) & (this.array.length - 1);
182
+ }
183
+
184
+ private start_minus(idx: number) {
185
+ return (this.start - idx) & (this.array.length - 1);
186
+ }
187
+
188
+ private end_plus(idx: number) {
189
+ return (this.end + idx) & (this.array.length - 1);
190
+ }
191
+
192
+ private end_minus(idx: number) {
193
+ return (this.end - idx) & (this.array.length - 1);
194
+ }
195
+
196
+ private _get(idx: number): A {
197
+ return this.array[this.start_plus(idx)]!;
198
+ }
199
+
200
+ private _set(idx: number, a: A): void {
201
+ this.array[this.start_plus(idx)] = a;
202
+ }
203
+
204
+ get length() {
205
+ return this.end_minus(this.start);
206
+ }
207
+
208
+ copySliceToArray(srcStart: number, dest: Array<A>, destStart: number, maxItems: number): Array<A> {
209
+ this.requireBounds(destStart, dest.length + 1);
210
+ const toCopy = Math.min(maxItems, Math.min(this.length - srcStart, dest.length - destStart));
211
+ if (toCopy > 0) {
212
+ this.requireBounds(srcStart);
213
+ const startIdx = this.start_plus(srcStart);
214
+ const block1 = Math.min(toCopy, this.array.length - startIdx);
215
+ copyArray(this.array, startIdx, dest, destStart, block1);
216
+ const block2 = toCopy - block1;
217
+ if (block2 > 0) copyArray(this.array, 0, dest, destStart + block1, block2);
218
+ }
219
+ return dest;
220
+ }
221
+
222
+ private shouldShrink(len: number) {
223
+ return this.array.length > STABLE_SIZE && this.array.length - len - (len >> 1) > len;
224
+ }
225
+ }
226
+
227
+ function copyArray<A>(src: Array<A>, srcPos: number, dest: Array<A>, destPos: number, length: number): void {
228
+ for (let i = srcPos, j = 0; j < length; i++, j++) {
229
+ dest[destPos + j] = src[i]!;
230
+ }
231
+ }
@@ -0,0 +1,14 @@
1
+ import { ArrayDeque } from "@fncts/base/collection/mutable/ArrayDeque";
2
+
3
+ /**
4
+ * @tsplus type fncts.MutableQueue
5
+ * @tsplus companion fncts.MutableQueue
6
+ */
7
+ export class Queue<A> extends ArrayDeque<A> {
8
+ enqueue(elem: A): this {
9
+ return this.addOne(elem);
10
+ }
11
+ dequeue(): A {
12
+ return this.removeHead();
13
+ }
14
+ }
@@ -1,6 +1,8 @@
1
1
  // codegen:start { preset: type-barrel, include: ./mutable/*.ts }
2
+ export type {} from "./mutable/ArrayDeque.js";
2
3
  export type {} from "./mutable/HashMap.js";
3
4
  export type {} from "./mutable/HashSet.js";
4
5
  export type {} from "./mutable/internal.js";
5
6
  export type {} from "./mutable/ListBuffer.js";
7
+ export type {} from "./mutable/Queue.js";
6
8
  // codegen:end
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @tsplus type fncts.InterruptiblePromise
3
+ * @tsplus companion fncts.InterruptiblePromiseOps
4
+ */
5
+ export interface InterruptiblePromise<A> extends Promise<A> {
6
+ interrupt: () => void;
7
+ }
8
+
9
+ /**
10
+ * @tsplus static fncts.InterruptiblePromiseOps __call
11
+ */
12
+ export function make<A>(
13
+ executor: (resolve: (value: A | PromiseLike<A>) => void, reject: (reason?: unknown) => void) => (() => void) | void,
14
+ ): InterruptiblePromise<A> {
15
+ const promise: InterruptiblePromise<A> = new Promise((resolve, reject) => {
16
+ const canceller = executor(resolve, reject);
17
+ promise.interrupt = () => {
18
+ canceller?.();
19
+ reject(new InterruptedException());
20
+ };
21
+ }) as InterruptiblePromise<A>;
22
+ return promise;
23
+ }
@@ -8,7 +8,7 @@ import { identity, tuple } from "../../data/function.js";
8
8
  export function absolve<W, S1, S2, R, E, E1, A>(
9
9
  fa: Pure<W, S1, S2, R, E, Either<E1, A>>,
10
10
  ): Pure<W, S1, S2, R, E | E1, A> {
11
- return fa.flatMap((ea) => ea.match(Pure.failNow, Pure.succeedNow));
11
+ return fa.flatMap((ea) => ea.match({ Left: Pure.failNow, Right: Pure.succeedNow }));
12
12
  }
13
13
 
14
14
  /**
@@ -350,7 +350,10 @@ export function matchPure<S5, S2, E, A, W1, S3, R1, E1, B, W2, S4, R2, E2, C>(
350
350
  onSuccess: (a: A) => Pure<W2, S2, S4, R2, E2, C>,
351
351
  ) {
352
352
  return <W, S1, R>(fa: Pure<W, S1, S2, R, E, A>): Pure<W | W1 | W2, S1 & S5, S3 | S4, R | R1 | R2, E1 | E2, B | C> => {
353
- return fa.matchCausePure((cause) => cause.failureOrCause.match(onFailure, Pure.failCauseNow), onSuccess);
353
+ return fa.matchCausePure(
354
+ (cause) => cause.failureOrCause.match({ Left: onFailure, Right: Pure.failCauseNow }),
355
+ onSuccess,
356
+ );
354
357
  };
355
358
  }
356
359
 
@@ -378,7 +381,7 @@ export function matchLogPure<W, S5, S2, E, A, W1, S3, R1, E1, B, W2, S4, R2, E2,
378
381
  ) {
379
382
  return <S1, R>(fa: Pure<W, S1, S2, R, E, A>): Pure<W | W1 | W2, S1 & S5, S3 | S4, R | R1 | R2, E1 | E2, B | C> => {
380
383
  return fa.matchLogCausePure(
381
- (ws, cause) => cause.failureOrCause.match((e) => onFailure(ws, e), Pure.failCauseNow),
384
+ (ws, cause) => cause.failureOrCause.match({ Left: (e) => onFailure(ws, e), Right: Pure.failCauseNow }),
382
385
  onSuccess,
383
386
  );
384
387
  };
@@ -428,7 +431,7 @@ export function modifyEither<S1, S2, E, A>(
428
431
  ): Pure<never, S1, S2, never, E, A> {
429
432
  return Pure.get<S1>()
430
433
  .map(f)
431
- .flatMap((r) => r.match(Pure.failNow, ([a, s2]) => Pure.succeedNow(a).mapState(() => s2)));
434
+ .flatMap((r) => r.match({ Left: Pure.failNow, Right: ([a, s2]) => Pure.succeedNow(a).mapState(() => s2) }));
432
435
  }
433
436
 
434
437
  /**
@@ -333,10 +333,10 @@ export function flipCauseEither<E, A>(self: Cause<Either<E, A>>): Either<Cause<E
333
333
  result = Either.left(c);
334
334
  break pushing;
335
335
  case CauseTag.Fail:
336
- result = c.value.match(
337
- (l) => Either.left(Cause.fail(l, Trace.none)),
338
- (r) => Either.right(r),
339
- );
336
+ result = c.value.match({
337
+ Left: (l) => Either.left(Cause.fail(l, Trace.none)),
338
+ Right: (r) => Either.right(r),
339
+ });
340
340
  break pushing;
341
341
  case CauseTag.Sequential:
342
342
  stack.push(new FCEStackFrameThenLeft(c));
@@ -886,10 +886,10 @@ function sequenceCauseEitherEval<E, A>(self: Cause<Either<E, A>>): Eval<Either<C
886
886
  }
887
887
  case CauseTag.Fail: {
888
888
  return Eval.now(
889
- self.value.match(
890
- (e) => Either.left(Cause.fail(e, Trace.none)),
891
- (a) => Either.right(a),
892
- ),
889
+ self.value.match({
890
+ Left: (e) => Either.left(Cause.fail(e, Trace.none)),
891
+ Right: (a) => Either.right(a),
892
+ }),
893
893
  );
894
894
  }
895
895
  case CauseTag.Halt: {
@@ -336,15 +336,15 @@ export function partitionMap<A, B, C>(f: (a: A) => Either<B, C>) {
336
336
  Initial: () => [Initial(), Initial()],
337
337
  Pending: () => [Pending(), Pending()],
338
338
  Refresh: (a) =>
339
- f(a).match(
340
- (b) => [Refresh(b), Initial()],
341
- (c) => [Initial(), Refresh(c)],
342
- ),
339
+ f(a).match({
340
+ Left: (b) => [Refresh(b), Initial()],
341
+ Right: (c) => [Initial(), Refresh(c)],
342
+ }),
343
343
  Replete: (a) =>
344
- f(a).match(
345
- (b) => [Replete(b), Initial()],
346
- (c) => [Initial(), Replete(c)],
347
- ),
344
+ f(a).match({
345
+ Left: (b) => [Replete(b), Initial()],
346
+ Right: (c) => [Initial(), Replete(c)],
347
+ }),
348
348
  });
349
349
  };
350
350
  }
@@ -303,16 +303,16 @@ export function partitionMap<A, B, C>(f: (a: A) => Either<B, C>) {
303
303
  Pending: () => [self.unsafeCoerce(), self.unsafeCoerce()],
304
304
  RefreshLeft: () => [self.unsafeCoerce(), self.unsafeCoerce()],
305
305
  RefreshRight: (a) =>
306
- f(a).match(
307
- (b) => [DatumEither.refreshRight(b), DatumEither.initial()],
308
- (c) => [DatumEither.initial(), DatumEither.refreshRight(c)],
309
- ),
306
+ f(a).match({
307
+ Left: (b) => [DatumEither.refreshRight(b), DatumEither.initial()],
308
+ Right: (c) => [DatumEither.initial(), DatumEither.refreshRight(c)],
309
+ }),
310
310
  RepleteLeft: () => [self.unsafeCoerce(), self.unsafeCoerce()],
311
311
  RepleteRight: (a) =>
312
- f(a).match(
313
- (b) => [DatumEither.repleteRight(b), DatumEither.initial()],
314
- (c) => [DatumEither.initial(), DatumEither.repleteRight(c)],
315
- ),
312
+ f(a).match({
313
+ Left: (b) => [DatumEither.repleteRight(b), DatumEither.initial()],
314
+ Right: (c) => [DatumEither.initial(), DatumEither.repleteRight(c)],
315
+ }),
316
316
  });
317
317
  };
318
318
  }
@@ -97,20 +97,20 @@ export function foldMap<A, M>(f: (a: A) => M, /** @tsplus auto */ M: P.Monoid<M>
97
97
  * @tsplus getter fncts.Either getLeft
98
98
  */
99
99
  export function getLeft<E, A>(self: Either<E, A>): Maybe<E> {
100
- return self.match(
101
- (e) => Just(e),
102
- (_a) => Nothing(),
103
- );
100
+ return self.match({
101
+ Left: (e) => Just(e),
102
+ Right: (_a) => Nothing(),
103
+ });
104
104
  }
105
105
 
106
106
  /**
107
107
  * @tsplus getter fncts.Either getRight
108
108
  */
109
109
  export function getRight<E, A>(self: Either<E, A>): Maybe<A> {
110
- return self.match(
111
- (_e) => Nothing(),
112
- (a) => Just(a),
113
- );
110
+ return self.match({
111
+ Left: (_e) => Nothing(),
112
+ Right: (a) => Just(a),
113
+ });
114
114
  }
115
115
 
116
116
  /**
@@ -118,7 +118,7 @@ export function getRight<E, A>(self: Either<E, A>): Maybe<A> {
118
118
  */
119
119
  export function getOrElse<E, B>(orElse: (e: E) => B) {
120
120
  return <A>(self: Either<E, A>): A | B => {
121
- return self.match(orElse, identity);
121
+ return self.match({ Left: orElse, Right: identity });
122
122
  };
123
123
  }
124
124
 
@@ -172,7 +172,7 @@ export function mapLeft<E1, E2>(f: (e: E1) => E2) {
172
172
  * @tsplus getter fncts.Either value
173
173
  */
174
174
  export function merge<E, A>(self: Either<E, A>): E | A {
175
- return self.match(identity, identity);
175
+ return self.match({ Left: identity, Right: identity });
176
176
  }
177
177
 
178
178
  /**
@@ -201,10 +201,10 @@ export function _traverse<E, A>(self: Either<E, A>) {
201
201
  <K, Q, W, X, I, S, R, E1, B>(
202
202
  f: (a: A) => HKT.Kind<G, GC, K, Q, W, X, I, S, R, E1, B>,
203
203
  ): HKT.Kind<G, GC, K, Q, W, X, I, S, R, E1, Either<E, B>> =>
204
- self.match(
205
- (e) => G.pure(Left(e)),
206
- (a) => f(a).pipe(G.map((b) => Right(b))),
207
- );
204
+ self.match({
205
+ Left: (e) => G.pure(Left(e)),
206
+ Right: (a) => f(a).pipe(G.map((b) => Right(b))),
207
+ });
208
208
  }
209
209
 
210
210
  export const traverse_: P.Traversable<EitherF>["traverse"] = (A) => (f) => (self) => self.traverse(A)(f);
@@ -288,10 +288,10 @@ export function partition<E, A>(p: Predicate<A>, /** @tsplus auto */ M: P.Monoid
288
288
  * @tsplus getter fncts.Either toMaybe
289
289
  */
290
290
  export function toMaybe<E, A>(self: Either<E, A>): Maybe<A> {
291
- return self.match(
292
- () => Nothing(),
293
- (a) => Just(a),
294
- );
291
+ return self.match({
292
+ Left: () => Nothing(),
293
+ Right: (a) => Just(a),
294
+ });
295
295
  }
296
296
 
297
297
  // codegen:start { preset: barrel, include: api/*.ts }