@fncts/base 0.0.31 → 0.0.32

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 (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 }