@fncts/io 0.0.17 → 0.0.19
Sign up to get free protection for your applications and to get access to all the features.
- package/Cached/internal.d.ts +1 -1
- package/CancellerState.d.ts +1 -1
- package/Channel/ChildExecutorDecision/definition.d.ts +1 -1
- package/Channel/UpstreamPullRequest/definition.d.ts +1 -1
- package/Channel/UpstreamPullStrategy/definition.d.ts +1 -1
- package/Channel/api/mergeAllWith.d.ts +1 -1
- package/Channel/internal/ChannelExecutor.d.ts +1 -1
- package/Channel/internal/ChannelState.d.ts +2 -2
- package/Channel/internal/MergeDecision.d.ts +1 -1
- package/Channel/internal/MergeState.d.ts +1 -1
- package/Channel/internal/SingleProducerAsyncInput.d.ts +1 -1
- package/Clock/definition.d.ts +1 -0
- package/Fiber/FiberContext.d.ts +22 -19
- package/Fiber/api/interruptAll.d.ts +1 -1
- package/Fiber/api/interruptAsFork.d.ts +8 -0
- package/Fiber/definition.d.ts +6 -8
- package/FiberRef/api.d.ts +7 -2
- package/FiberRef/definition.d.ts +4 -3
- package/FiberRef/unsafe.d.ts +18 -1
- package/FiberRefs/api.d.ts +5 -0
- package/FiberRefs/definition.d.ts +1 -1
- package/FiberState/definition.d.ts +2 -2
- package/FiberStatus/definition.d.ts +1 -1
- package/Future/definition.d.ts +1 -1
- package/Hub/definition.d.ts +1 -1
- package/IO/api/core-scope.d.ts +4 -3
- package/IO/api/interrupt.d.ts +2 -2
- package/IO/api/supervised.d.ts +10 -0
- package/IO/api.d.ts +7 -10
- package/IO/definition.d.ts +16 -139
- package/IO.d.ts +1 -0
- package/IOEnv/definition.d.ts +1 -1
- package/Layer/definition.d.ts +2 -2
- package/Ref/definition.d.ts +3 -3
- package/Reloadable/api.d.ts +21 -0
- package/Reloadable/constructors.d.ts +23 -0
- package/Reloadable/definition.d.ts +20 -0
- package/Reloadable.d.ts +3 -0
- package/RuntimeConfig.d.ts +1 -1
- package/STM/definition.d.ts +5 -5
- package/STM/internal/CommitState.d.ts +1 -1
- package/STM/internal/Entry.d.ts +2 -2
- package/STM/internal/Journal.d.ts +6 -6
- package/STM/internal/TryCommit.d.ts +2 -2
- package/STM/internal/Versioned.d.ts +1 -1
- package/Schedule/Decision.d.ts +1 -1
- package/Scope/ReleaseMap/definition.d.ts +1 -1
- package/Scope/definition.d.ts +2 -2
- package/ScopedRef/definition.d.ts +1 -1
- package/State/internal.d.ts +1 -1
- package/Stream/api.d.ts +1 -1
- package/Stream/definition.d.ts +1 -1
- package/Stream/internal/DebounceState.d.ts +4 -4
- package/Stream/internal/Handoff.d.ts +5 -5
- package/Stream/internal/Pull.d.ts +1 -1
- package/Stream/internal/SinkEndReason.d.ts +1 -1
- package/TExit/definition.d.ts +3 -3
- package/TReentrantLock/definition.d.ts +1 -1
- package/TRef/definition.d.ts +1 -1
- package/TxnId.d.ts +1 -1
- package/_cjs/Clock/definition.cjs +2 -1
- package/_cjs/Clock/definition.cjs.map +1 -1
- package/_cjs/Console/definition.cjs +1 -1
- package/_cjs/Console/definition.cjs.map +1 -1
- package/_cjs/Fiber/FiberContext.cjs +180 -310
- package/_cjs/Fiber/FiberContext.cjs.map +1 -1
- package/_cjs/Fiber/api/collectAll.cjs +2 -2
- package/_cjs/Fiber/api/collectAll.cjs.map +1 -1
- package/_cjs/Fiber/api/interrupt.cjs +4 -2
- package/_cjs/Fiber/api/interrupt.cjs.map +1 -1
- package/_cjs/Fiber/api/interruptAll.cjs +8 -8
- package/_cjs/Fiber/api/interruptAll.cjs.map +1 -1
- package/_cjs/Fiber/api/interruptAs.cjs +7 -1
- package/_cjs/Fiber/api/interruptAs.cjs.map +1 -1
- package/_cjs/Fiber/api/interruptAsFork.cjs +15 -0
- package/_cjs/Fiber/api/interruptAsFork.cjs.map +1 -0
- package/_cjs/Fiber/api/interruptFork.cjs +5 -5
- package/_cjs/Fiber/api/interruptFork.cjs.map +1 -1
- package/_cjs/Fiber/definition.cjs +2 -2
- package/_cjs/Fiber/definition.cjs.map +1 -1
- package/_cjs/FiberRef/api.cjs +29 -10
- package/_cjs/FiberRef/api.cjs.map +1 -1
- package/_cjs/FiberRef/definition.cjs +2 -1
- package/_cjs/FiberRef/definition.cjs.map +1 -1
- package/_cjs/FiberRef/unsafe.cjs +29 -5
- package/_cjs/FiberRef/unsafe.cjs.map +1 -1
- package/_cjs/FiberRefs/api.cjs +28 -2
- package/_cjs/FiberRefs/api.cjs.map +1 -1
- package/_cjs/FiberRefs/join.cjs +1 -1
- package/_cjs/FiberRefs/join.cjs.map +1 -1
- package/_cjs/IO/api/core-scope.cjs +23 -15
- package/_cjs/IO/api/core-scope.cjs.map +1 -1
- package/_cjs/IO/api/ensuringChildren.cjs +4 -2
- package/_cjs/IO/api/ensuringChildren.cjs.map +1 -1
- package/_cjs/IO/api/interrupt.cjs +21 -11
- package/_cjs/IO/api/interrupt.cjs.map +1 -1
- package/_cjs/IO/api/supervised.cjs +26 -0
- package/_cjs/IO/api/supervised.cjs.map +1 -0
- package/_cjs/IO/api/withChildren.cjs +4 -2
- package/_cjs/IO/api/withChildren.cjs.map +1 -1
- package/_cjs/IO/api/zipC.cjs +10 -8
- package/_cjs/IO/api/zipC.cjs.map +1 -1
- package/_cjs/IO/api.cjs +67 -63
- package/_cjs/IO/api.cjs.map +1 -1
- package/_cjs/IO/definition.cjs +8 -226
- package/_cjs/IO/definition.cjs.map +1 -1
- package/_cjs/IO/runtime.cjs +7 -9
- package/_cjs/IO/runtime.cjs.map +1 -1
- package/_cjs/IO.cjs +13 -0
- package/_cjs/IO.cjs.map +1 -1
- package/_cjs/Layer/api.cjs +1 -1
- package/_cjs/Layer/api.cjs.map +1 -1
- package/_cjs/Random/definition.cjs +1 -1
- package/_cjs/Random/definition.cjs.map +1 -1
- package/_cjs/Reloadable/api.cjs +46 -0
- package/_cjs/Reloadable/api.cjs.map +1 -0
- package/_cjs/Reloadable/constructors.cjs +82 -0
- package/_cjs/Reloadable/constructors.cjs.map +1 -0
- package/_cjs/Reloadable/definition.cjs +58 -0
- package/_cjs/Reloadable/definition.cjs.map +1 -0
- package/_cjs/Reloadable.cjs +45 -0
- package/_cjs/Reloadable.cjs.map +1 -0
- package/_cjs/Scope/definition.cjs +1 -1
- package/_cjs/Scope/definition.cjs.map +1 -1
- package/_cjs/internal/IsFatal.cjs +129 -0
- package/_cjs/internal/IsFatal.cjs.map +1 -0
- package/_mjs/Clock/definition.mjs +2 -1
- package/_mjs/Clock/definition.mjs.map +1 -1
- package/_mjs/Console/definition.mjs +1 -1
- package/_mjs/Console/definition.mjs.map +1 -1
- package/_mjs/Fiber/FiberContext.mjs +180 -309
- package/_mjs/Fiber/FiberContext.mjs.map +1 -1
- package/_mjs/Fiber/api/collectAll.mjs +2 -2
- package/_mjs/Fiber/api/collectAll.mjs.map +1 -1
- package/_mjs/Fiber/api/interrupt.mjs +3 -2
- package/_mjs/Fiber/api/interrupt.mjs.map +1 -1
- package/_mjs/Fiber/api/interruptAll.mjs +6 -6
- package/_mjs/Fiber/api/interruptAll.mjs.map +1 -1
- package/_mjs/Fiber/api/interruptAs.mjs +3 -1
- package/_mjs/Fiber/api/interruptAs.mjs.map +1 -1
- package/_mjs/Fiber/api/interruptAsFork.mjs +8 -0
- package/_mjs/Fiber/api/interruptAsFork.mjs.map +1 -0
- package/_mjs/Fiber/api/interruptFork.mjs +5 -4
- package/_mjs/Fiber/api/interruptFork.mjs.map +1 -1
- package/_mjs/Fiber/definition.mjs +2 -2
- package/_mjs/Fiber/definition.mjs.map +1 -1
- package/_mjs/FiberRef/api.mjs +26 -9
- package/_mjs/FiberRef/api.mjs.map +1 -1
- package/_mjs/FiberRef/definition.mjs +2 -1
- package/_mjs/FiberRef/definition.mjs.map +1 -1
- package/_mjs/FiberRef/unsafe.mjs +23 -4
- package/_mjs/FiberRef/unsafe.mjs.map +1 -1
- package/_mjs/FiberRefs/api.mjs +22 -1
- package/_mjs/FiberRefs/api.mjs.map +1 -1
- package/_mjs/FiberRefs/join.mjs +1 -1
- package/_mjs/FiberRefs/join.mjs.map +1 -1
- package/_mjs/IO/api/core-scope.mjs +21 -16
- package/_mjs/IO/api/core-scope.mjs.map +1 -1
- package/_mjs/IO/api/ensuringChildren.mjs +3 -2
- package/_mjs/IO/api/ensuringChildren.mjs.map +1 -1
- package/_mjs/IO/api/interrupt.mjs +18 -9
- package/_mjs/IO/api/interrupt.mjs.map +1 -1
- package/_mjs/IO/api/supervised.mjs +14 -0
- package/_mjs/IO/api/supervised.mjs.map +1 -0
- package/_mjs/IO/api/withChildren.mjs +3 -2
- package/_mjs/IO/api/withChildren.mjs.map +1 -1
- package/_mjs/IO/api/zipC.mjs +9 -8
- package/_mjs/IO/api/zipC.mjs.map +1 -1
- package/_mjs/IO/api.mjs +66 -60
- package/_mjs/IO/api.mjs.map +1 -1
- package/_mjs/IO/definition.mjs +5 -184
- package/_mjs/IO/definition.mjs.map +1 -1
- package/_mjs/IO/runtime.mjs +7 -8
- package/_mjs/IO/runtime.mjs.map +1 -1
- package/_mjs/IO.mjs +1 -0
- package/_mjs/IO.mjs.map +1 -1
- package/_mjs/Layer/api.mjs +1 -1
- package/_mjs/Layer/api.mjs.map +1 -1
- package/_mjs/Random/definition.mjs +1 -1
- package/_mjs/Random/definition.mjs.map +1 -1
- package/_mjs/Reloadable/api.mjs +30 -0
- package/_mjs/Reloadable/api.mjs.map +1 -0
- package/_mjs/Reloadable/constructors.mjs +55 -0
- package/_mjs/Reloadable/constructors.mjs.map +1 -0
- package/_mjs/Reloadable/definition.mjs +40 -0
- package/_mjs/Reloadable/definition.mjs.map +1 -0
- package/_mjs/Reloadable.mjs +5 -0
- package/_mjs/Reloadable.mjs.map +1 -0
- package/_mjs/Scope/definition.mjs +1 -1
- package/_mjs/Scope/definition.mjs.map +1 -1
- package/_mjs/internal/IsFatal.mjs +104 -0
- package/_mjs/internal/IsFatal.mjs.map +1 -0
- package/_src/Clock/definition.ts +1 -0
- package/_src/Fiber/FiberContext.ts +50 -135
- package/_src/Fiber/api/collectAll.ts +1 -4
- package/_src/Fiber/api/interruptAll.ts +2 -2
- package/_src/Fiber/api/interruptAs.ts +1 -1
- package/_src/Fiber/api/interruptAsFork.ts +7 -0
- package/_src/Fiber/api/interruptFork.ts +1 -1
- package/_src/Fiber/definition.ts +3 -5
- package/_src/FiberRef/api.ts +30 -7
- package/_src/FiberRef/definition.ts +1 -0
- package/_src/FiberRef/unsafe.ts +27 -3
- package/_src/FiberRefs/api.ts +16 -0
- package/_src/FiberRefs/join.ts +1 -1
- package/_src/IO/api/core-scope.ts +12 -10
- package/_src/IO/api/interrupt.ts +8 -3
- package/_src/IO/api/supervised.ts +14 -0
- package/_src/IO/api.ts +25 -26
- package/_src/IO/definition.ts +8 -158
- package/_src/IO/runtime.ts +7 -11
- package/_src/IO.ts +1 -0
- package/_src/Reloadable/api.ts +28 -0
- package/_src/Reloadable/constructors.ts +60 -0
- package/_src/Reloadable/definition.ts +34 -0
- package/_src/Reloadable.ts +5 -0
- package/_src/internal/IsFatal.ts +79 -0
- package/internal/IsFatal.d.ts +47 -0
- package/package.json +4 -4
@@ -0,0 +1,104 @@
|
|
1
|
+
export const IsFatalTypeId = /*#__PURE__*/Symbol.for("fncts.io.IsFatal");
|
2
|
+
/**
|
3
|
+
* @tsplus type fncts.io.IsFatal
|
4
|
+
* @tsplus companion fncts.io.IsFatalOps
|
5
|
+
*/
|
6
|
+
|
7
|
+
export class IsFatal {
|
8
|
+
constructor() {
|
9
|
+
this._typeId = IsFatalTypeId;
|
10
|
+
}
|
11
|
+
|
12
|
+
apply(t) {
|
13
|
+
concrete(this);
|
14
|
+
|
15
|
+
switch (this._tag) {
|
16
|
+
case 0
|
17
|
+
/* IsFatalTag.Single */
|
18
|
+
:
|
19
|
+
return this.predicate(t);
|
20
|
+
|
21
|
+
case 1
|
22
|
+
/* IsFatalTag.Empty */
|
23
|
+
:
|
24
|
+
return false;
|
25
|
+
|
26
|
+
case 2
|
27
|
+
/* IsFatalTag.Both */
|
28
|
+
:
|
29
|
+
return this.left.apply(t) || this.right.apply(t);
|
30
|
+
}
|
31
|
+
}
|
32
|
+
|
33
|
+
}
|
34
|
+
export class Single extends IsFatal {
|
35
|
+
constructor(predicate) {
|
36
|
+
super();
|
37
|
+
this.predicate = predicate;
|
38
|
+
this._tag = 0
|
39
|
+
/* IsFatalTag.Single */
|
40
|
+
;
|
41
|
+
}
|
42
|
+
|
43
|
+
}
|
44
|
+
export class Empty extends IsFatal {
|
45
|
+
constructor() {
|
46
|
+
super(...arguments);
|
47
|
+
this._tag = 1
|
48
|
+
/* IsFatalTag.Empty */
|
49
|
+
;
|
50
|
+
}
|
51
|
+
|
52
|
+
}
|
53
|
+
export class Both extends IsFatal {
|
54
|
+
constructor(left, right) {
|
55
|
+
super();
|
56
|
+
this.left = left;
|
57
|
+
this.right = right;
|
58
|
+
this._tag = 2
|
59
|
+
/* IsFatalTag.Both */
|
60
|
+
;
|
61
|
+
}
|
62
|
+
|
63
|
+
}
|
64
|
+
|
65
|
+
function concrete(u) {//
|
66
|
+
}
|
67
|
+
/**
|
68
|
+
* @tsplus static fncts.io.IsFatalOps empty
|
69
|
+
*/
|
70
|
+
|
71
|
+
|
72
|
+
export const empty = /*#__PURE__*/new Empty();
|
73
|
+
/**
|
74
|
+
* @tsplus static fncts.io.IsFatalOps __call
|
75
|
+
*/
|
76
|
+
|
77
|
+
export function makeIsFatal(predicate) {
|
78
|
+
return new Single(predicate);
|
79
|
+
}
|
80
|
+
/**
|
81
|
+
* @tsplus static fncts.io.IsFatalOps both
|
82
|
+
* @tsplus fluent fncts.io.IsFatal both
|
83
|
+
* @tsplus operator fncts.io.IsFatal |
|
84
|
+
*/
|
85
|
+
|
86
|
+
export function both(left, right) {
|
87
|
+
concrete(left);
|
88
|
+
concrete(right);
|
89
|
+
|
90
|
+
if (left._tag === 1
|
91
|
+
/* IsFatalTag.Empty */
|
92
|
+
) {
|
93
|
+
return right;
|
94
|
+
}
|
95
|
+
|
96
|
+
if (right._tag === 1
|
97
|
+
/* IsFatalTag.Empty */
|
98
|
+
) {
|
99
|
+
return left;
|
100
|
+
}
|
101
|
+
|
102
|
+
return new Both(left, right);
|
103
|
+
}
|
104
|
+
//# sourceMappingURL=IsFatal.mjs.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"IsFatal.mjs","mappings":"AAMA,OAAO,MAAMA,aAAa,gBAAGC,MAAM,CAACC,GAAP,CAAW,kBAAX,CAAtB;AAGP;;;;;AAIA,OAAM,MAAgBC,OAAhB,CAAuB;EAA7BC;IACW,eAAyBJ,aAAzB;EAaV;;EAXCK,KAAK,CAACC,CAAD,EAAW;IACdC,QAAQ,CAAC,IAAD,CAAR;;IACA,QAAQ,KAAKC,IAAb;MACE;MAAA;MAAA;QACE,OAAO,KAAKC,SAAL,CAAeH,CAAf,CAAP;;MACF;MAAA;MAAA;QACE,OAAO,KAAP;;MACF;MAAA;MAAA;QACE,OAAO,KAAKI,IAAL,CAAUL,KAAV,CAAgBC,CAAhB,KAAsB,KAAKK,KAAL,CAAWN,KAAX,CAAiBC,CAAjB,CAA7B;IANJ;EAQD;;AAb0B;AAgB7B,OAAM,MAAOM,MAAP,SAAsBT,OAAtB,CAA6B;EAEjCC,YAAqBK,SAArB,EAAkD;IAChD;IADmB;IADZ,YAAI;IAAA;IAAJ;EAGR;;AAJgC;AAOnC,OAAM,MAAOI,KAAP,SAAqBV,OAArB,CAA4B;EAAlCC;;IACW,YAAI;IAAA;IAAJ;EACV;;AAFiC;AAIlC,OAAM,MAAOU,IAAP,SAAoBX,OAApB,CAA2B;EAE/BC,YAAqBM,IAArB,EAA6CC,KAA7C,EAA2D;IACzD;IADmB;IAAwB;IADpC,YAAI;IAAA;IAAJ;EAGR;;AAJ8B;;AAOjC,SAASJ,QAAT,CAAkBQ,CAAlB,EAA4B,CAC1B;AACD;AAED;;;;;AAGA,OAAO,MAAMC,KAAK,gBAAY,IAAIH,KAAJ,EAAvB;AAEP;;;;AAGA,OAAM,SAAUI,WAAV,CAAsBR,SAAtB,EAAmD;EACvD,OAAO,IAAIG,MAAJ,CAAWH,SAAX,CAAP;AACD;AAED;;;;;;AAKA,OAAM,SAAUS,IAAV,CAAeR,IAAf,EAA8BC,KAA9B,EAA4C;EAChDJ,QAAQ,CAACG,IAAD,CAAR;EACAH,QAAQ,CAACI,KAAD,CAAR;;EACA,IAAID,IAAI,CAACF,IAAL,KAAS;EAAA;EAAb,EAAoC;IAClC,OAAOG,KAAP;EACD;;EACD,IAAIA,KAAK,CAACH,IAAN,KAAU;EAAA;EAAd,EAAqC;IACnC,OAAOE,IAAP;EACD;;EACD,OAAO,IAAII,IAAJ,CAASJ,IAAT,EAAeC,KAAf,CAAP;AACD","names":["IsFatalTypeId","Symbol","for","IsFatal","constructor","apply","t","concrete","_tag","predicate","left","right","Single","Empty","Both","u","empty","makeIsFatal","both"],"sourceRoot":"","sources":["../../_src/internal/IsFatal.ts"],"sourcesContent":[null]}
|
package/_src/Clock/definition.ts
CHANGED
@@ -8,11 +8,10 @@ import { CancellerState } from "@fncts/io/CancellerState";
|
|
8
8
|
import { FiberTypeId, isFiber } from "@fncts/io/Fiber/definition";
|
9
9
|
import { FiberState } from "@fncts/io/FiberState";
|
10
10
|
import { FiberStatus, FiberStatusTag } from "@fncts/io/FiberStatus";
|
11
|
-
import { defaultScheduler } from "@fncts/io/internal/Scheduler";
|
12
11
|
import { StackTraceBuilder } from "@fncts/io/internal/StackTraceBuilder";
|
13
12
|
import { concrete, IOTag, isIOError } from "@fncts/io/IO/definition";
|
14
13
|
|
15
|
-
export type FiberRefLocals =
|
14
|
+
export type FiberRefLocals = HashMap<FiberRef<unknown>, Cons<readonly [FiberId.Runtime, unknown]>>;
|
16
15
|
|
17
16
|
type Erased = IO<any, any, any>;
|
18
17
|
type ErasedCont = (a: any) => Erased;
|
@@ -73,16 +72,15 @@ export class FiberContext<E, A> implements Fiber.Runtime<E, A>, Hashable, Equata
|
|
73
72
|
private asyncEpoch = 0 | 0;
|
74
73
|
private stack = Stack<Frame>();
|
75
74
|
nextIO: Instruction | null = null;
|
76
|
-
private currentSupervisor: Supervisor<any>;
|
77
75
|
|
78
76
|
constructor(
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
77
|
+
readonly fiberId: FiberId.Runtime,
|
78
|
+
public runtimeConfig: RuntimeConfig,
|
79
|
+
public interruptStatus: Stack<boolean>,
|
80
|
+
public fiberRefLocals: FiberRefLocals,
|
83
81
|
private readonly _children: Set<FiberContext<unknown, unknown>>,
|
84
82
|
) {
|
85
|
-
this.currentSupervisor
|
83
|
+
this.unsafeSetRef(FiberRef.currentSupervisor, this.runtimeConfig.supervisor);
|
86
84
|
}
|
87
85
|
|
88
86
|
get poll() {
|
@@ -91,7 +89,7 @@ export class FiberContext<E, A> implements Fiber.Runtime<E, A>, Hashable, Equata
|
|
91
89
|
|
92
90
|
get inheritRefs(): UIO<void> {
|
93
91
|
return IO.defer(() => {
|
94
|
-
const childFiberRefLocals = this.fiberRefLocals
|
92
|
+
const childFiberRefLocals = this.fiberRefLocals;
|
95
93
|
if (childFiberRefLocals.isEmpty) {
|
96
94
|
return IO.unit;
|
97
95
|
} else {
|
@@ -142,6 +140,10 @@ export class FiberContext<E, A> implements Fiber.Runtime<E, A>, Hashable, Equata
|
|
142
140
|
});
|
143
141
|
}
|
144
142
|
|
143
|
+
get fiberRefs(): FiberRefs {
|
144
|
+
return FiberRefs(this.fiberRefLocals);
|
145
|
+
}
|
146
|
+
|
145
147
|
get await(): UIO<Exit<E, A>> {
|
146
148
|
return IO.asyncInterrupt((k): Either<UIO<void>, UIO<Exit<E, A>>> => {
|
147
149
|
const cb: FiberState.Callback<never, Exit<E, A>> = (x) => k(IO.fromExit(x));
|
@@ -171,7 +173,7 @@ export class FiberContext<E, A> implements Fiber.Runtime<E, A>, Hashable, Equata
|
|
171
173
|
}
|
172
174
|
|
173
175
|
interruptAs(fiberId: FiberId): UIO<Exit<E, A>> {
|
174
|
-
return this.
|
176
|
+
return this.interruptAsFork(fiberId).apSecond(this.await);
|
175
177
|
}
|
176
178
|
|
177
179
|
evalOn(effect: UIO<any>, orElse: UIO<any>): UIO<void> {
|
@@ -310,24 +312,13 @@ export class FiberContext<E, A> implements Fiber.Runtime<E, A>, Hashable, Equata
|
|
310
312
|
}
|
311
313
|
break;
|
312
314
|
}
|
315
|
+
|
313
316
|
case IOTag.Match: {
|
314
317
|
this.stack.push(current);
|
315
318
|
current = concrete(current.io);
|
316
319
|
break;
|
317
320
|
}
|
318
|
-
|
319
|
-
const boolFlag = current.flag.toBoolean;
|
320
|
-
if (this.unsafeIsInterruptible !== boolFlag) {
|
321
|
-
this.interruptStatus.push(current.flag.toBoolean);
|
322
|
-
this.unsafeRestoreInterruptStatus();
|
323
|
-
}
|
324
|
-
current = concrete(current.io);
|
325
|
-
break;
|
326
|
-
}
|
327
|
-
case IOTag.GetInterrupt: {
|
328
|
-
current = concrete(current.f(InterruptStatus.fromBoolean(this.unsafeIsInterruptible)));
|
329
|
-
break;
|
330
|
-
}
|
321
|
+
|
331
322
|
case IOTag.Async: {
|
332
323
|
const trace = current.trace;
|
333
324
|
|
@@ -372,10 +363,6 @@ export class FiberContext<E, A> implements Fiber.Runtime<E, A>, Hashable, Equata
|
|
372
363
|
);
|
373
364
|
break;
|
374
365
|
}
|
375
|
-
case IOTag.GetDescriptor: {
|
376
|
-
current = concrete(current.f(this.unsafeGetDescriptor()));
|
377
|
-
break;
|
378
|
-
}
|
379
366
|
case IOTag.Yield: {
|
380
367
|
current = null;
|
381
368
|
this.unsafeRunLater(concrete(IO.unit));
|
@@ -390,47 +377,8 @@ export class FiberContext<E, A> implements Fiber.Runtime<E, A>, Hashable, Equata
|
|
390
377
|
break;
|
391
378
|
}
|
392
379
|
|
393
|
-
case IOTag.
|
394
|
-
|
395
|
-
this.fiberRefLocals.set(newValue.fiberRefLocals);
|
396
|
-
current = this.unsafeNextEffect(result);
|
397
|
-
break;
|
398
|
-
}
|
399
|
-
|
400
|
-
case IOTag.FiberRefModify: {
|
401
|
-
const c = current;
|
402
|
-
const [result, newValue] = current.f(this.unsafeGetRef(current.fiberRef));
|
403
|
-
this.unsafeSetRef(c.fiberRef, newValue);
|
404
|
-
current = this.unsafeNextEffect(result);
|
405
|
-
break;
|
406
|
-
}
|
407
|
-
|
408
|
-
case IOTag.FiberRefLocally: {
|
409
|
-
const oldValue = this.unsafeGetRef(current.fiberRef);
|
410
|
-
const fiberRef = current.fiberRef;
|
411
|
-
this.unsafeSetRef(fiberRef, current.localValue);
|
412
|
-
this.unsafeAddFinalizer(
|
413
|
-
IO.succeed(() => {
|
414
|
-
this.unsafeSetRef(fiberRef, oldValue);
|
415
|
-
}),
|
416
|
-
);
|
417
|
-
current = concrete(current.io);
|
418
|
-
break;
|
419
|
-
}
|
420
|
-
|
421
|
-
case IOTag.FiberRefDelete: {
|
422
|
-
this.unsafeDeleteRef(current.fiberRef);
|
423
|
-
current = this.unsafeNextEffect(undefined);
|
424
|
-
break;
|
425
|
-
}
|
426
|
-
|
427
|
-
case IOTag.FiberRefWith: {
|
428
|
-
current = concrete(current.f(this.unsafeGetRef(current.fiberRef)));
|
429
|
-
break;
|
430
|
-
}
|
431
|
-
|
432
|
-
case IOTag.GetRuntimeConfig: {
|
433
|
-
current = concrete(current.f(this.runtimeConfig));
|
380
|
+
case IOTag.Stateful: {
|
381
|
+
current = concrete(current.onState(this, this.state.status));
|
434
382
|
break;
|
435
383
|
}
|
436
384
|
|
@@ -439,39 +387,6 @@ export class FiberContext<E, A> implements Fiber.Runtime<E, A>, Hashable, Equata
|
|
439
387
|
break;
|
440
388
|
}
|
441
389
|
|
442
|
-
case IOTag.Supervise: {
|
443
|
-
const oldSupervisor = this.currentSupervisor;
|
444
|
-
this.currentSupervisor = current.supervisor.zip(oldSupervisor);
|
445
|
-
this.unsafeAddFinalizer(
|
446
|
-
IO.succeed(() => {
|
447
|
-
this.currentSupervisor = oldSupervisor;
|
448
|
-
}),
|
449
|
-
);
|
450
|
-
current = concrete(current.io);
|
451
|
-
break;
|
452
|
-
}
|
453
|
-
|
454
|
-
case IOTag.GetForkScope: {
|
455
|
-
current = concrete(current.f(this.unsafeGetRef(FiberRef.forkScopeOverride).getOrElse(this.scope)));
|
456
|
-
break;
|
457
|
-
}
|
458
|
-
|
459
|
-
case IOTag.OverrideForkScope: {
|
460
|
-
const oldForkScopeOverride = this.unsafeGetRef(FiberRef.forkScopeOverride);
|
461
|
-
this.unsafeSetRef(FiberRef.forkScopeOverride, current.forkScope);
|
462
|
-
this.unsafeAddFinalizer(
|
463
|
-
IO.succeed(() => {
|
464
|
-
this.unsafeSetRef(FiberRef.forkScopeOverride, oldForkScopeOverride);
|
465
|
-
}),
|
466
|
-
);
|
467
|
-
current = concrete(current.io);
|
468
|
-
break;
|
469
|
-
}
|
470
|
-
case IOTag.Ensuring: {
|
471
|
-
this.unsafeAddFinalizer(current.finalizer);
|
472
|
-
current = concrete(current.io);
|
473
|
-
break;
|
474
|
-
}
|
475
390
|
case IOTag.Logged: {
|
476
391
|
this.unsafeLogWith(
|
477
392
|
current.message,
|
@@ -485,11 +400,6 @@ export class FiberContext<E, A> implements Fiber.Runtime<E, A>, Hashable, Equata
|
|
485
400
|
current = this.unsafeNextEffect(undefined);
|
486
401
|
break;
|
487
402
|
}
|
488
|
-
case IOTag.SetRuntimeConfig: {
|
489
|
-
this.runtimeConfig = current.runtimeConfig;
|
490
|
-
current = concrete(IO.unit);
|
491
|
-
break;
|
492
|
-
}
|
493
403
|
default: {
|
494
404
|
console.log("Unrecognized Instruction", current);
|
495
405
|
throw new Error("Unrecognized Instruction");
|
@@ -520,6 +430,8 @@ export class FiberContext<E, A> implements Fiber.Runtime<E, A>, Hashable, Equata
|
|
520
430
|
current = concrete(IO.failCauseNow(e.exit.cause, trace));
|
521
431
|
}
|
522
432
|
}
|
433
|
+
} else if (this.unsafeIsFatal(e)) {
|
434
|
+
this.unsafeHandleFatalError(e);
|
523
435
|
} else {
|
524
436
|
this.unsafeSetInterrupting(true);
|
525
437
|
current = concrete(IO.haltNow(e));
|
@@ -528,7 +440,7 @@ export class FiberContext<E, A> implements Fiber.Runtime<E, A>, Hashable, Equata
|
|
528
440
|
}
|
529
441
|
} finally {
|
530
442
|
currentFiber.set(null);
|
531
|
-
this.currentSupervisor
|
443
|
+
this.currentSupervisor.unsafeOnSuspend(this);
|
532
444
|
}
|
533
445
|
}
|
534
446
|
|
@@ -539,19 +451,19 @@ export class FiberContext<E, A> implements Fiber.Runtime<E, A>, Hashable, Equata
|
|
539
451
|
});
|
540
452
|
}
|
541
453
|
|
542
|
-
|
543
|
-
return this.fiberRefLocals
|
454
|
+
unsafeGetRef<A>(ref: FiberRef<A>): A {
|
455
|
+
return this.fiberRefLocals
|
544
456
|
.get(ref)
|
545
457
|
.map((_) => _.head[1])
|
546
458
|
.getOrElse(ref.initial) as A;
|
547
459
|
}
|
548
460
|
|
549
461
|
private unsafeGetRefs(fiberRefLocals: FiberRefLocals): HashMap<FiberRef<unknown>, unknown> {
|
550
|
-
return fiberRefLocals.
|
462
|
+
return fiberRefLocals.map((stack) => stack.head[1]);
|
551
463
|
}
|
552
464
|
|
553
|
-
|
554
|
-
const oldState = this.fiberRefLocals
|
465
|
+
unsafeSetRef<A>(ref: FiberRef<A>, value: A): void {
|
466
|
+
const oldState = this.fiberRefLocals;
|
555
467
|
const oldStack = oldState.get(ref).getOrElse(List.empty<readonly [FiberId.Runtime, unknown]>());
|
556
468
|
let newStack: Cons<readonly [FiberId.Runtime, unknown]>;
|
557
469
|
if (oldStack.isEmpty()) {
|
@@ -561,12 +473,12 @@ export class FiberContext<E, A> implements Fiber.Runtime<E, A>, Hashable, Equata
|
|
561
473
|
} else {
|
562
474
|
newStack = Cons([this.fiberId, value], oldStack);
|
563
475
|
}
|
564
|
-
const newState
|
565
|
-
this.fiberRefLocals
|
476
|
+
const newState = oldState.set(ref, newStack);
|
477
|
+
this.fiberRefLocals = newState;
|
566
478
|
}
|
567
479
|
|
568
|
-
|
569
|
-
this.fiberRefLocals
|
480
|
+
unsafeDeleteRef<A>(ref: FiberRef<A>): void {
|
481
|
+
this.fiberRefLocals = this.fiberRefLocals.remove(ref);
|
570
482
|
}
|
571
483
|
|
572
484
|
unsafePoll() {
|
@@ -592,7 +504,7 @@ export class FiberContext<E, A> implements Fiber.Runtime<E, A>, Hashable, Equata
|
|
592
504
|
}
|
593
505
|
});
|
594
506
|
|
595
|
-
|
507
|
+
unsafeAddFinalizer(finalizer: IO<any, never, any>): void {
|
596
508
|
this.stack.push(
|
597
509
|
new Finalizer(finalizer, (v) => {
|
598
510
|
this.unsafeDisableInterruption();
|
@@ -602,7 +514,7 @@ export class FiberContext<E, A> implements Fiber.Runtime<E, A>, Hashable, Equata
|
|
602
514
|
);
|
603
515
|
}
|
604
516
|
|
605
|
-
|
517
|
+
get unsafeIsInterruptible() {
|
606
518
|
return this.interruptStatus.hasNext ? this.interruptStatus.peek()! : true;
|
607
519
|
}
|
608
520
|
|
@@ -622,7 +534,7 @@ export class FiberContext<E, A> implements Fiber.Runtime<E, A>, Hashable, Equata
|
|
622
534
|
this.interruptStatus.push(false);
|
623
535
|
}
|
624
536
|
|
625
|
-
|
537
|
+
unsafeRestoreInterruptStatus(): void {
|
626
538
|
this.stack.push(this.interruptExit);
|
627
539
|
}
|
628
540
|
|
@@ -724,9 +636,9 @@ export class FiberContext<E, A> implements Fiber.Runtime<E, A>, Hashable, Equata
|
|
724
636
|
}
|
725
637
|
}
|
726
638
|
|
727
|
-
|
639
|
+
interruptAsFork(fiberId: FiberId): UIO<void> {
|
728
640
|
const interruptedCause = Cause.interrupt(fiberId);
|
729
|
-
return IO
|
641
|
+
return IO(() => {
|
730
642
|
const oldState = this.state;
|
731
643
|
if (
|
732
644
|
this.state._tag === "Executing" &&
|
@@ -745,7 +657,6 @@ export class FiberContext<E, A> implements Fiber.Runtime<E, A>, Hashable, Equata
|
|
745
657
|
this.state.interruptors.add(fiberId);
|
746
658
|
this.state.suppressed = newCause;
|
747
659
|
}
|
748
|
-
return this.await;
|
749
660
|
});
|
750
661
|
}
|
751
662
|
|
@@ -890,15 +801,7 @@ export class FiberContext<E, A> implements Fiber.Runtime<E, A>, Hashable, Equata
|
|
890
801
|
): FiberContext<any, any> {
|
891
802
|
const childId = FiberId.unsafeMake(TraceElement.parse(trace));
|
892
803
|
|
893
|
-
const childFiberRefLocals = this.
|
894
|
-
const oldValue = stack.head[1];
|
895
|
-
const newValue = fiberRef.patch(fiberRef.fork)(oldValue);
|
896
|
-
if (oldValue === newValue) {
|
897
|
-
return stack;
|
898
|
-
} else {
|
899
|
-
return Cons([childId, newValue], stack);
|
900
|
-
}
|
901
|
-
});
|
804
|
+
const childFiberRefLocals = this.fiberRefs.forkAs(childId).fiberRefLocals;
|
902
805
|
|
903
806
|
const parentScope: FiberScope = forkScope
|
904
807
|
.orElse(this.unsafeGetRef(FiberRef.forkScopeOverride))
|
@@ -910,7 +813,7 @@ export class FiberContext<E, A> implements Fiber.Runtime<E, A>, Hashable, Equata
|
|
910
813
|
childId,
|
911
814
|
this.runtimeConfig,
|
912
815
|
Stack.single(this.unsafeIsInterruptible),
|
913
|
-
|
816
|
+
childFiberRefLocals,
|
914
817
|
grandChildren,
|
915
818
|
);
|
916
819
|
|
@@ -958,7 +861,7 @@ export class FiberContext<E, A> implements Fiber.Runtime<E, A>, Hashable, Equata
|
|
958
861
|
}
|
959
862
|
}
|
960
863
|
|
961
|
-
|
864
|
+
unsafeGetDescriptor() {
|
962
865
|
return new FiberDescriptor(
|
963
866
|
this.fiberId,
|
964
867
|
this.state.status,
|
@@ -1056,7 +959,7 @@ export class FiberContext<E, A> implements Fiber.Runtime<E, A>, Hashable, Equata
|
|
1056
959
|
logLevel,
|
1057
960
|
message,
|
1058
961
|
Cause.empty(),
|
1059
|
-
this.fiberRefLocals
|
962
|
+
this.fiberRefLocals,
|
1060
963
|
spans,
|
1061
964
|
annotations,
|
1062
965
|
);
|
@@ -1087,7 +990,7 @@ export class FiberContext<E, A> implements Fiber.Runtime<E, A>, Hashable, Equata
|
|
1087
990
|
}
|
1088
991
|
contextMap = map;
|
1089
992
|
} else {
|
1090
|
-
contextMap = this.fiberRefLocals
|
993
|
+
contextMap = this.fiberRefLocals;
|
1091
994
|
}
|
1092
995
|
|
1093
996
|
this.runtimeConfig.logger.log(
|
@@ -1101,4 +1004,16 @@ export class FiberContext<E, A> implements Fiber.Runtime<E, A>, Hashable, Equata
|
|
1101
1004
|
annotations,
|
1102
1005
|
);
|
1103
1006
|
}
|
1007
|
+
|
1008
|
+
private unsafeIsFatal(t: unknown): boolean {
|
1009
|
+
return this.unsafeGetRef(FiberRef.currentIsFatal).apply(t);
|
1010
|
+
}
|
1011
|
+
|
1012
|
+
private unsafeHandleFatalError(t: unknown): never {
|
1013
|
+
return this.unsafeGetRef(FiberRef.currentReportFatal)(t);
|
1014
|
+
}
|
1015
|
+
|
1016
|
+
get currentSupervisor(): Supervisor<any> {
|
1017
|
+
return this.unsafeGetRef(FiberRef.currentSupervisor);
|
1018
|
+
}
|
1104
1019
|
}
|
@@ -27,9 +27,6 @@ export function sequenceIterable<E, A>(
|
|
27
27
|
),
|
28
28
|
),
|
29
29
|
),
|
30
|
-
(fiberId) =>
|
31
|
-
IO.foreach(fibers, (fiber) => fiber.interruptAs(fiberId)).map((exits) =>
|
32
|
-
exits.foldRight(Exit.succeed(Conc.empty()), (a, b) => a.zipWithCause(b, (a, b) => b.append(a), Cause.then)),
|
33
|
-
),
|
30
|
+
(fiberId) => IO.foreachDiscard(fibers, (fiber) => fiber.interruptAsFork(fiberId))
|
34
31
|
);
|
35
32
|
}
|
@@ -3,8 +3,8 @@
|
|
3
3
|
*
|
4
4
|
* @tsplus static fncts.io.FiberOps interruptAllAs
|
5
5
|
*/
|
6
|
-
export function
|
7
|
-
return
|
6
|
+
export function interruptAllAs(fs: Iterable<Fiber<any, any>>, id: FiberId, __tsplusTrace?: string): UIO<void> {
|
7
|
+
return IO.foreachDiscard(fs, fiber => fiber.interruptAsFork(id)) > IO.foreachDiscard(fs, fiber => fiber.await)
|
8
8
|
}
|
9
9
|
|
10
10
|
/**
|
package/_src/Fiber/definition.ts
CHANGED
@@ -40,11 +40,9 @@ export interface FiberCommon<E, A> extends Fiber<E, A> {
|
|
40
40
|
readonly inheritRefs: UIO<void>;
|
41
41
|
|
42
42
|
/**
|
43
|
-
* Interrupts the fiber as if interrupted from the specified fiber.
|
44
|
-
* fiber has already exited, the returned effect will resume immediately.
|
45
|
-
* Otherwise, the effect will resume when the fiber exits.
|
43
|
+
* Interrupts the fiber as if interrupted from the specified fiber.
|
46
44
|
*/
|
47
|
-
readonly
|
45
|
+
readonly interruptAsFork: (fiberId: FiberId) => UIO<void>;
|
48
46
|
|
49
47
|
/**
|
50
48
|
* Tentatively observes the fiber, but returns immediately if it is not already done.
|
@@ -107,7 +105,7 @@ export class SyntheticFiber<E, A> implements FiberCommon<E, A> {
|
|
107
105
|
readonly children: UIO<Conc<Fiber.Runtime<any, any>>>,
|
108
106
|
readonly inheritRefs: UIO<void>,
|
109
107
|
readonly poll: UIO<Maybe<Exit<E, A>>>,
|
110
|
-
readonly
|
108
|
+
readonly interruptAsFork: (fiberId: FiberId) => UIO<void>,
|
111
109
|
) {
|
112
110
|
this.await = wait;
|
113
111
|
}
|
package/_src/FiberRef/api.ts
CHANGED
@@ -1,13 +1,18 @@
|
|
1
1
|
import { identity } from "@fncts/base/data/function";
|
2
2
|
import { concrete } from "@fncts/io/FiberRef/definition";
|
3
|
-
import { FiberRefDelete, FiberRefLocally, FiberRefModify, FiberRefWith } from "@fncts/io/IO/definition";
|
4
3
|
|
5
4
|
/**
|
6
5
|
* @tsplus fluent fncts.io.FiberRef modify
|
7
6
|
*/
|
8
7
|
export function modify_<A, B>(self: FiberRef<A>, f: (a: A) => readonly [B, A], __tsplusTrace?: string): UIO<B> {
|
9
8
|
concrete(self);
|
10
|
-
return
|
9
|
+
return IO.withFiberContext((fiber) =>
|
10
|
+
IO(() => {
|
11
|
+
const [result, newValue] = f(fiber.unsafeGetRef(self));
|
12
|
+
fiber.unsafeSetRef(self, newValue);
|
13
|
+
return result;
|
14
|
+
}),
|
15
|
+
);
|
11
16
|
}
|
12
17
|
|
13
18
|
/**
|
@@ -60,9 +65,19 @@ export function getAndUpdateJust_<A>(fiberRef: FiberRef<A>, f: (a: A) => Maybe<A
|
|
60
65
|
* @tsplus fluent fncts.io.FiberRef locally
|
61
66
|
*/
|
62
67
|
export function locally_<A>(fiberRef: FiberRef<A>, value: A, __tsplusTrace?: string) {
|
63
|
-
return <R1, E1, B>(use: IO<R1, E1, B>): IO<R1, E1, B> =>
|
64
|
-
|
65
|
-
|
68
|
+
return <R1, E1, B>(use: IO<R1, E1, B>): IO<R1, E1, B> =>
|
69
|
+
IO.withFiberContext((fiber) =>
|
70
|
+
IO.defer(() => {
|
71
|
+
const oldValue = fiber.unsafeGetRef(fiberRef);
|
72
|
+
fiber.unsafeSetRef(fiberRef, value);
|
73
|
+
fiber.unsafeAddFinalizer(
|
74
|
+
IO(() => {
|
75
|
+
fiber.unsafeSetRef(fiberRef, oldValue);
|
76
|
+
}),
|
77
|
+
);
|
78
|
+
return use;
|
79
|
+
}),
|
80
|
+
);
|
66
81
|
}
|
67
82
|
|
68
83
|
/**
|
@@ -84,14 +99,14 @@ export function getWith_<A, R, E, B>(
|
|
84
99
|
f: (a: A) => IO<R, E, B>,
|
85
100
|
__tsplusTrace?: string,
|
86
101
|
): IO<R, E, B> {
|
87
|
-
return
|
102
|
+
return IO.withFiberContext((fiber) => f(fiber.unsafeGetRef(fiberRef)));
|
88
103
|
}
|
89
104
|
|
90
105
|
/**
|
91
106
|
* @tsplus getter fncts.io.FiberRef remove
|
92
107
|
*/
|
93
108
|
export function remove<A>(self: FiberRef<A>, __tsplusTrace?: string): UIO<void> {
|
94
|
-
return
|
109
|
+
return IO.withFiberContext((fiber) => IO(fiber.unsafeDeleteRef(self)));
|
95
110
|
}
|
96
111
|
|
97
112
|
/**
|
@@ -133,3 +148,11 @@ export function fork<Value, Patch>(self: FiberRef.WithPatch<Value, Patch>): Patc
|
|
133
148
|
concrete(self);
|
134
149
|
return self._fork;
|
135
150
|
}
|
151
|
+
|
152
|
+
/**
|
153
|
+
* @tsplus fluent fncts.io.FiberRef join
|
154
|
+
*/
|
155
|
+
export function join<Value, Patch>(self: FiberRef.WithPatch<Value, Patch>, oldValue: Value, newValue: Value): Value {
|
156
|
+
concrete(self);
|
157
|
+
return self._join(oldValue, newValue);
|
158
|
+
}
|
@@ -33,6 +33,7 @@ export class FiberRefInternal<Value, Patch> extends FiberRef<Value> implements H
|
|
33
33
|
readonly _combine: (first: Patch, second: Patch) => Patch,
|
34
34
|
readonly _patch: (patch: Patch) => (oldValue: Value) => Value,
|
35
35
|
readonly _fork: Patch,
|
36
|
+
readonly _join: (oldValue: Value, newValue: Value) => Value,
|
36
37
|
) {
|
37
38
|
super();
|
38
39
|
}
|