@fncts/io 0.0.34 → 0.0.36
Sign up to get free protection for your applications and to get access to all the features.
- package/Fiber/FiberRuntime.d.ts +7 -7
- package/Fiber/constructors.d.ts +5 -0
- package/IO/api/all.d.ts +41 -0
- package/IO/api/concurrency.d.ts +11 -0
- package/IO/api/interrupt.d.ts +1 -1
- package/IO/api/raceWith.d.ts +2 -1
- package/IO/api.d.ts +7 -2
- package/IO/definition.d.ts +103 -127
- package/IO.d.ts +1 -0
- package/Push/api.d.ts +86 -36
- package/Push/definition.d.ts +28 -13
- package/Push/internal.d.ts +7 -11
- package/RefSubject/Atomic.d.ts +8 -11
- package/RefSubject/Synchronized/definition.d.ts +4 -6
- package/RefSubject/api.d.ts +0 -1
- package/RefSubject/definition.d.ts +6 -8
- package/STM/definition.d.ts +19 -2
- package/Sink/api.d.ts +24 -24
- package/Subject/Atomic.d.ts +4 -6
- package/Subject/definition.d.ts +2 -2
- package/_cjs/Channel/api/runScoped.cjs +1 -1
- package/_cjs/Channel/api/runScoped.cjs.map +1 -1
- package/_cjs/Channel/api.cjs +2 -2
- package/_cjs/Channel/api.cjs.map +1 -1
- package/_cjs/Fiber/FiberRuntime.cjs +110 -98
- package/_cjs/Fiber/FiberRuntime.cjs.map +1 -1
- package/_cjs/Fiber/constructors.cjs +10 -2
- package/_cjs/Fiber/constructors.cjs.map +1 -1
- package/_cjs/Future/api.cjs +1 -1
- package/_cjs/Future/api.cjs.map +1 -1
- package/_cjs/IO/api/all.cjs +33 -0
- package/_cjs/IO/api/all.cjs.map +1 -0
- package/_cjs/IO/api/asyncIO.cjs +1 -1
- package/_cjs/IO/api/asyncIO.cjs.map +1 -1
- package/_cjs/IO/api/bracketExit.cjs +1 -1
- package/_cjs/IO/api/bracketExit.cjs.map +1 -1
- package/_cjs/IO/api/concurrency.cjs +25 -4
- package/_cjs/IO/api/concurrency.cjs.map +1 -1
- package/_cjs/IO/api/disconnect.cjs +1 -1
- package/_cjs/IO/api/disconnect.cjs.map +1 -1
- package/_cjs/IO/api/foreachConcurrent.cjs +1 -1
- package/_cjs/IO/api/foreachConcurrent.cjs.map +1 -1
- package/_cjs/IO/api/foreachExec.cjs +1 -1
- package/_cjs/IO/api/foreachExec.cjs.map +1 -1
- package/_cjs/IO/api/forkIn.cjs +1 -1
- package/_cjs/IO/api/forkIn.cjs.map +1 -1
- package/_cjs/IO/api/forkScoped.cjs +1 -1
- package/_cjs/IO/api/forkScoped.cjs.map +1 -1
- package/_cjs/IO/api/fulfill.cjs +1 -1
- package/_cjs/IO/api/fulfill.cjs.map +1 -1
- package/_cjs/IO/api/interrupt.cjs +18 -6
- package/_cjs/IO/api/interrupt.cjs.map +1 -1
- package/_cjs/IO/api/raceWith.cjs +4 -4
- package/_cjs/IO/api/raceWith.cjs.map +1 -1
- package/_cjs/IO/api/timeout.cjs +8 -5
- package/_cjs/IO/api/timeout.cjs.map +1 -1
- package/_cjs/IO/api/zipConcurrent.cjs +1 -1
- package/_cjs/IO/api/zipConcurrent.cjs.map +1 -1
- package/_cjs/IO/api.cjs +78 -20
- package/_cjs/IO/api.cjs.map +1 -1
- package/_cjs/IO/definition.cjs +14 -191
- package/_cjs/IO/definition.cjs.map +1 -1
- package/_cjs/IO.cjs +11 -0
- package/_cjs/IO.cjs.map +1 -1
- package/_cjs/Layer/MemoMap.cjs +1 -1
- package/_cjs/Layer/MemoMap.cjs.map +1 -1
- package/_cjs/Layer/api.cjs.map +1 -1
- package/_cjs/Push/api.cjs +238 -168
- package/_cjs/Push/api.cjs.map +1 -1
- package/_cjs/Push/definition.cjs +12 -13
- package/_cjs/Push/definition.cjs.map +1 -1
- package/_cjs/Push/internal.cjs +37 -29
- package/_cjs/Push/internal.cjs.map +1 -1
- package/_cjs/RefSubject/Atomic.cjs +15 -19
- package/_cjs/RefSubject/Atomic.cjs.map +1 -1
- package/_cjs/RefSubject/Synchronized/definition.cjs +9 -10
- package/_cjs/RefSubject/Synchronized/definition.cjs.map +1 -1
- package/_cjs/RefSubject/api.cjs +5 -6
- package/_cjs/RefSubject/api.cjs.map +1 -1
- package/_cjs/RefSubject/definition.cjs.map +1 -1
- package/_cjs/STM/api/atomically.cjs +1 -1
- package/_cjs/STM/api/atomically.cjs.map +1 -1
- package/_cjs/STM/api.cjs +2 -2
- package/_cjs/STM/api.cjs.map +1 -1
- package/_cjs/STM/definition.cjs +1 -1
- package/_cjs/STM/definition.cjs.map +1 -1
- package/_cjs/ScopedRef/api.cjs +2 -2
- package/_cjs/ScopedRef/api.cjs.map +1 -1
- package/_cjs/Semaphore.cjs +1 -1
- package/_cjs/Semaphore.cjs.map +1 -1
- package/_cjs/Sink/api.cjs +13 -13
- package/_cjs/Sink/api.cjs.map +1 -1
- package/_cjs/Subject/Atomic.cjs +4 -5
- package/_cjs/Subject/Atomic.cjs.map +1 -1
- package/_cjs/TReentrantLock/api.cjs +2 -2
- package/_cjs/TReentrantLock/api.cjs.map +1 -1
- package/_cjs/TSemaphore/api.cjs +1 -1
- package/_cjs/TSemaphore/api.cjs.map +1 -1
- package/_cjs/collection/immutable/Conc/dropUntilIO.cjs +12 -17
- package/_cjs/collection/immutable/Conc/dropUntilIO.cjs.map +1 -1
- package/_cjs/collection/immutable/Conc/dropWhileIO.cjs +12 -17
- package/_cjs/collection/immutable/Conc/dropWhileIO.cjs.map +1 -1
- package/_cjs/collection/immutable/Conc/filterIO.cjs +2 -12
- package/_cjs/collection/immutable/Conc/filterIO.cjs.map +1 -1
- package/_cjs/collection/immutable/Conc/mapIO.cjs +3 -9
- package/_cjs/collection/immutable/Conc/mapIO.cjs.map +1 -1
- package/_cjs/collection/immutable/Conc/takeWhileIO.cjs +11 -27
- package/_cjs/collection/immutable/Conc/takeWhileIO.cjs.map +1 -1
- package/_mjs/Channel/api/runScoped.mjs +1 -1
- package/_mjs/Channel/api/runScoped.mjs.map +1 -1
- package/_mjs/Channel/api.mjs +2 -2
- package/_mjs/Channel/api.mjs.map +1 -1
- package/_mjs/Fiber/FiberRuntime.mjs +111 -100
- package/_mjs/Fiber/FiberRuntime.mjs.map +1 -1
- package/_mjs/Fiber/constructors.mjs +7 -1
- package/_mjs/Fiber/constructors.mjs.map +1 -1
- package/_mjs/Future/api.mjs +1 -1
- package/_mjs/Future/api.mjs.map +1 -1
- package/_mjs/IO/api/all.mjs +24 -0
- package/_mjs/IO/api/all.mjs.map +1 -0
- package/_mjs/IO/api/asyncIO.mjs +1 -1
- package/_mjs/IO/api/asyncIO.mjs.map +1 -1
- package/_mjs/IO/api/bracketExit.mjs +1 -1
- package/_mjs/IO/api/bracketExit.mjs.map +1 -1
- package/_mjs/IO/api/concurrency.mjs +19 -2
- package/_mjs/IO/api/concurrency.mjs.map +1 -1
- package/_mjs/IO/api/disconnect.mjs +1 -1
- package/_mjs/IO/api/disconnect.mjs.map +1 -1
- package/_mjs/IO/api/foreachConcurrent.mjs +1 -1
- package/_mjs/IO/api/foreachConcurrent.mjs.map +1 -1
- package/_mjs/IO/api/foreachExec.mjs +1 -1
- package/_mjs/IO/api/foreachExec.mjs.map +1 -1
- package/_mjs/IO/api/forkIn.mjs +1 -1
- package/_mjs/IO/api/forkIn.mjs.map +1 -1
- package/_mjs/IO/api/forkScoped.mjs +1 -1
- package/_mjs/IO/api/forkScoped.mjs.map +1 -1
- package/_mjs/IO/api/fulfill.mjs +1 -1
- package/_mjs/IO/api/fulfill.mjs.map +1 -1
- package/_mjs/IO/api/interrupt.mjs +19 -7
- package/_mjs/IO/api/interrupt.mjs.map +1 -1
- package/_mjs/IO/api/raceWith.mjs +4 -4
- package/_mjs/IO/api/raceWith.mjs.map +1 -1
- package/_mjs/IO/api/timeout.mjs +8 -5
- package/_mjs/IO/api/timeout.mjs.map +1 -1
- package/_mjs/IO/api/zipConcurrent.mjs +1 -1
- package/_mjs/IO/api/zipConcurrent.mjs.map +1 -1
- package/_mjs/IO/api.mjs +78 -23
- package/_mjs/IO/api.mjs.map +1 -1
- package/_mjs/IO/definition.mjs +12 -181
- package/_mjs/IO/definition.mjs.map +1 -1
- package/_mjs/IO.mjs +1 -0
- package/_mjs/IO.mjs.map +1 -1
- package/_mjs/Layer/MemoMap.mjs +1 -1
- package/_mjs/Layer/MemoMap.mjs.map +1 -1
- package/_mjs/Layer/api.mjs.map +1 -1
- package/_mjs/Push/api.mjs +223 -166
- package/_mjs/Push/api.mjs.map +1 -1
- package/_mjs/Push/definition.mjs +9 -10
- package/_mjs/Push/definition.mjs.map +1 -1
- package/_mjs/Push/internal.mjs +33 -22
- package/_mjs/Push/internal.mjs.map +1 -1
- package/_mjs/RefSubject/Atomic.mjs +15 -19
- package/_mjs/RefSubject/Atomic.mjs.map +1 -1
- package/_mjs/RefSubject/Synchronized/definition.mjs +9 -10
- package/_mjs/RefSubject/Synchronized/definition.mjs.map +1 -1
- package/_mjs/RefSubject/api.mjs +6 -7
- package/_mjs/RefSubject/api.mjs.map +1 -1
- package/_mjs/RefSubject/definition.mjs.map +1 -1
- package/_mjs/STM/api/atomically.mjs +1 -1
- package/_mjs/STM/api/atomically.mjs.map +1 -1
- package/_mjs/STM/api.mjs +2 -2
- package/_mjs/STM/api.mjs.map +1 -1
- package/_mjs/STM/definition.mjs +1 -1
- package/_mjs/STM/definition.mjs.map +1 -1
- package/_mjs/ScopedRef/api.mjs +2 -2
- package/_mjs/ScopedRef/api.mjs.map +1 -1
- package/_mjs/Semaphore.mjs +1 -1
- package/_mjs/Semaphore.mjs.map +1 -1
- package/_mjs/Sink/api.mjs +10 -10
- package/_mjs/Sink/api.mjs.map +1 -1
- package/_mjs/Subject/Atomic.mjs +4 -5
- package/_mjs/Subject/Atomic.mjs.map +1 -1
- package/_mjs/TReentrantLock/api.mjs +2 -2
- package/_mjs/TReentrantLock/api.mjs.map +1 -1
- package/_mjs/TSemaphore/api.mjs +1 -1
- package/_mjs/TSemaphore/api.mjs.map +1 -1
- package/_mjs/collection/immutable/Conc/dropUntilIO.mjs +12 -17
- package/_mjs/collection/immutable/Conc/dropUntilIO.mjs.map +1 -1
- package/_mjs/collection/immutable/Conc/dropWhileIO.mjs +12 -17
- package/_mjs/collection/immutable/Conc/dropWhileIO.mjs.map +1 -1
- package/_mjs/collection/immutable/Conc/filterIO.mjs +2 -12
- package/_mjs/collection/immutable/Conc/filterIO.mjs.map +1 -1
- package/_mjs/collection/immutable/Conc/mapIO.mjs +3 -9
- package/_mjs/collection/immutable/Conc/mapIO.mjs.map +1 -1
- package/_mjs/collection/immutable/Conc/takeWhileIO.mjs +11 -27
- package/_mjs/collection/immutable/Conc/takeWhileIO.mjs.map +1 -1
- package/_src/Channel/api.ts +3 -3
- package/_src/Fiber/FiberRuntime.ts +76 -75
- package/_src/Fiber/constructors.ts +5 -0
- package/_src/IO/api/all.ts +64 -0
- package/_src/IO/api/concurrency.ts +33 -0
- package/_src/IO/api/foreachExec.ts +2 -2
- package/_src/IO/api/interrupt.ts +20 -7
- package/_src/IO/api/raceWith.ts +4 -2
- package/_src/IO/api/timeout.ts +21 -1
- package/_src/IO/api.ts +79 -27
- package/_src/IO/definition.ts +155 -200
- package/_src/IO.ts +1 -0
- package/_src/Layer/api.ts +0 -1
- package/_src/Push/api.ts +305 -304
- package/_src/Push/definition.ts +19 -17
- package/_src/Push/internal.ts +63 -31
- package/_src/RefSubject/Atomic.ts +16 -22
- package/_src/RefSubject/Synchronized/definition.ts +6 -9
- package/_src/RefSubject/api.ts +9 -12
- package/_src/RefSubject/definition.ts +6 -8
- package/_src/STM/api.ts +0 -5
- package/_src/STM/definition.ts +8 -2
- package/_src/Sink/api.ts +9 -9
- package/_src/Subject/Atomic.ts +6 -8
- package/_src/Subject/definition.ts +2 -2
- package/_src/collection/immutable/Conc/dropUntilIO.ts +18 -15
- package/_src/collection/immutable/Conc/dropWhileIO.ts +18 -17
- package/_src/collection/immutable/Conc/filterIO.ts +1 -11
- package/_src/collection/immutable/Conc/mapIO.ts +2 -9
- package/_src/collection/immutable/Conc/takeWhileIO.ts +19 -28
- package/collection/immutable/Conc/filterIO.d.ts +1 -1
- package/collection/immutable/Conc/mapIO.d.ts +1 -1
- package/collection/immutable/Conc/takeWhileIO.d.ts +1 -1
- package/package.json +2 -2
@@ -0,0 +1,64 @@
|
|
1
|
+
import type { _A, _E, _R } from "@fncts/base/types";
|
2
|
+
import type { EnvironmentOf, ErrorOf, IOVariance, ValueOf } from "@fncts/io/IO";
|
3
|
+
|
4
|
+
/**
|
5
|
+
* @tsplus static fncts.io.IOOps all
|
6
|
+
*/
|
7
|
+
export function all<T extends ReadonlyArray<IO<any, any, any>>>(
|
8
|
+
ios: [...T],
|
9
|
+
): IO<
|
10
|
+
{ [K in number]: EnvironmentOf<T[K]> }[number],
|
11
|
+
{ [K in number]: ErrorOf<T[K]> }[number],
|
12
|
+
{ [K in keyof T]: ValueOf<T[K]> }
|
13
|
+
>;
|
14
|
+
export function all<T extends Iterable<IO<any, any, any>>>(
|
15
|
+
ios: T,
|
16
|
+
): [T] extends [Iterable<infer A>] ? IO<EnvironmentOf<A>, ErrorOf<A>, Conc<ValueOf<A>>> : never;
|
17
|
+
export function all<T extends Record<string, IO<any, any, any>>>(
|
18
|
+
ios: T,
|
19
|
+
): IO<
|
20
|
+
{ [K in keyof T]: EnvironmentOf<T[K]> }[keyof T],
|
21
|
+
{ [K in keyof T]: ErrorOf<T[K]> }[keyof T],
|
22
|
+
{ [K in keyof T]: ValueOf<T[K]> }
|
23
|
+
>;
|
24
|
+
export function all(ios: Record<string, IO<any, any, any>> | Iterable<IO<any, any, any>>): IO<any, any, any> {
|
25
|
+
if (Symbol.iterator in ios) {
|
26
|
+
return IO.foreach(ios, Function.identity);
|
27
|
+
} else {
|
28
|
+
return IO.foreach(
|
29
|
+
Object.entries(ios).map(([k, io]) => io.map((value) => [k, value] as const)),
|
30
|
+
Function.identity,
|
31
|
+
).map((result) => result.foldLeft({} as Record<string, any>, (b, a) => Object.assign(b, { [a[0]]: a[1] })));
|
32
|
+
}
|
33
|
+
}
|
34
|
+
|
35
|
+
/**
|
36
|
+
* @tsplus static fncts.io.IOOps allConcurrent
|
37
|
+
*/
|
38
|
+
export function allConcurrent<T extends ReadonlyArray<IO<any, any, any>>>(
|
39
|
+
ios: [...T],
|
40
|
+
): IO<
|
41
|
+
{ [K in number]: EnvironmentOf<T[K]> }[number],
|
42
|
+
{ [K in number]: ErrorOf<T[K]> }[number],
|
43
|
+
{ [K in keyof T]: ValueOf<T[K]> }
|
44
|
+
>;
|
45
|
+
export function allConcurrent<T extends Iterable<IO<any, any, any>>>(
|
46
|
+
ios: T,
|
47
|
+
): [T] extends [Iterable<infer A>] ? IO<EnvironmentOf<A>, ErrorOf<A>, Conc<ValueOf<A>>> : never;
|
48
|
+
export function allConcurrent<T extends Record<string, IO<any, any, any>>>(
|
49
|
+
ios: T,
|
50
|
+
): IO<
|
51
|
+
{ [K in keyof T]: EnvironmentOf<T[K]> }[keyof T],
|
52
|
+
{ [K in keyof T]: ErrorOf<T[K]> }[keyof T],
|
53
|
+
{ [K in keyof T]: ValueOf<T[K]> }
|
54
|
+
>;
|
55
|
+
export function allConcurrent(ios: Record<string, IO<any, any, any>> | Iterable<IO<any, any, any>>): IO<any, any, any> {
|
56
|
+
if (Symbol.iterator in ios) {
|
57
|
+
return IO.foreachConcurrent(ios, Function.identity);
|
58
|
+
} else {
|
59
|
+
return IO.foreachConcurrent(
|
60
|
+
Object.entries(ios).map(([k, io]) => io.map((value) => [k, value] as const)),
|
61
|
+
Function.identity,
|
62
|
+
).map((result) => result.foldLeft({} as Record<string, any>, (b, a) => Object.assign(b, { [a[0]]: a[1] })));
|
63
|
+
}
|
64
|
+
}
|
@@ -41,3 +41,36 @@ export function withConcurrency(n: number, __tsplusTrace?: string) {
|
|
41
41
|
export function withConcurrencyUnbounded<R, E, A>(ma: IO<R, E, A>, __tsplusTrace?: string): IO<R, E, A> {
|
42
42
|
return IO.defer(Concurrency.locally(Nothing())(ma));
|
43
43
|
}
|
44
|
+
|
45
|
+
export type ConcurrencyRestorer = <R, E, A>(io: IO<R, E, A>) => IO<R, E, A>;
|
46
|
+
|
47
|
+
const MakeConcurrent =
|
48
|
+
(n: number): ConcurrencyRestorer =>
|
49
|
+
(io) =>
|
50
|
+
io.withConcurrency(n);
|
51
|
+
|
52
|
+
const MakeConcurrentUnbounded: ConcurrencyRestorer = (io) => io.withConcurrencyUnbounded;
|
53
|
+
|
54
|
+
/**
|
55
|
+
* @tsplus static fncts.io.IOOps withConcurrencyMask
|
56
|
+
*/
|
57
|
+
export function withConcurrencyMask<R, E, A>(n: number, f: (restore: ConcurrencyRestorer) => IO<R, E, A>): IO<R, E, A> {
|
58
|
+
return Concurrency.getWith((concurrency) =>
|
59
|
+
concurrency.match(
|
60
|
+
() => Concurrency.locally(Just(n))(f(MakeConcurrentUnbounded)),
|
61
|
+
(n0) => Concurrency.locally(Just(n))(f(MakeConcurrent(n0))),
|
62
|
+
),
|
63
|
+
);
|
64
|
+
}
|
65
|
+
|
66
|
+
/**
|
67
|
+
* @tsplus static fncts.io.IOOps withConcurrencyUnboundedMask
|
68
|
+
*/
|
69
|
+
export function withConcurrencyUnboundedMask<R, E, A>(f: (restore: ConcurrencyRestorer) => IO<R, E, A>): IO<R, E, A> {
|
70
|
+
return Concurrency.getWith((concurrency) =>
|
71
|
+
concurrency.match(
|
72
|
+
() => Concurrency.locally(Nothing())(f(MakeConcurrentUnbounded)),
|
73
|
+
(n0) => Concurrency.locally(Nothing())(f(MakeConcurrent(n0))),
|
74
|
+
),
|
75
|
+
);
|
76
|
+
}
|
@@ -14,7 +14,7 @@ export function foreachExec<R, E, A, B>(
|
|
14
14
|
): IO<R, E, Conc<B>> {
|
15
15
|
return es.match(
|
16
16
|
() => IO.foreach(as, f),
|
17
|
-
() => IO.foreachConcurrent(as, f)
|
18
|
-
(fiberBound) => IO.foreachConcurrent(as,
|
17
|
+
() => IO.withConcurrencyUnboundedMask((restore) => IO.foreachConcurrent(as, (a) => restore(f(a)))),
|
18
|
+
(fiberBound) => IO.withConcurrencyMask(fiberBound, (restore) => IO.foreachConcurrent(as, (a) => restore(f(a)))),
|
19
19
|
);
|
20
20
|
}
|
package/_src/IO/api/interrupt.ts
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
import {
|
1
|
+
import { IOPrimitive,IOTag } from "@fncts/io/IO/definition";
|
2
2
|
import { RuntimeFlag } from "@fncts/io/RuntimeFlag";
|
3
3
|
import { RuntimeFlags } from "@fncts/io/RuntimeFlags";
|
4
4
|
|
@@ -40,7 +40,11 @@ export const interrupt: IO<never, never, never> = IO.fiberId.flatMap(IO.interrup
|
|
40
40
|
* @tsplus static fncts.io.IOOps interruptible
|
41
41
|
*/
|
42
42
|
export function interruptible<R, E, A>(self: IO<R, E, A>, __tsplusTrace?: string): IO<R, E, A> {
|
43
|
-
|
43
|
+
const io = new IOPrimitive(IOTag.UpdateRuntimeFlagsWithin) as any;
|
44
|
+
io.i0 = RuntimeFlags.enable(RuntimeFlag.Interruption);
|
45
|
+
io.i1 = () => self;
|
46
|
+
io.trace = __tsplusTrace;
|
47
|
+
return io;
|
44
48
|
}
|
45
49
|
|
46
50
|
/**
|
@@ -55,7 +59,11 @@ export function interruptible<R, E, A>(self: IO<R, E, A>, __tsplusTrace?: string
|
|
55
59
|
* @tsplus static fncts.io.IOOps uninterruptible
|
56
60
|
*/
|
57
61
|
export function uninterruptible<R, E, A>(self: IO<R, E, A>, __tsplusTrace?: string): IO<R, E, A> {
|
58
|
-
|
62
|
+
const io = new IOPrimitive(IOTag.UpdateRuntimeFlagsWithin) as any;
|
63
|
+
io.i0 = RuntimeFlags.disable(RuntimeFlag.Interruption);
|
64
|
+
io.i1 = () => self;
|
65
|
+
io.trace = __tsplusTrace;
|
66
|
+
return io;
|
59
67
|
}
|
60
68
|
|
61
69
|
/**
|
@@ -65,10 +73,15 @@ export function uninterruptible<R, E, A>(self: IO<R, E, A>, __tsplusTrace?: stri
|
|
65
73
|
*
|
66
74
|
* @tsplus static fncts.io.IOOps uninterruptibleMask
|
67
75
|
*/
|
68
|
-
export function uninterruptibleMask<R, E, A>(
|
69
|
-
|
70
|
-
|
71
|
-
|
76
|
+
export function uninterruptibleMask<R, E, A>(
|
77
|
+
f: (restore: InterruptibilityRestorer) => IO<R, E, A>,
|
78
|
+
__tsplusTrace?: string,
|
79
|
+
): IO<R, E, A> {
|
80
|
+
const io = new IOPrimitive(IOTag.UpdateRuntimeFlagsWithin) as any;
|
81
|
+
io.i0 = RuntimeFlags.disable(RuntimeFlag.Interruption);
|
82
|
+
io.i1 = (oldFlags: RuntimeFlags) => f(oldFlags.interruption ? RestoreInterruptible : RestoreUninterruptible);
|
83
|
+
io.trace = __tsplusTrace;
|
84
|
+
return io;
|
72
85
|
}
|
73
86
|
|
74
87
|
/**
|
package/_src/IO/api/raceWith.ts
CHANGED
@@ -10,6 +10,8 @@ export function raceFibersWith<R, E, A, R1, E1, B, R2, E2, C, R3, E3, D>(
|
|
10
10
|
right: Lazy<IO<R1, E1, B>>,
|
11
11
|
leftWins: (winner: FiberRuntime<E, A>, loser: FiberRuntime<E1, B>) => IO<R2, E2, C>,
|
12
12
|
rightWins: (winner: FiberRuntime<E1, B>, loser: FiberRuntime<E, A>) => IO<R3, E3, D>,
|
13
|
+
leftScope: FiberScope | null = null,
|
14
|
+
rightScope: FiberScope | null = null,
|
13
15
|
__tsplusTrace?: string,
|
14
16
|
) {
|
15
17
|
return (left: IO<R, E, A>): IO<R | R1 | R2 | R3, E2 | E3, C | D> => {
|
@@ -29,8 +31,8 @@ export function raceFibersWith<R, E, A, R1, E1, B, R2, E2, C, R3, E3, D>(
|
|
29
31
|
}
|
30
32
|
|
31
33
|
const raceIndicator = new AtomicBoolean(true);
|
32
|
-
const leftFiber = IO.unsafeMakeChildFiber(left, parentState, parentRuntimeFlags,
|
33
|
-
const rightFiber = IO.unsafeMakeChildFiber(right0, parentState, parentRuntimeFlags,
|
34
|
+
const leftFiber = IO.unsafeMakeChildFiber(left, parentState, parentRuntimeFlags, leftScope, __tsplusTrace);
|
35
|
+
const rightFiber = IO.unsafeMakeChildFiber(right0, parentState, parentRuntimeFlags, rightScope, __tsplusTrace);
|
34
36
|
|
35
37
|
return IO.async((cb) => {
|
36
38
|
leftFiber.addObserver(() => complete(leftFiber, rightFiber, leftWins, raceIndicator, cb));
|
package/_src/IO/api/timeout.ts
CHANGED
@@ -3,7 +3,27 @@
|
|
3
3
|
*/
|
4
4
|
export function timeoutTo<A, B, B1>(duration: Lazy<Duration>, b: Lazy<B>, f: (a: A) => B1, __tsplusTrace?: string) {
|
5
5
|
return <R, E>(self: IO<R, E, A>): IO<R, E, B | B1> => {
|
6
|
-
return
|
6
|
+
return IO.fiberIdWith((parentFiberId) =>
|
7
|
+
self.raceFibersWith(
|
8
|
+
IO.sleep(duration).interruptible,
|
9
|
+
(winner, loser) =>
|
10
|
+
winner.await.flatMap((exit) =>
|
11
|
+
exit.match(
|
12
|
+
(cause) => loser.interruptAs(parentFiberId) > IO.refailCause(cause),
|
13
|
+
(a) => winner.inheritAll > loser.interruptAs(parentFiberId).as(f(a)),
|
14
|
+
),
|
15
|
+
),
|
16
|
+
(winner, loser) =>
|
17
|
+
winner.await.flatMap((exit) =>
|
18
|
+
exit.match(
|
19
|
+
(cause) => loser.interruptAs(parentFiberId) > IO.refailCause(cause),
|
20
|
+
() => winner.inheritAll > loser.interruptAs(parentFiberId).as(b),
|
21
|
+
),
|
22
|
+
),
|
23
|
+
null,
|
24
|
+
FiberScope.global,
|
25
|
+
),
|
26
|
+
);
|
7
27
|
};
|
8
28
|
}
|
9
29
|
|
package/_src/IO/api.ts
CHANGED
@@ -6,17 +6,8 @@ import type { RuntimeFlags } from "@fncts/io/RuntimeFlags";
|
|
6
6
|
|
7
7
|
import { IOError } from "@fncts/base/data/exceptions";
|
8
8
|
import { identity, pipe, tuple } from "@fncts/base/data/function";
|
9
|
-
import {
|
10
|
-
|
11
|
-
GenerateStackTrace,
|
12
|
-
OnSuccess,
|
13
|
-
OnSuccessAndFailure,
|
14
|
-
Sync,
|
15
|
-
UpdateRuntimeFlags,
|
16
|
-
YieldNow,
|
17
|
-
} from "@fncts/io/IO/definition";
|
18
|
-
import { Stateful } from "@fncts/io/IO/definition";
|
19
|
-
import { Fail, IO, SucceedNow } from "@fncts/io/IO/definition";
|
9
|
+
import { IOPrimitive,IOTag } from "@fncts/io/IO/definition";
|
10
|
+
import { IO } from "@fncts/io/IO/definition";
|
20
11
|
|
21
12
|
/**
|
22
13
|
* Imports an asynchronous side-effect into a `IO`
|
@@ -28,7 +19,11 @@ export function async<R, E, A>(
|
|
28
19
|
blockingOn: FiberId = FiberId.none,
|
29
20
|
__tsplusTrace?: string,
|
30
21
|
): IO<R, E, A> {
|
31
|
-
|
22
|
+
const io = new IOPrimitive(IOTag.Async) as any;
|
23
|
+
io.i0 = register;
|
24
|
+
io.i1 = () => blockingOn;
|
25
|
+
io.trace = __tsplusTrace;
|
26
|
+
return io;
|
32
27
|
}
|
33
28
|
|
34
29
|
/**
|
@@ -318,7 +313,11 @@ export function checkInterruptible<R, E, A>(
|
|
318
313
|
*/
|
319
314
|
export function flatMap<A, R1, E1, B>(f: (a: A) => IO<R1, E1, B>, __tsplusTrace?: string) {
|
320
315
|
return <R, E>(ma: IO<R, E, A>): IO<R | R1, E | E1, B> => {
|
321
|
-
|
316
|
+
const io = new IOPrimitive(IOTag.OnSuccess) as any;
|
317
|
+
io.i0 = ma;
|
318
|
+
io.i1 = f;
|
319
|
+
io.trace = __tsplusTrace;
|
320
|
+
return io;
|
322
321
|
};
|
323
322
|
}
|
324
323
|
|
@@ -369,7 +368,7 @@ export function condIO<R, R1, E, A>(
|
|
369
368
|
*
|
370
369
|
* @tsplus static fncts.io.IOOps defer
|
371
370
|
*/
|
372
|
-
export function defer<R, E, A>(io: Lazy<IO<R, E, A>>, __tsplusTrace?: string): IO<R, E, A> {
|
371
|
+
export function defer<R = never, E = never, A = never>(io: Lazy<IO<R, E, A>>, __tsplusTrace?: string): IO<R, E, A> {
|
373
372
|
return IO.succeed(io).flatMap(identity);
|
374
373
|
}
|
375
374
|
|
@@ -379,7 +378,10 @@ export function defer<R, E, A>(io: Lazy<IO<R, E, A>>, __tsplusTrace?: string): I
|
|
379
378
|
*
|
380
379
|
* @tsplus static fncts.io.IOOps deferTry
|
381
380
|
*/
|
382
|
-
export function deferTry<R, E
|
381
|
+
export function deferTry<R = never, E = never, A = never>(
|
382
|
+
io: () => IO<R, E, A>,
|
383
|
+
__tsplusTrace?: string,
|
384
|
+
): IO<R, unknown, A> {
|
383
385
|
return IO.defer(() => {
|
384
386
|
try {
|
385
387
|
return io();
|
@@ -463,7 +465,10 @@ export function failNow<E>(e: E, __tsplusTrace?: string): FIO<E, never> {
|
|
463
465
|
* @tsplus static fncts.io.IOOps refailCause
|
464
466
|
*/
|
465
467
|
export function refailCause<E>(cause: Cause<E>, __tsplusTrace?: string): FIO<E, never> {
|
466
|
-
|
468
|
+
const io = new IOPrimitive(IOTag.Fail) as any;
|
469
|
+
io.i0 = () => cause;
|
470
|
+
io.trace = __tsplusTrace;
|
471
|
+
return io;
|
467
472
|
}
|
468
473
|
|
469
474
|
/**
|
@@ -472,7 +477,10 @@ export function refailCause<E>(cause: Cause<E>, __tsplusTrace?: string): FIO<E,
|
|
472
477
|
* @tsplus static fncts.io.IOOps failCauseNow
|
473
478
|
*/
|
474
479
|
export function failCauseNow<E>(cause: Cause<E>, __tsplusTrace?: string): FIO<E, never> {
|
475
|
-
|
480
|
+
const io = new IOPrimitive(IOTag.Fail) as any;
|
481
|
+
io.i0 = () => cause;
|
482
|
+
io.trace = __tsplusTrace;
|
483
|
+
return io;
|
476
484
|
}
|
477
485
|
|
478
486
|
/**
|
@@ -1223,7 +1231,12 @@ export function matchCauseIO<E, A, R1, E1, A1, R2, E2, A2>(
|
|
1223
1231
|
__tsplusTrace?: string,
|
1224
1232
|
) {
|
1225
1233
|
return <R>(self: IO<R, E, A>): IO<R | R1 | R2, E1 | E2, A1 | A2> => {
|
1226
|
-
|
1234
|
+
const io = new IOPrimitive(IOTag.OnSuccessAndFailure) as any;
|
1235
|
+
io.i0 = self;
|
1236
|
+
io.i1 = onFailure;
|
1237
|
+
io.i2 = onSuccess;
|
1238
|
+
io.trace = __tsplusTrace;
|
1239
|
+
return io;
|
1227
1240
|
};
|
1228
1241
|
}
|
1229
1242
|
|
@@ -1664,7 +1677,10 @@ export function sequenceIterableDiscard<R, E, A>(as: Iterable<IO<R, E, A>>, __ts
|
|
1664
1677
|
* @tsplus static fncts.io.IOOps succeedNow
|
1665
1678
|
*/
|
1666
1679
|
export function succeedNow<A>(value: A, __tsplusTrace?: string): IO<never, never, A> {
|
1667
|
-
|
1680
|
+
const io = new IOPrimitive(IOTag.SucceedNow) as any;
|
1681
|
+
io.i0 = value;
|
1682
|
+
io.trace = __tsplusTrace;
|
1683
|
+
return io;
|
1668
1684
|
}
|
1669
1685
|
|
1670
1686
|
/**
|
@@ -1676,7 +1692,10 @@ export function succeedNow<A>(value: A, __tsplusTrace?: string): IO<never, never
|
|
1676
1692
|
* @tsplus static fncts.io.IOOps __call
|
1677
1693
|
*/
|
1678
1694
|
export function succeed<A>(effect: Lazy<A>, __tsplusTrace?: string): UIO<A> {
|
1679
|
-
|
1695
|
+
const io = new IOPrimitive(IOTag.Sync) as any;
|
1696
|
+
io.i0 = effect;
|
1697
|
+
io.trace = __tsplusTrace;
|
1698
|
+
return io;
|
1680
1699
|
}
|
1681
1700
|
|
1682
1701
|
/**
|
@@ -1721,17 +1740,42 @@ export function timedWith<R1, E1>(msTime: IO<R1, E1, number>, __tsplusTrace?: st
|
|
1721
1740
|
ma.summarized(msTime, (start, end) => end - start);
|
1722
1741
|
}
|
1723
1742
|
|
1743
|
+
/**
|
1744
|
+
* @tsplus static fncts.io.IOOps attempt
|
1745
|
+
*/
|
1746
|
+
export function attempt<A>(effect: Lazy<A>, __tsplusTrace?: string): FIO<unknown, A> {
|
1747
|
+
return IO.defer(() => {
|
1748
|
+
try {
|
1749
|
+
return Exit.succeed(effect());
|
1750
|
+
} catch (u) {
|
1751
|
+
return IO.withFiberRuntime((fiberState) => {
|
1752
|
+
if (!fiberState.isFatal(u)) {
|
1753
|
+
throw new IOError(Cause.fail(u));
|
1754
|
+
} else {
|
1755
|
+
throw u;
|
1756
|
+
}
|
1757
|
+
});
|
1758
|
+
}
|
1759
|
+
});
|
1760
|
+
}
|
1761
|
+
|
1724
1762
|
/**
|
1725
1763
|
* Creates a `IO` that has succeeded with a pure value
|
1726
1764
|
*
|
1727
1765
|
* @tsplus static fncts.io.IOOps tryCatch
|
1728
1766
|
*/
|
1729
1767
|
export function tryCatch<E, A>(effect: Lazy<A>, onThrow: (error: unknown) => E, __tsplusTrace?: string): FIO<E, A> {
|
1730
|
-
return IO.
|
1768
|
+
return IO.defer(() => {
|
1731
1769
|
try {
|
1732
|
-
return effect();
|
1770
|
+
return Exit.succeed(effect());
|
1733
1771
|
} catch (u) {
|
1734
|
-
|
1772
|
+
return IO.withFiberRuntime((fiberState) => {
|
1773
|
+
if (!fiberState.isFatal(u)) {
|
1774
|
+
throw new IOError(Cause.fail(u));
|
1775
|
+
} else {
|
1776
|
+
throw u;
|
1777
|
+
}
|
1778
|
+
});
|
1735
1779
|
}
|
1736
1780
|
});
|
1737
1781
|
}
|
@@ -1902,21 +1946,29 @@ export function withFiberRuntime<R, E, A>(
|
|
1902
1946
|
onState: (fiber: FiberRuntime<E, A>, status: Running) => IO<R, E, A>,
|
1903
1947
|
__tsplusTrace?: string,
|
1904
1948
|
): IO<R, E, A> {
|
1905
|
-
|
1949
|
+
const io = new IOPrimitive(IOTag.Stateful) as any;
|
1950
|
+
io.i0 = onState;
|
1951
|
+
io.trace = __tsplusTrace;
|
1952
|
+
return io;
|
1906
1953
|
}
|
1907
1954
|
|
1908
1955
|
/**
|
1909
1956
|
* @tsplus static fncts.io.IOOps updateRuntimeFlags
|
1910
1957
|
*/
|
1911
1958
|
export function updateRuntimeFlags(patch: RuntimeFlags.Patch, __tsplusTrace?: string): IO<never, never, void> {
|
1912
|
-
|
1959
|
+
const io = new IOPrimitive(IOTag.UpdateRuntimeFlags) as any;
|
1960
|
+
io.i0 = patch;
|
1961
|
+
io.trace = __tsplusTrace;
|
1962
|
+
return io;
|
1913
1963
|
}
|
1914
1964
|
|
1915
1965
|
/**
|
1916
1966
|
* @tsplus static fncts.io.IOOps stackTrace
|
1917
1967
|
*/
|
1918
1968
|
export function stackTrace(__tsplusTrace?: string): UIO<Trace> {
|
1919
|
-
|
1969
|
+
const io = new IOPrimitive(IOTag.GenerateStackTrace) as any;
|
1970
|
+
io.trace = __tsplusTrace;
|
1971
|
+
return io;
|
1920
1972
|
}
|
1921
1973
|
|
1922
1974
|
/**
|
@@ -1926,7 +1978,7 @@ export function stackTrace(__tsplusTrace?: string): UIO<Trace> {
|
|
1926
1978
|
*
|
1927
1979
|
* @tsplus static fncts.io.IOOps yieldNow
|
1928
1980
|
*/
|
1929
|
-
export const yieldNow: UIO<void> = new YieldNow
|
1981
|
+
export const yieldNow: UIO<void> = new IOPrimitive(IOTag.YieldNow) as any;
|
1930
1982
|
|
1931
1983
|
/**
|
1932
1984
|
* @tsplus pipeable fncts.io.IO zip
|