@fncts/io 0.0.49 → 0.0.50

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 (226) hide show
  1. package/IO/api/foreachExec.d.ts +18 -0
  2. package/Push/Bounds.d.ts +4 -0
  3. package/Push/FlattenStrategy.d.ts +47 -0
  4. package/Push/IndexedBuffer.d.ts +19 -0
  5. package/Push/MergeStrategy.d.ts +19 -0
  6. package/Push/Operator/IOLoopOperator.d.ts +61 -0
  7. package/Push/Operator/IOOperator.d.ts +63 -0
  8. package/Push/Operator/LoopOperator.d.ts +50 -0
  9. package/Push/Operator/SyncOperator.d.ts +41 -0
  10. package/Push/Operator.d.ts +4 -0
  11. package/Push/Producer/IOProducer.d.ts +41 -0
  12. package/Push/Producer/SyncProducer.d.ts +61 -0
  13. package/Push/Producer.d.ts +1 -0
  14. package/Push/Sink.d.ts +65 -0
  15. package/Push/api.d.ts +78 -161
  16. package/Push/definition.d.ts +92 -19
  17. package/Push/internal.d.ts +3 -0
  18. package/Push.d.ts +6 -0
  19. package/Ref/Synchronized/definition.d.ts +32 -9
  20. package/Ref/definition.d.ts +12 -0
  21. package/Scope/api.d.ts +16 -1
  22. package/Sink/definition.d.ts +5 -6
  23. package/Subject/Atomic.d.ts +19 -9
  24. package/Subject/DeferredRef.d.ts +17 -0
  25. package/Subject/Hold.d.ts +19 -0
  26. package/Subject/RefSubject/Atomic.d.ts +41 -0
  27. package/Subject/RefSubject/Derived.d.ts +43 -0
  28. package/Subject/RefSubject/RefSubject.d.ts +27 -0
  29. package/Subject/definition.d.ts +14 -2
  30. package/Subject.d.ts +2 -0
  31. package/SubscriptionRef.d.ts +0 -1
  32. package/_cjs/IO/api/foreachExec.cjs +29 -4
  33. package/_cjs/IO/api/foreachExec.cjs.map +1 -1
  34. package/_cjs/Push/Bounds.cjs +2 -0
  35. package/_cjs/Push/Bounds.cjs.map +1 -0
  36. package/_cjs/Push/FlattenStrategy.cjs +95 -0
  37. package/_cjs/Push/FlattenStrategy.cjs.map +1 -0
  38. package/_cjs/Push/IndexedBuffer.cjs +70 -0
  39. package/_cjs/Push/IndexedBuffer.cjs.map +1 -0
  40. package/_cjs/Push/MergeStrategy.cjs +45 -0
  41. package/_cjs/Push/MergeStrategy.cjs.map +1 -0
  42. package/_cjs/Push/Operator/IOLoopOperator.cjs +225 -0
  43. package/_cjs/Push/Operator/IOLoopOperator.cjs.map +1 -0
  44. package/_cjs/Push/Operator/IOOperator.cjs +104 -0
  45. package/_cjs/Push/Operator/IOOperator.cjs.map +1 -0
  46. package/_cjs/Push/Operator/LoopOperator.cjs +165 -0
  47. package/_cjs/Push/Operator/LoopOperator.cjs.map +1 -0
  48. package/_cjs/Push/Operator/SyncOperator.cjs +78 -0
  49. package/_cjs/Push/Operator/SyncOperator.cjs.map +1 -0
  50. package/_cjs/Push/Operator.cjs +2 -0
  51. package/_cjs/Push/Operator.cjs.map +1 -0
  52. package/_cjs/Push/Producer/IOProducer.cjs +67 -0
  53. package/_cjs/Push/Producer/IOProducer.cjs.map +1 -0
  54. package/_cjs/Push/Producer/SyncProducer.cjs +107 -0
  55. package/_cjs/Push/Producer/SyncProducer.cjs.map +1 -0
  56. package/_cjs/Push/Producer.cjs +2 -0
  57. package/_cjs/Push/Producer.cjs.map +1 -0
  58. package/_cjs/Push/Sink.cjs +219 -0
  59. package/_cjs/Push/Sink.cjs.map +1 -0
  60. package/_cjs/Push/api.cjs +339 -383
  61. package/_cjs/Push/api.cjs.map +1 -1
  62. package/_cjs/Push/definition.cjs +79 -22
  63. package/_cjs/Push/definition.cjs.map +1 -1
  64. package/_cjs/Push/internal.cjs +31 -26
  65. package/_cjs/Push/internal.cjs.map +1 -1
  66. package/_cjs/Push.cjs +66 -0
  67. package/_cjs/Push.cjs.map +1 -1
  68. package/_cjs/Ref/Synchronized/definition.cjs +12 -12
  69. package/_cjs/Ref/Synchronized/definition.cjs.map +1 -1
  70. package/_cjs/Ref/definition.cjs.map +1 -1
  71. package/_cjs/Scope/api.cjs +28 -7
  72. package/_cjs/Scope/api.cjs.map +1 -1
  73. package/_cjs/Sink/definition.cjs +2 -3
  74. package/_cjs/Sink/definition.cjs.map +1 -1
  75. package/_cjs/Stream/definition.cjs.map +1 -1
  76. package/_cjs/Subject/Atomic.cjs +45 -10
  77. package/_cjs/Subject/Atomic.cjs.map +1 -1
  78. package/_cjs/Subject/DeferredRef.cjs +53 -0
  79. package/_cjs/Subject/DeferredRef.cjs.map +1 -0
  80. package/_cjs/Subject/Hold.cjs +41 -0
  81. package/_cjs/Subject/Hold.cjs.map +1 -0
  82. package/_cjs/Subject/RefSubject/Atomic.cjs +130 -0
  83. package/_cjs/Subject/RefSubject/Atomic.cjs.map +1 -0
  84. package/_cjs/Subject/RefSubject/Derived.cjs +98 -0
  85. package/_cjs/Subject/RefSubject/Derived.cjs.map +1 -0
  86. package/_cjs/Subject/RefSubject/RefSubject.cjs +19 -0
  87. package/_cjs/Subject/RefSubject/RefSubject.cjs.map +1 -0
  88. package/_cjs/Subject/definition.cjs +16 -1
  89. package/_cjs/Subject/definition.cjs.map +1 -1
  90. package/_cjs/Subject.cjs +22 -0
  91. package/_cjs/Subject.cjs.map +1 -1
  92. package/_cjs/SubscriptionRef.cjs +0 -1
  93. package/_cjs/SubscriptionRef.cjs.map +1 -1
  94. package/_mjs/IO/api/foreachExec.mjs +27 -4
  95. package/_mjs/IO/api/foreachExec.mjs.map +1 -1
  96. package/_mjs/Push/Bounds.mjs +2 -0
  97. package/_mjs/Push/Bounds.mjs.map +1 -0
  98. package/_mjs/Push/FlattenStrategy.mjs +86 -0
  99. package/_mjs/Push/FlattenStrategy.mjs.map +1 -0
  100. package/_mjs/Push/IndexedBuffer.mjs +61 -0
  101. package/_mjs/Push/IndexedBuffer.mjs.map +1 -0
  102. package/_mjs/Push/MergeStrategy.mjs +34 -0
  103. package/_mjs/Push/MergeStrategy.mjs.map +1 -0
  104. package/_mjs/Push/Operator/IOLoopOperator.mjs +208 -0
  105. package/_mjs/Push/Operator/IOLoopOperator.mjs.map +1 -0
  106. package/_mjs/Push/Operator/IOOperator.mjs +91 -0
  107. package/_mjs/Push/Operator/IOOperator.mjs.map +1 -0
  108. package/_mjs/Push/Operator/LoopOperator.mjs +151 -0
  109. package/_mjs/Push/Operator/LoopOperator.mjs.map +1 -0
  110. package/_mjs/Push/Operator/SyncOperator.mjs +67 -0
  111. package/_mjs/Push/Operator/SyncOperator.mjs.map +1 -0
  112. package/_mjs/Push/Operator.mjs +2 -0
  113. package/_mjs/Push/Operator.mjs.map +1 -0
  114. package/_mjs/Push/Producer/IOProducer.mjs +55 -0
  115. package/_mjs/Push/Producer/IOProducer.mjs.map +1 -0
  116. package/_mjs/Push/Producer/SyncProducer.mjs +90 -0
  117. package/_mjs/Push/Producer/SyncProducer.mjs.map +1 -0
  118. package/_mjs/Push/Producer.mjs +2 -0
  119. package/_mjs/Push/Producer.mjs.map +1 -0
  120. package/_mjs/Push/Sink.mjs +206 -0
  121. package/_mjs/Push/Sink.mjs.map +1 -0
  122. package/_mjs/Push/api.mjs +311 -344
  123. package/_mjs/Push/api.mjs.map +1 -1
  124. package/_mjs/Push/definition.mjs +73 -18
  125. package/_mjs/Push/definition.mjs.map +1 -1
  126. package/_mjs/Push/internal.mjs +30 -26
  127. package/_mjs/Push/internal.mjs.map +1 -1
  128. package/_mjs/Push.mjs +7 -1
  129. package/_mjs/Push.mjs.map +1 -1
  130. package/_mjs/Ref/Synchronized/definition.mjs +12 -12
  131. package/_mjs/Ref/Synchronized/definition.mjs.map +1 -1
  132. package/_mjs/Ref/definition.mjs.map +1 -1
  133. package/_mjs/Scope/api.mjs +22 -4
  134. package/_mjs/Scope/api.mjs.map +1 -1
  135. package/_mjs/Sink/definition.mjs +2 -3
  136. package/_mjs/Sink/definition.mjs.map +1 -1
  137. package/_mjs/Stream/definition.mjs.map +1 -1
  138. package/_mjs/Subject/Atomic.mjs +46 -10
  139. package/_mjs/Subject/Atomic.mjs.map +1 -1
  140. package/_mjs/Subject/DeferredRef.mjs +45 -0
  141. package/_mjs/Subject/DeferredRef.mjs.map +1 -0
  142. package/_mjs/Subject/Hold.mjs +33 -0
  143. package/_mjs/Subject/Hold.mjs.map +1 -0
  144. package/_mjs/Subject/RefSubject/Atomic.mjs +122 -0
  145. package/_mjs/Subject/RefSubject/Atomic.mjs.map +1 -0
  146. package/_mjs/Subject/RefSubject/Derived.mjs +90 -0
  147. package/_mjs/Subject/RefSubject/Derived.mjs.map +1 -0
  148. package/_mjs/Subject/RefSubject/RefSubject.mjs +12 -0
  149. package/_mjs/Subject/RefSubject/RefSubject.mjs.map +1 -0
  150. package/_mjs/Subject/definition.mjs +14 -0
  151. package/_mjs/Subject/definition.mjs.map +1 -1
  152. package/_mjs/Subject.mjs +2 -0
  153. package/_mjs/Subject.mjs.map +1 -1
  154. package/_mjs/SubscriptionRef.mjs +0 -1
  155. package/_mjs/SubscriptionRef.mjs.map +1 -1
  156. package/_src/IO/api/foreachExec.ts +47 -0
  157. package/_src/Push/Bounds.ts +4 -0
  158. package/_src/Push/FlattenStrategy.ts +137 -0
  159. package/_src/Push/IndexedBuffer.ts +79 -0
  160. package/_src/Push/MergeStrategy.ts +59 -0
  161. package/_src/Push/Operator/IOLoopOperator.ts +413 -0
  162. package/_src/Push/Operator/IOOperator.ts +173 -0
  163. package/_src/Push/Operator/LoopOperator.ts +242 -0
  164. package/_src/Push/Operator/SyncOperator.ts +107 -0
  165. package/_src/Push/Operator.ts +7 -0
  166. package/_src/Push/Producer/IOProducer.ts +83 -0
  167. package/_src/Push/Producer/SyncProducer.ts +105 -0
  168. package/_src/Push/Producer.ts +0 -0
  169. package/_src/Push/Sink.ts +302 -0
  170. package/_src/Push/api.ts +387 -513
  171. package/_src/Push/definition.ts +216 -23
  172. package/_src/Push/internal.ts +11 -0
  173. package/_src/Push.ts +7 -1
  174. package/_src/Ref/Synchronized/definition.ts +81 -37
  175. package/_src/Ref/definition.ts +26 -0
  176. package/_src/Scope/api.ts +22 -0
  177. package/_src/Sink/definition.ts +4 -5
  178. package/_src/Stream/definition.ts +0 -1
  179. package/_src/Subject/Atomic.ts +68 -11
  180. package/_src/Subject/DeferredRef.ts +44 -0
  181. package/_src/Subject/Hold.ts +48 -0
  182. package/_src/Subject/RefSubject/Atomic.ts +193 -0
  183. package/_src/Subject/RefSubject/Derived.ts +179 -0
  184. package/_src/Subject/RefSubject/RefSubject.ts +90 -0
  185. package/_src/Subject/definition.ts +21 -3
  186. package/_src/Subject.ts +5 -3
  187. package/_src/SubscriptionRef.ts +1 -1
  188. package/_src/index.ts +49 -50
  189. package/index.d.ts +0 -1
  190. package/package.json +4 -4
  191. package/RefSubject/Atomic.d.ts +0 -34
  192. package/RefSubject/Synchronized/api.d.ts +0 -9
  193. package/RefSubject/Synchronized/definition.d.ts +0 -39
  194. package/RefSubject/api.d.ts +0 -120
  195. package/RefSubject/definition.d.ts +0 -52
  196. package/RefSubject.d.ts +0 -3
  197. package/_cjs/RefSubject/Atomic.cjs +0 -107
  198. package/_cjs/RefSubject/Atomic.cjs.map +0 -1
  199. package/_cjs/RefSubject/Synchronized/api.cjs +0 -22
  200. package/_cjs/RefSubject/Synchronized/api.cjs.map +0 -1
  201. package/_cjs/RefSubject/Synchronized/definition.cjs +0 -55
  202. package/_cjs/RefSubject/Synchronized/definition.cjs.map +0 -1
  203. package/_cjs/RefSubject/api.cjs +0 -251
  204. package/_cjs/RefSubject/api.cjs.map +0 -1
  205. package/_cjs/RefSubject/definition.cjs +0 -26
  206. package/_cjs/RefSubject/definition.cjs.map +0 -1
  207. package/_cjs/RefSubject.cjs +0 -39
  208. package/_cjs/RefSubject.cjs.map +0 -1
  209. package/_mjs/RefSubject/Atomic.mjs +0 -99
  210. package/_mjs/RefSubject/Atomic.mjs.map +0 -1
  211. package/_mjs/RefSubject/Synchronized/api.mjs +0 -15
  212. package/_mjs/RefSubject/Synchronized/api.mjs.map +0 -1
  213. package/_mjs/RefSubject/Synchronized/definition.mjs +0 -47
  214. package/_mjs/RefSubject/Synchronized/definition.mjs.map +0 -1
  215. package/_mjs/RefSubject/api.mjs +0 -229
  216. package/_mjs/RefSubject/api.mjs.map +0 -1
  217. package/_mjs/RefSubject/definition.mjs +0 -19
  218. package/_mjs/RefSubject/definition.mjs.map +0 -1
  219. package/_mjs/RefSubject.mjs +0 -5
  220. package/_mjs/RefSubject.mjs.map +0 -1
  221. package/_src/RefSubject/Atomic.ts +0 -129
  222. package/_src/RefSubject/Synchronized/api.ts +0 -14
  223. package/_src/RefSubject/Synchronized/definition.ts +0 -76
  224. package/_src/RefSubject/api.ts +0 -253
  225. package/_src/RefSubject/definition.ts +0 -70
  226. package/_src/RefSubject.ts +0 -5
