@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.
- package/IO/api/foreachExec.d.ts +18 -0
- package/Push/Bounds.d.ts +4 -0
- package/Push/FlattenStrategy.d.ts +47 -0
- package/Push/IndexedBuffer.d.ts +19 -0
- package/Push/MergeStrategy.d.ts +19 -0
- package/Push/Operator/IOLoopOperator.d.ts +61 -0
- package/Push/Operator/IOOperator.d.ts +63 -0
- package/Push/Operator/LoopOperator.d.ts +50 -0
- package/Push/Operator/SyncOperator.d.ts +41 -0
- package/Push/Operator.d.ts +4 -0
- package/Push/Producer/IOProducer.d.ts +41 -0
- package/Push/Producer/SyncProducer.d.ts +61 -0
- package/Push/Producer.d.ts +1 -0
- package/Push/Sink.d.ts +65 -0
- package/Push/api.d.ts +78 -161
- package/Push/definition.d.ts +92 -19
- package/Push/internal.d.ts +3 -0
- package/Push.d.ts +6 -0
- package/Ref/Synchronized/definition.d.ts +32 -9
- package/Ref/definition.d.ts +12 -0
- package/Scope/api.d.ts +16 -1
- package/Sink/definition.d.ts +5 -6
- package/Subject/Atomic.d.ts +19 -9
- package/Subject/DeferredRef.d.ts +17 -0
- package/Subject/Hold.d.ts +19 -0
- package/Subject/RefSubject/Atomic.d.ts +41 -0
- package/Subject/RefSubject/Derived.d.ts +43 -0
- package/Subject/RefSubject/RefSubject.d.ts +27 -0
- package/Subject/definition.d.ts +14 -2
- package/Subject.d.ts +2 -0
- package/SubscriptionRef.d.ts +0 -1
- package/_cjs/IO/api/foreachExec.cjs +29 -4
- package/_cjs/IO/api/foreachExec.cjs.map +1 -1
- package/_cjs/Push/Bounds.cjs +2 -0
- package/_cjs/Push/Bounds.cjs.map +1 -0
- package/_cjs/Push/FlattenStrategy.cjs +95 -0
- package/_cjs/Push/FlattenStrategy.cjs.map +1 -0
- package/_cjs/Push/IndexedBuffer.cjs +70 -0
- package/_cjs/Push/IndexedBuffer.cjs.map +1 -0
- package/_cjs/Push/MergeStrategy.cjs +45 -0
- package/_cjs/Push/MergeStrategy.cjs.map +1 -0
- package/_cjs/Push/Operator/IOLoopOperator.cjs +225 -0
- package/_cjs/Push/Operator/IOLoopOperator.cjs.map +1 -0
- package/_cjs/Push/Operator/IOOperator.cjs +104 -0
- package/_cjs/Push/Operator/IOOperator.cjs.map +1 -0
- package/_cjs/Push/Operator/LoopOperator.cjs +165 -0
- package/_cjs/Push/Operator/LoopOperator.cjs.map +1 -0
- package/_cjs/Push/Operator/SyncOperator.cjs +78 -0
- package/_cjs/Push/Operator/SyncOperator.cjs.map +1 -0
- package/_cjs/Push/Operator.cjs +2 -0
- package/_cjs/Push/Operator.cjs.map +1 -0
- package/_cjs/Push/Producer/IOProducer.cjs +67 -0
- package/_cjs/Push/Producer/IOProducer.cjs.map +1 -0
- package/_cjs/Push/Producer/SyncProducer.cjs +107 -0
- package/_cjs/Push/Producer/SyncProducer.cjs.map +1 -0
- package/_cjs/Push/Producer.cjs +2 -0
- package/_cjs/Push/Producer.cjs.map +1 -0
- package/_cjs/Push/Sink.cjs +219 -0
- package/_cjs/Push/Sink.cjs.map +1 -0
- package/_cjs/Push/api.cjs +339 -383
- package/_cjs/Push/api.cjs.map +1 -1
- package/_cjs/Push/definition.cjs +79 -22
- package/_cjs/Push/definition.cjs.map +1 -1
- package/_cjs/Push/internal.cjs +31 -26
- package/_cjs/Push/internal.cjs.map +1 -1
- package/_cjs/Push.cjs +66 -0
- package/_cjs/Push.cjs.map +1 -1
- package/_cjs/Ref/Synchronized/definition.cjs +12 -12
- package/_cjs/Ref/Synchronized/definition.cjs.map +1 -1
- package/_cjs/Ref/definition.cjs.map +1 -1
- package/_cjs/Scope/api.cjs +28 -7
- package/_cjs/Scope/api.cjs.map +1 -1
- package/_cjs/Sink/definition.cjs +2 -3
- package/_cjs/Sink/definition.cjs.map +1 -1
- package/_cjs/Stream/definition.cjs.map +1 -1
- package/_cjs/Subject/Atomic.cjs +45 -10
- package/_cjs/Subject/Atomic.cjs.map +1 -1
- package/_cjs/Subject/DeferredRef.cjs +53 -0
- package/_cjs/Subject/DeferredRef.cjs.map +1 -0
- package/_cjs/Subject/Hold.cjs +41 -0
- package/_cjs/Subject/Hold.cjs.map +1 -0
- package/_cjs/Subject/RefSubject/Atomic.cjs +130 -0
- package/_cjs/Subject/RefSubject/Atomic.cjs.map +1 -0
- package/_cjs/Subject/RefSubject/Derived.cjs +98 -0
- package/_cjs/Subject/RefSubject/Derived.cjs.map +1 -0
- package/_cjs/Subject/RefSubject/RefSubject.cjs +19 -0
- package/_cjs/Subject/RefSubject/RefSubject.cjs.map +1 -0
- package/_cjs/Subject/definition.cjs +16 -1
- package/_cjs/Subject/definition.cjs.map +1 -1
- package/_cjs/Subject.cjs +22 -0
- package/_cjs/Subject.cjs.map +1 -1
- package/_cjs/SubscriptionRef.cjs +0 -1
- package/_cjs/SubscriptionRef.cjs.map +1 -1
- package/_mjs/IO/api/foreachExec.mjs +27 -4
- package/_mjs/IO/api/foreachExec.mjs.map +1 -1
- package/_mjs/Push/Bounds.mjs +2 -0
- package/_mjs/Push/Bounds.mjs.map +1 -0
- package/_mjs/Push/FlattenStrategy.mjs +86 -0
- package/_mjs/Push/FlattenStrategy.mjs.map +1 -0
- package/_mjs/Push/IndexedBuffer.mjs +61 -0
- package/_mjs/Push/IndexedBuffer.mjs.map +1 -0
- package/_mjs/Push/MergeStrategy.mjs +34 -0
- package/_mjs/Push/MergeStrategy.mjs.map +1 -0
- package/_mjs/Push/Operator/IOLoopOperator.mjs +208 -0
- package/_mjs/Push/Operator/IOLoopOperator.mjs.map +1 -0
- package/_mjs/Push/Operator/IOOperator.mjs +91 -0
- package/_mjs/Push/Operator/IOOperator.mjs.map +1 -0
- package/_mjs/Push/Operator/LoopOperator.mjs +151 -0
- package/_mjs/Push/Operator/LoopOperator.mjs.map +1 -0
- package/_mjs/Push/Operator/SyncOperator.mjs +67 -0
- package/_mjs/Push/Operator/SyncOperator.mjs.map +1 -0
- package/_mjs/Push/Operator.mjs +2 -0
- package/_mjs/Push/Operator.mjs.map +1 -0
- package/_mjs/Push/Producer/IOProducer.mjs +55 -0
- package/_mjs/Push/Producer/IOProducer.mjs.map +1 -0
- package/_mjs/Push/Producer/SyncProducer.mjs +90 -0
- package/_mjs/Push/Producer/SyncProducer.mjs.map +1 -0
- package/_mjs/Push/Producer.mjs +2 -0
- package/_mjs/Push/Producer.mjs.map +1 -0
- package/_mjs/Push/Sink.mjs +206 -0
- package/_mjs/Push/Sink.mjs.map +1 -0
- package/_mjs/Push/api.mjs +311 -344
- package/_mjs/Push/api.mjs.map +1 -1
- package/_mjs/Push/definition.mjs +73 -18
- package/_mjs/Push/definition.mjs.map +1 -1
- package/_mjs/Push/internal.mjs +30 -26
- package/_mjs/Push/internal.mjs.map +1 -1
- package/_mjs/Push.mjs +7 -1
- package/_mjs/Push.mjs.map +1 -1
- package/_mjs/Ref/Synchronized/definition.mjs +12 -12
- package/_mjs/Ref/Synchronized/definition.mjs.map +1 -1
- package/_mjs/Ref/definition.mjs.map +1 -1
- package/_mjs/Scope/api.mjs +22 -4
- package/_mjs/Scope/api.mjs.map +1 -1
- package/_mjs/Sink/definition.mjs +2 -3
- package/_mjs/Sink/definition.mjs.map +1 -1
- package/_mjs/Stream/definition.mjs.map +1 -1
- package/_mjs/Subject/Atomic.mjs +46 -10
- package/_mjs/Subject/Atomic.mjs.map +1 -1
- package/_mjs/Subject/DeferredRef.mjs +45 -0
- package/_mjs/Subject/DeferredRef.mjs.map +1 -0
- package/_mjs/Subject/Hold.mjs +33 -0
- package/_mjs/Subject/Hold.mjs.map +1 -0
- package/_mjs/Subject/RefSubject/Atomic.mjs +122 -0
- package/_mjs/Subject/RefSubject/Atomic.mjs.map +1 -0
- package/_mjs/Subject/RefSubject/Derived.mjs +90 -0
- package/_mjs/Subject/RefSubject/Derived.mjs.map +1 -0
- package/_mjs/Subject/RefSubject/RefSubject.mjs +12 -0
- package/_mjs/Subject/RefSubject/RefSubject.mjs.map +1 -0
- package/_mjs/Subject/definition.mjs +14 -0
- package/_mjs/Subject/definition.mjs.map +1 -1
- package/_mjs/Subject.mjs +2 -0
- package/_mjs/Subject.mjs.map +1 -1
- package/_mjs/SubscriptionRef.mjs +0 -1
- package/_mjs/SubscriptionRef.mjs.map +1 -1
- package/_src/IO/api/foreachExec.ts +47 -0
- package/_src/Push/Bounds.ts +4 -0
- package/_src/Push/FlattenStrategy.ts +137 -0
- package/_src/Push/IndexedBuffer.ts +79 -0
- package/_src/Push/MergeStrategy.ts +59 -0
- package/_src/Push/Operator/IOLoopOperator.ts +413 -0
- package/_src/Push/Operator/IOOperator.ts +173 -0
- package/_src/Push/Operator/LoopOperator.ts +242 -0
- package/_src/Push/Operator/SyncOperator.ts +107 -0
- package/_src/Push/Operator.ts +7 -0
- package/_src/Push/Producer/IOProducer.ts +83 -0
- package/_src/Push/Producer/SyncProducer.ts +105 -0
- package/_src/Push/Producer.ts +0 -0
- package/_src/Push/Sink.ts +302 -0
- package/_src/Push/api.ts +387 -513
- package/_src/Push/definition.ts +216 -23
- package/_src/Push/internal.ts +11 -0
- package/_src/Push.ts +7 -1
- package/_src/Ref/Synchronized/definition.ts +81 -37
- package/_src/Ref/definition.ts +26 -0
- package/_src/Scope/api.ts +22 -0
- package/_src/Sink/definition.ts +4 -5
- package/_src/Stream/definition.ts +0 -1
- package/_src/Subject/Atomic.ts +68 -11
- package/_src/Subject/DeferredRef.ts +44 -0
- package/_src/Subject/Hold.ts +48 -0
- package/_src/Subject/RefSubject/Atomic.ts +193 -0
- package/_src/Subject/RefSubject/Derived.ts +179 -0
- package/_src/Subject/RefSubject/RefSubject.ts +90 -0
- package/_src/Subject/definition.ts +21 -3
- package/_src/Subject.ts +5 -3
- package/_src/SubscriptionRef.ts +1 -1
- package/_src/index.ts +49 -50
- package/index.d.ts +0 -1
- package/package.json +4 -4
- package/RefSubject/Atomic.d.ts +0 -34
- package/RefSubject/Synchronized/api.d.ts +0 -9
- package/RefSubject/Synchronized/definition.d.ts +0 -39
- package/RefSubject/api.d.ts +0 -120
- package/RefSubject/definition.d.ts +0 -52
- package/RefSubject.d.ts +0 -3
- package/_cjs/RefSubject/Atomic.cjs +0 -107
- package/_cjs/RefSubject/Atomic.cjs.map +0 -1
- package/_cjs/RefSubject/Synchronized/api.cjs +0 -22
- package/_cjs/RefSubject/Synchronized/api.cjs.map +0 -1
- package/_cjs/RefSubject/Synchronized/definition.cjs +0 -55
- package/_cjs/RefSubject/Synchronized/definition.cjs.map +0 -1
- package/_cjs/RefSubject/api.cjs +0 -251
- package/_cjs/RefSubject/api.cjs.map +0 -1
- package/_cjs/RefSubject/definition.cjs +0 -26
- package/_cjs/RefSubject/definition.cjs.map +0 -1
- package/_cjs/RefSubject.cjs +0 -39
- package/_cjs/RefSubject.cjs.map +0 -1
- package/_mjs/RefSubject/Atomic.mjs +0 -99
- package/_mjs/RefSubject/Atomic.mjs.map +0 -1
- package/_mjs/RefSubject/Synchronized/api.mjs +0 -15
- package/_mjs/RefSubject/Synchronized/api.mjs.map +0 -1
- package/_mjs/RefSubject/Synchronized/definition.mjs +0 -47
- package/_mjs/RefSubject/Synchronized/definition.mjs.map +0 -1
- package/_mjs/RefSubject/api.mjs +0 -229
- package/_mjs/RefSubject/api.mjs.map +0 -1
- package/_mjs/RefSubject/definition.mjs +0 -19
- package/_mjs/RefSubject/definition.mjs.map +0 -1
- package/_mjs/RefSubject.mjs +0 -5
- package/_mjs/RefSubject.mjs.map +0 -1
- package/_src/RefSubject/Atomic.ts +0 -129
- package/_src/RefSubject/Synchronized/api.ts +0 -14
- package/_src/RefSubject/Synchronized/definition.ts +0 -76
- package/_src/RefSubject/api.ts +0 -253
- package/_src/RefSubject/definition.ts +0 -70
- 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> {}
|