@@ -0,0 +1,105 @@
1
+ import type { Push } from "@fncts/io/Push";
2
+
3
+ export const enum SyncProducerTag {
4
+ Success,
5
+ FromSync,
6
+ FromArray,
7
+ FromIterable,
8
+ }
9
+
10
+ /**
11
+ * @tsplus type fncts.io.Push.SyncProducer
12
+ * @tsplus companion fncts.io.Push.SyncProducerOps
13
+ */
14
+ export type SyncProducer<A> = Success<A> | FromSync<A> | FromArray<A> | FromIterable<A>;
15
+
16
+ export class Success<A> {
17
+ readonly _tag = SyncProducerTag.Success;
18
+ constructor(readonly source: A) {}
19
+ }
20
+
21
+ export class FromSync<A> {
22
+ readonly _tag = SyncProducerTag.FromSync;
23
+ constructor(readonly f: Lazy<A>) {}
24
+ }
25
+
26
+ export class FromArray<A> {
27
+ readonly _tag = SyncProducerTag.FromArray;
28
+ constructor(readonly array: ReadonlyArray<A>) {}
29
+ }
30
+
31
+ export class FromIterable<A> {
32
+ readonly _tag = SyncProducerTag.FromIterable;
33
+ constructor(readonly iterable: Iterable<A>) {}
34
+ }
35
+
36
+ /**
37
+ * @tsplus static fncts.io.Push.SyncProducerOps Success
38
+ */
39
+ export function success<A>(source: A): SyncProducer<A> {
40
+ return new Success(source);
41
+ }
42
+
43
+ /**
44
+ * @tsplus static fncts.io.Push.SyncProducerOps fromSync
45
+ */
46
+ export function fromSync<A>(f: Lazy<A>): SyncProducer<A> {
47
+ return new FromSync(f);
48
+ }
49
+
50
+ /**
51
+ * @tsplus static fncts.io.Push.SyncProducerOps fromArray
52
+ */
53
+ export function fromArray<A extends ReadonlyArray<any>>(array: A): SyncProducer<A[number]> {
54
+ return new FromArray(array);
55
+ }
56
+
57
+ /**
58
+ * @tsplus static fncts.io.Push.SyncProducerOps fromIterable
59
+ */
60
+ export function fromIterable<A>(iterable: Iterable<A>): SyncProducer<A> {
61
+ return new FromIterable(iterable);
62
+ }
63
+
64
+ export function syncOnce<A>(f: () => A): UIO<A> {
65
+ let memoized: Maybe<A> = Nothing();
66
+ const get = () => {
67
+ if (memoized.isJust()) {
68
+ return memoized.value;
69
+ } else {
70
+ const a = f();
71
+ memoized = Just(a);
72
+ return a;
73
+ }
74
+ };
75
+
76
+ return IO(get);
77
+ }
78
+
79
+ /**
80
+ * @tsplus fluent fncts.io.Push.SyncProducer runSink
81
+ */
82
+ export function runSink<R, E, A>(self: SyncProducer<A>, sink: Push.UnsafeSink<R, E, A>): IO<R, never, unknown> {
83
+ switch (self._tag) {
84
+ case SyncProducerTag.Success:
85
+ return sink.onSuccess(self.source);
86
+ case SyncProducerTag.FromSync:
87
+ return IO.defer(() => sink.onSuccess(self.f()));
88
+ case SyncProducerTag.FromArray:
89
+ return arrayToSink(self.array, sink);
90
+ case SyncProducerTag.FromIterable:
91
+ return iterableToSink(self.iterable, sink);
92
+ }
93
+ }
94
+
95
+ function arrayToSink<A, R>(array: ReadonlyArray<A>, sink: Push.UnsafeSink<R, never, A>): IO<R, never, unknown> {
96
+ if (array.length === 0) return IO.unit;
97
+ else if (array.length === 1) return sink.onSuccess(array[0]);
98
+ else {
99
+ return array.mapIO((a) => sink.onSuccess(a));
100
+ }
101
+ }
102
+
103
+ function iterableToSink<A, R>(iterable: Iterable<A>, sink: Push.UnsafeSink<R, never, A>): IO<R, never, unknown> {
104
+ return IO.foreach(iterable, (a) => sink.onSuccess(a));
105
+ }
File without changes
@@ -0,0 +1,302 @@
1
+ import type { Cause } from "@fncts/base/data/Cause";
2
+
3
+ import { IO } from "@fncts/io/IO";
4
+
5
+ interface SinkN extends HKT {
6
+ readonly type: Sink<this["I"], this["R"], this["E"], this["A"]>;
7
+ readonly variance: {
8
+ I: "+";
9
+ R: "+";
10
+ E: "-";
11
+ A: "-";
12
+ };
13
+ }
14
+
15
+ /**
16
+ * @tsplus type fncts.io.Push.Sink
17
+ */
18
+ export interface Sink<Env, R, E, A> extends Newtype<{ readonly Sink: unique symbol }, URIO<Env, UnsafeSink<R, E, A>>> {}
19
+
20
+ /**
21
+ * @tsplus type fncts.io.Push.SinkOps
22
+ */
23
+ export interface SinkOps extends NewtypeIso<SinkN> {}
24
+
25
+ export const Sink: SinkOps = Newtype<SinkN>();
26
+
27
+ /**
28
+ * @tsplus type fncts.io.Push.Sink
29
+ * @tsplus companion fncts.io.Push.SinkOps
30
+ */
31
+ export abstract class UnsafeSink<R, in E, in A> {
32
+ abstract onSuccess(value: A): IO<R, never, void>;
33
+ abstract onFailure(cause: Cause<E>): IO<R, never, void>;
34
+ }
35
+
36
+ /**
37
+ * @tsplus static fncts.io.Push.SinkOps unsafeMake
38
+ */
39
+ export function unsafeMakeSink<R, E, A>(
40
+ onSuccess: (value: A) => IO<R, never, unknown>,
41
+ onFailure: (cause: Cause<E>) => IO<R, never, unknown>,
42
+ ): UnsafeSink<R, E, A> {
43
+ return new (class extends UnsafeSink<R, E, A> {
44
+ onSuccess = onSuccess;
45
+ onFailure = onFailure;
46
+ })();
47
+ }
48
+
49
+ /**
50
+ * @tsplus static fncts.io.Push.SinkOps __call
51
+ */
52
+ export function makeSink<R, E, A>(
53
+ onSuccess: (value: A) => IO<R, never, unknown>,
54
+ onFailure: (cause: Cause<E>) => IO<R, never, unknown>,
55
+ ): Sink<never, R, E, A> {
56
+ return Sink.get(IO(Sink.unsafeMake(onSuccess, onFailure)));
57
+ }
58
+
59
+ export class WithEarlyExit<R, E, A> extends UnsafeSink<R, E, A> {
60
+ constructor(
61
+ readonly onSuccess: (value: A) => IO<R, never, void>,
62
+ readonly onFailure: (cause: Cause<E>) => IO<R, never, void>,
63
+ readonly earlyExit: UIO<void>,
64
+ ) {
65
+ super();
66
+ }
67
+ }
68
+
69
+ /**
70
+ * @tsplus static fncts.io.Push.SinkOps withEarlyExit
71
+ */
72
+ export function withEarlyExit<R, E, A, R1, B>(
73
+ sink: UnsafeSink<R, E, A>,
74
+ f: (sink: WithEarlyExit<R, E, A>) => IO<R1, E, B>,
75
+ ): IO<R | R1, never, void> {
76
+ return IO.asyncIO((resume) => {
77
+ const earlyExit = new WithEarlyExit<R, E, A>(
78
+ (value) => sink.onSuccess(value),
79
+ (cause) => sink.onFailure(cause),
80
+ IO(resume(IO.unit)),
81
+ );
82
+
83
+ return f(earlyExit).matchCauseIO(
84
+ (cause) => sink.onFailure(cause),
85
+ () => earlyExit.earlyExit,
86
+ );
87
+ });
88
+ }
89
+
90
+ class ProvideSomeEnvironmentSink<R, E, A, R1> extends UnsafeSink<Exclude<R, R1>, E, A> {
91
+ constructor(
92
+ readonly sink: UnsafeSink<R, E, A>,
93
+ readonly environment: Environment<R1>,
94
+ ) {
95
+ super();
96
+ this.onFailure = this.onFailure.bind(this);
97
+ this.onSuccess = this.onSuccess.bind(this);
98
+ }
99
+
100
+ onFailure(cause: Cause<E>) {
101
+ return this.sink.onFailure(cause).provideSomeEnvironment(this.environment);
102
+ }
103
+
104
+ onSuccess(value: A) {
105
+ return this.sink.onSuccess(value).provideSomeEnvironment(this.environment);
106
+ }
107
+ }
108
+
109
+ /**
110
+ * @tsplus pipeable fncts.io.Push.Sink provideSomeEnvironment
111
+ */
112
+ export function provideSomeEnvironment<R1>(environment: Environment<R1>) {
113
+ return <Env, R, E, A>(self: Sink<Env, R, E, A>): Sink<Env, Exclude<R, R1>, E, A> => {
114
+ return Sink.get(Sink.reverseGet(self).map((sink) => new ProvideSomeEnvironmentSink(sink, environment)));
115
+ };
116
+ }
117
+
118
+ class MapSink<R, E, A, B> extends UnsafeSink<R, E, A> {
119
+ constructor(
120
+ readonly sink: UnsafeSink<R, E, B>,
121
+ readonly f: (a: A) => B,
122
+ ) {
123
+ super();
124
+ this.onFailure = this.onFailure.bind(this);
125
+ this.onSuccess = this.onSuccess.bind(this);
126
+ }
127
+
128
+ onFailure(cause: Cause<E>): IO<R, never, unknown> {
129
+ return this.sink.onFailure(cause);
130
+ }
131
+
132
+ onSuccess(value: A) {
133
+ return this.sink.onSuccess(this.f(value));
134
+ }
135
+ }
136
+
137
+ class FilterSink<R, E, A> extends UnsafeSink<R, E, A> {
138
+ constructor(
139
+ readonly sink: UnsafeSink<R, E, A>,
140
+ readonly predicate: Predicate<A>,
141
+ ) {
142
+ super();
143
+ this.onFailure = this.onFailure.bind(this);
144
+ this.onSuccess = this.onSuccess.bind(this);
145
+ }
146
+
147
+ onFailure(cause: Cause<E>) {
148
+ return this.sink.onFailure(cause);
149
+ }
150
+
151
+ onSuccess(value: A) {
152
+ if (this.predicate(value)) {
153
+ return this.sink.onSuccess(value);
154
+ } else {
155
+ return IO.unit;
156
+ }
157
+ }
158
+ }
159
+
160
+ class FilterMapSink<R, E, A, B> extends UnsafeSink<R, E, A> {
161
+ constructor(
162
+ readonly sink: UnsafeSink<R, E, B>,
163
+ readonly f: (a: A) => Maybe<B>,
164
+ ) {
165
+ super();
166
+ this.onFailure = this.onFailure.bind(this);
167
+ this.onSuccess = this.onSuccess.bind(this);
168
+ }
169
+
170
+ onFailure(cause: Cause<E>) {
171
+ return this.sink.onFailure(cause);
172
+ }
173
+
174
+ onSuccess(value: A) {
175
+ return this.f(value).match(
176
+ () => IO.unit,
177
+ (b) => this.sink.onSuccess(b),
178
+ );
179
+ }
180
+ }
181
+
182
+ class MapIOSink<R, E, A, R1, E1, B> extends UnsafeSink<R | R1, E1, B> {
183
+ constructor(
184
+ readonly sink: UnsafeSink<R, E | E1, A>,
185
+ readonly f: (b: B) => IO<R1, E1, A>,
186
+ ) {
187
+ super();
188
+ this.onFailure = this.onFailure.bind(this);
189
+ this.onSuccess = this.onSuccess.bind(this);
190
+ }
191
+
192
+ onFailure(cause: Cause<E1>) {
193
+ return this.sink.onFailure(cause);
194
+ }
195
+
196
+ onSuccess(value: B) {
197
+ return this.f(value).matchCauseIO(
198
+ (cause) => this.sink.onFailure(cause),
199
+ (a) => this.sink.onSuccess(a),
200
+ );
201
+ }
202
+ }
203
+
204
+ class FilterMapIOSink<R, E, A, R1, E1, B> extends UnsafeSink<R | R1, E1, B> {
205
+ constructor(
206
+ readonly sink: UnsafeSink<R, E | E1, A>,
207
+ readonly f: (b: B) => IO<R1, E1, Maybe<A>>,
208
+ ) {
209
+ super();
210
+ this.onFailure = this.onFailure.bind(this);
211
+ this.onSuccess = this.onSuccess.bind(this);
212
+ }
213
+
214
+ onFailure(cause: Cause<E1>) {
215
+ return this.sink.onFailure(cause);
216
+ }
217
+
218
+ onSuccess(value: B) {
219
+ return this.f(value).matchCauseIO(
220
+ (cause) => this.sink.onFailure(cause),
221
+ (ma) =>
222
+ ma.match(
223
+ () => IO.unit,
224
+ (a) => this.sink.onSuccess(a),
225
+ ),
226
+ );
227
+ }
228
+ }
229
+
230
+ class FilterIOSink<R, E, A> extends UnsafeSink<R, E, A> {
231
+ constructor(
232
+ readonly sink: UnsafeSink<R, E, A>,
233
+ readonly f: (a: A) => IO<R, E, boolean>,
234
+ ) {
235
+ super();
236
+ this.onFailure = this.onFailure.bind(this);
237
+ this.onSuccess = this.onSuccess.bind(this);
238
+ }
239
+
240
+ onFailure(cause: Cause<E>) {
241
+ return this.sink.onFailure(cause);
242
+ }
243
+
244
+ onSuccess(value: A) {
245
+ return this.f(value).matchCauseIO(
246
+ (cause) => this.sink.onFailure(cause),
247
+ (b) => {
248
+ if (b) {
249
+ return this.sink.onSuccess(value);
250
+ } else {
251
+ return IO.unit;
252
+ }
253
+ },
254
+ );
255
+ }
256
+ }
257
+
258
+ class TapIOSink<R, E, A, R1, E1> extends UnsafeSink<R | R1, E, A> {
259
+ constructor(
260
+ readonly sink: UnsafeSink<R, E | E1, A>,
261
+ readonly f: (a: A) => IO<R1, E1, unknown>,
262
+ ) {
263
+ super();
264
+ this.onFailure = this.onFailure.bind(this);
265
+ this.onSuccess = this.onSuccess.bind(this);
266
+ }
267
+
268
+ onFailure(cause: Cause<E>) {
269
+ return this.sink.onFailure(cause);
270
+ }
271
+
272
+ onSuccess(value: A) {
273
+ return this.f(value).matchCauseIO(
274
+ (cause) => this.sink.onFailure(cause),
275
+ () => this.sink.onSuccess(value),
276
+ );
277
+ }
278
+ }
279
+
280
+ class LoopSink<R, E, A, B, C> extends UnsafeSink<R, E, A> {
281
+ constructor(
282
+ readonly sink: UnsafeSink<R, E, C>,
283
+ private seed: B,
284
+ readonly f: (acc: B, a: A) => readonly [C, B],
285
+ ) {
286
+ super();
287
+ this.onFailure = this.onFailure.bind(this);
288
+ this.onSuccess = this.onSuccess.bind(this);
289
+ }
290
+
291
+ onFailure(cause: Cause<E>) {
292
+ return this.sink.onFailure(cause);
293
+ }
294
+
295
+ onSuccess(value: A) {
296
+ const [c, acc] = this.f(this.seed, value);
297
+ this.seed = acc;
298
+ return this.sink.onSuccess(c);
299
+ }
300
+ }
301
+
302
+ // class LoopCause<R, E, A, B, C> extends UnsafeSink<R, E, A> {}