@fncts/io 0.0.17 → 0.0.19

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 (219) hide show
  1. package/Cached/internal.d.ts +1 -1
  2. package/CancellerState.d.ts +1 -1
  3. package/Channel/ChildExecutorDecision/definition.d.ts +1 -1
  4. package/Channel/UpstreamPullRequest/definition.d.ts +1 -1
  5. package/Channel/UpstreamPullStrategy/definition.d.ts +1 -1
  6. package/Channel/api/mergeAllWith.d.ts +1 -1
  7. package/Channel/internal/ChannelExecutor.d.ts +1 -1
  8. package/Channel/internal/ChannelState.d.ts +2 -2
  9. package/Channel/internal/MergeDecision.d.ts +1 -1
  10. package/Channel/internal/MergeState.d.ts +1 -1
  11. package/Channel/internal/SingleProducerAsyncInput.d.ts +1 -1
  12. package/Clock/definition.d.ts +1 -0
  13. package/Fiber/FiberContext.d.ts +22 -19
  14. package/Fiber/api/interruptAll.d.ts +1 -1
  15. package/Fiber/api/interruptAsFork.d.ts +8 -0
  16. package/Fiber/definition.d.ts +6 -8
  17. package/FiberRef/api.d.ts +7 -2
  18. package/FiberRef/definition.d.ts +4 -3
  19. package/FiberRef/unsafe.d.ts +18 -1
  20. package/FiberRefs/api.d.ts +5 -0
  21. package/FiberRefs/definition.d.ts +1 -1
  22. package/FiberState/definition.d.ts +2 -2
  23. package/FiberStatus/definition.d.ts +1 -1
  24. package/Future/definition.d.ts +1 -1
  25. package/Hub/definition.d.ts +1 -1
  26. package/IO/api/core-scope.d.ts +4 -3
  27. package/IO/api/interrupt.d.ts +2 -2
  28. package/IO/api/supervised.d.ts +10 -0
  29. package/IO/api.d.ts +7 -10
  30. package/IO/definition.d.ts +16 -139
  31. package/IO.d.ts +1 -0
  32. package/IOEnv/definition.d.ts +1 -1
  33. package/Layer/definition.d.ts +2 -2
  34. package/Ref/definition.d.ts +3 -3
  35. package/Reloadable/api.d.ts +21 -0
  36. package/Reloadable/constructors.d.ts +23 -0
  37. package/Reloadable/definition.d.ts +20 -0
  38. package/Reloadable.d.ts +3 -0
  39. package/RuntimeConfig.d.ts +1 -1
  40. package/STM/definition.d.ts +5 -5
  41. package/STM/internal/CommitState.d.ts +1 -1
  42. package/STM/internal/Entry.d.ts +2 -2
  43. package/STM/internal/Journal.d.ts +6 -6
  44. package/STM/internal/TryCommit.d.ts +2 -2
  45. package/STM/internal/Versioned.d.ts +1 -1
  46. package/Schedule/Decision.d.ts +1 -1
  47. package/Scope/ReleaseMap/definition.d.ts +1 -1
  48. package/Scope/definition.d.ts +2 -2
  49. package/ScopedRef/definition.d.ts +1 -1
  50. package/State/internal.d.ts +1 -1
  51. package/Stream/api.d.ts +1 -1
  52. package/Stream/definition.d.ts +1 -1
  53. package/Stream/internal/DebounceState.d.ts +4 -4
  54. package/Stream/internal/Handoff.d.ts +5 -5
  55. package/Stream/internal/Pull.d.ts +1 -1
  56. package/Stream/internal/SinkEndReason.d.ts +1 -1
  57. package/TExit/definition.d.ts +3 -3
  58. package/TReentrantLock/definition.d.ts +1 -1
  59. package/TRef/definition.d.ts +1 -1
  60. package/TxnId.d.ts +1 -1
  61. package/_cjs/Clock/definition.cjs +2 -1
  62. package/_cjs/Clock/definition.cjs.map +1 -1
  63. package/_cjs/Console/definition.cjs +1 -1
  64. package/_cjs/Console/definition.cjs.map +1 -1
  65. package/_cjs/Fiber/FiberContext.cjs +180 -310
  66. package/_cjs/Fiber/FiberContext.cjs.map +1 -1
  67. package/_cjs/Fiber/api/collectAll.cjs +2 -2
  68. package/_cjs/Fiber/api/collectAll.cjs.map +1 -1
  69. package/_cjs/Fiber/api/interrupt.cjs +4 -2
  70. package/_cjs/Fiber/api/interrupt.cjs.map +1 -1
  71. package/_cjs/Fiber/api/interruptAll.cjs +8 -8
  72. package/_cjs/Fiber/api/interruptAll.cjs.map +1 -1
  73. package/_cjs/Fiber/api/interruptAs.cjs +7 -1
  74. package/_cjs/Fiber/api/interruptAs.cjs.map +1 -1
  75. package/_cjs/Fiber/api/interruptAsFork.cjs +15 -0
  76. package/_cjs/Fiber/api/interruptAsFork.cjs.map +1 -0
  77. package/_cjs/Fiber/api/interruptFork.cjs +5 -5
  78. package/_cjs/Fiber/api/interruptFork.cjs.map +1 -1
  79. package/_cjs/Fiber/definition.cjs +2 -2
  80. package/_cjs/Fiber/definition.cjs.map +1 -1
  81. package/_cjs/FiberRef/api.cjs +29 -10
  82. package/_cjs/FiberRef/api.cjs.map +1 -1
  83. package/_cjs/FiberRef/definition.cjs +2 -1
  84. package/_cjs/FiberRef/definition.cjs.map +1 -1
  85. package/_cjs/FiberRef/unsafe.cjs +29 -5
  86. package/_cjs/FiberRef/unsafe.cjs.map +1 -1
  87. package/_cjs/FiberRefs/api.cjs +28 -2
  88. package/_cjs/FiberRefs/api.cjs.map +1 -1
  89. package/_cjs/FiberRefs/join.cjs +1 -1
  90. package/_cjs/FiberRefs/join.cjs.map +1 -1
  91. package/_cjs/IO/api/core-scope.cjs +23 -15
  92. package/_cjs/IO/api/core-scope.cjs.map +1 -1
  93. package/_cjs/IO/api/ensuringChildren.cjs +4 -2
  94. package/_cjs/IO/api/ensuringChildren.cjs.map +1 -1
  95. package/_cjs/IO/api/interrupt.cjs +21 -11
  96. package/_cjs/IO/api/interrupt.cjs.map +1 -1
  97. package/_cjs/IO/api/supervised.cjs +26 -0
  98. package/_cjs/IO/api/supervised.cjs.map +1 -0
  99. package/_cjs/IO/api/withChildren.cjs +4 -2
  100. package/_cjs/IO/api/withChildren.cjs.map +1 -1
  101. package/_cjs/IO/api/zipC.cjs +10 -8
  102. package/_cjs/IO/api/zipC.cjs.map +1 -1
  103. package/_cjs/IO/api.cjs +67 -63
  104. package/_cjs/IO/api.cjs.map +1 -1
  105. package/_cjs/IO/definition.cjs +8 -226
  106. package/_cjs/IO/definition.cjs.map +1 -1
  107. package/_cjs/IO/runtime.cjs +7 -9
  108. package/_cjs/IO/runtime.cjs.map +1 -1
  109. package/_cjs/IO.cjs +13 -0
  110. package/_cjs/IO.cjs.map +1 -1
  111. package/_cjs/Layer/api.cjs +1 -1
  112. package/_cjs/Layer/api.cjs.map +1 -1
  113. package/_cjs/Random/definition.cjs +1 -1
  114. package/_cjs/Random/definition.cjs.map +1 -1
  115. package/_cjs/Reloadable/api.cjs +46 -0
  116. package/_cjs/Reloadable/api.cjs.map +1 -0
  117. package/_cjs/Reloadable/constructors.cjs +82 -0
  118. package/_cjs/Reloadable/constructors.cjs.map +1 -0
  119. package/_cjs/Reloadable/definition.cjs +58 -0
  120. package/_cjs/Reloadable/definition.cjs.map +1 -0
  121. package/_cjs/Reloadable.cjs +45 -0
  122. package/_cjs/Reloadable.cjs.map +1 -0
  123. package/_cjs/Scope/definition.cjs +1 -1
  124. package/_cjs/Scope/definition.cjs.map +1 -1
  125. package/_cjs/internal/IsFatal.cjs +129 -0
  126. package/_cjs/internal/IsFatal.cjs.map +1 -0
  127. package/_mjs/Clock/definition.mjs +2 -1
  128. package/_mjs/Clock/definition.mjs.map +1 -1
  129. package/_mjs/Console/definition.mjs +1 -1
  130. package/_mjs/Console/definition.mjs.map +1 -1
  131. package/_mjs/Fiber/FiberContext.mjs +180 -309
  132. package/_mjs/Fiber/FiberContext.mjs.map +1 -1
  133. package/_mjs/Fiber/api/collectAll.mjs +2 -2
  134. package/_mjs/Fiber/api/collectAll.mjs.map +1 -1
  135. package/_mjs/Fiber/api/interrupt.mjs +3 -2
  136. package/_mjs/Fiber/api/interrupt.mjs.map +1 -1
  137. package/_mjs/Fiber/api/interruptAll.mjs +6 -6
  138. package/_mjs/Fiber/api/interruptAll.mjs.map +1 -1
  139. package/_mjs/Fiber/api/interruptAs.mjs +3 -1
  140. package/_mjs/Fiber/api/interruptAs.mjs.map +1 -1
  141. package/_mjs/Fiber/api/interruptAsFork.mjs +8 -0
  142. package/_mjs/Fiber/api/interruptAsFork.mjs.map +1 -0
  143. package/_mjs/Fiber/api/interruptFork.mjs +5 -4
  144. package/_mjs/Fiber/api/interruptFork.mjs.map +1 -1
  145. package/_mjs/Fiber/definition.mjs +2 -2
  146. package/_mjs/Fiber/definition.mjs.map +1 -1
  147. package/_mjs/FiberRef/api.mjs +26 -9
  148. package/_mjs/FiberRef/api.mjs.map +1 -1
  149. package/_mjs/FiberRef/definition.mjs +2 -1
  150. package/_mjs/FiberRef/definition.mjs.map +1 -1
  151. package/_mjs/FiberRef/unsafe.mjs +23 -4
  152. package/_mjs/FiberRef/unsafe.mjs.map +1 -1
  153. package/_mjs/FiberRefs/api.mjs +22 -1
  154. package/_mjs/FiberRefs/api.mjs.map +1 -1
  155. package/_mjs/FiberRefs/join.mjs +1 -1
  156. package/_mjs/FiberRefs/join.mjs.map +1 -1
  157. package/_mjs/IO/api/core-scope.mjs +21 -16
  158. package/_mjs/IO/api/core-scope.mjs.map +1 -1
  159. package/_mjs/IO/api/ensuringChildren.mjs +3 -2
  160. package/_mjs/IO/api/ensuringChildren.mjs.map +1 -1
  161. package/_mjs/IO/api/interrupt.mjs +18 -9
  162. package/_mjs/IO/api/interrupt.mjs.map +1 -1
  163. package/_mjs/IO/api/supervised.mjs +14 -0
  164. package/_mjs/IO/api/supervised.mjs.map +1 -0
  165. package/_mjs/IO/api/withChildren.mjs +3 -2
  166. package/_mjs/IO/api/withChildren.mjs.map +1 -1
  167. package/_mjs/IO/api/zipC.mjs +9 -8
  168. package/_mjs/IO/api/zipC.mjs.map +1 -1
  169. package/_mjs/IO/api.mjs +66 -60
  170. package/_mjs/IO/api.mjs.map +1 -1
  171. package/_mjs/IO/definition.mjs +5 -184
  172. package/_mjs/IO/definition.mjs.map +1 -1
  173. package/_mjs/IO/runtime.mjs +7 -8
  174. package/_mjs/IO/runtime.mjs.map +1 -1
  175. package/_mjs/IO.mjs +1 -0
  176. package/_mjs/IO.mjs.map +1 -1
  177. package/_mjs/Layer/api.mjs +1 -1
  178. package/_mjs/Layer/api.mjs.map +1 -1
  179. package/_mjs/Random/definition.mjs +1 -1
  180. package/_mjs/Random/definition.mjs.map +1 -1
  181. package/_mjs/Reloadable/api.mjs +30 -0
  182. package/_mjs/Reloadable/api.mjs.map +1 -0
  183. package/_mjs/Reloadable/constructors.mjs +55 -0
  184. package/_mjs/Reloadable/constructors.mjs.map +1 -0
  185. package/_mjs/Reloadable/definition.mjs +40 -0
  186. package/_mjs/Reloadable/definition.mjs.map +1 -0
  187. package/_mjs/Reloadable.mjs +5 -0
  188. package/_mjs/Reloadable.mjs.map +1 -0
  189. package/_mjs/Scope/definition.mjs +1 -1
  190. package/_mjs/Scope/definition.mjs.map +1 -1
  191. package/_mjs/internal/IsFatal.mjs +104 -0
  192. package/_mjs/internal/IsFatal.mjs.map +1 -0
  193. package/_src/Clock/definition.ts +1 -0
  194. package/_src/Fiber/FiberContext.ts +50 -135
  195. package/_src/Fiber/api/collectAll.ts +1 -4
  196. package/_src/Fiber/api/interruptAll.ts +2 -2
  197. package/_src/Fiber/api/interruptAs.ts +1 -1
  198. package/_src/Fiber/api/interruptAsFork.ts +7 -0
  199. package/_src/Fiber/api/interruptFork.ts +1 -1
  200. package/_src/Fiber/definition.ts +3 -5
  201. package/_src/FiberRef/api.ts +30 -7
  202. package/_src/FiberRef/definition.ts +1 -0
  203. package/_src/FiberRef/unsafe.ts +27 -3
  204. package/_src/FiberRefs/api.ts +16 -0
  205. package/_src/FiberRefs/join.ts +1 -1
  206. package/_src/IO/api/core-scope.ts +12 -10
  207. package/_src/IO/api/interrupt.ts +8 -3
  208. package/_src/IO/api/supervised.ts +14 -0
  209. package/_src/IO/api.ts +25 -26
  210. package/_src/IO/definition.ts +8 -158
  211. package/_src/IO/runtime.ts +7 -11
  212. package/_src/IO.ts +1 -0
  213. package/_src/Reloadable/api.ts +28 -0
  214. package/_src/Reloadable/constructors.ts +60 -0
  215. package/_src/Reloadable/definition.ts +34 -0
  216. package/_src/Reloadable.ts +5 -0
  217. package/_src/internal/IsFatal.ts +79 -0
  218. package/internal/IsFatal.d.ts +47 -0
  219. 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]}
@@ -9,5 +9,6 @@ export abstract class Clock {
9
9
 
10
10
  /**
11
11
  * @tsplus static fncts.io.ClockOps Tag
12
+ * @tsplus implicit
12
13
  */
13
14
  export const ClockTag = Tag<Clock>("fncts.io.Clock");
@@ -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 = AtomicReference<HashMap<FiberRef<unknown>, Cons<readonly [FiberId.Runtime, unknown]>>>;
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
- protected readonly fiberId: FiberId.Runtime,
80
- private runtimeConfig: RuntimeConfig,
81
- private interruptStatus: Stack<boolean>,
82
- private fiberRefLocals: FiberRefLocals,
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 = this.runtimeConfig.supervisor;
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.get;
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.unsafeInterruptAs(fiberId);
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
- case IOTag.SetInterrupt: {
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.FiberRefModifyAll: {
394
- const [result, newValue] = current.f(this.fiberId, FiberRefs(this.fiberRefLocals.get));
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 !== Supervisor.none && this.currentSupervisor.unsafeOnSuspend(this);
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
- private unsafeGetRef<A>(ref: FiberRef<A>): A {
543
- return this.fiberRefLocals.get
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.get.map((stack) => stack.head[1]);
462
+ return fiberRefLocals.map((stack) => stack.head[1]);
551
463
  }
552
464
 
553
- private unsafeSetRef<A>(ref: FiberRef<A>, value: A): void {
554
- const oldState = this.fiberRefLocals.get;
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 = oldState.set(ref, newStack);
565
- this.fiberRefLocals.set(newState);
476
+ const newState = oldState.set(ref, newStack);
477
+ this.fiberRefLocals = newState;
566
478
  }
567
479
 
568
- private unsafeDeleteRef<A>(ref: FiberRef<A>): void {
569
- this.fiberRefLocals.set(this.fiberRefLocals.get.remove(ref));
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
- private unsafeAddFinalizer(finalizer: IO<any, never, any>): void {
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
- private get unsafeIsInterruptible() {
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
- private unsafeRestoreInterruptStatus(): void {
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
- private unsafeInterruptAs(fiberId: FiberId): UIO<Exit<E, A>> {
639
+ interruptAsFork(fiberId: FiberId): UIO<void> {
728
640
  const interruptedCause = Cause.interrupt(fiberId);
729
- return IO.defer(() => {
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.fiberRefLocals.get.mapWithIndex((fiberRef, stack) => {
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
- new AtomicReference(childFiberRefLocals),
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
- private unsafeGetDescriptor() {
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.get,
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.get;
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 interruptAllAs_(fs: Iterable<Fiber<any, any>>, id: FiberId, __tsplusTrace?: string): UIO<void> {
7
- return fs.foldLeft(IO.unit, (io, f) => io.flatMap(() => f.interruptAs(id).asUnit));
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
  /**
@@ -3,5 +3,5 @@
3
3
  */
4
4
  export function interruptAs<E, A>(self: Fiber<E, A>, fiberId: FiberId, __tsplusTrace?: string): UIO<Exit<E, A>> {
5
5
  self.concrete();
6
- return self.interruptAs(fiberId);
6
+ return self.interruptAsFork(fiberId) > self.await;
7
7
  }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @tsplus fluent fncts.io.Fiber interruptAsFork
3
+ */
4
+ export function interruptAsFork<E, A>(self: Fiber<E, A>, fiberId: FiberId): UIO<void> {
5
+ self.concrete();
6
+ return self.interruptAsFork(fiberId);
7
+ }
@@ -6,5 +6,5 @@
6
6
  * @tsplus getter fncts.io.Fiber interruptFork
7
7
  */
8
8
  export function interruptFork<E, A>(fiber: Fiber<E, A>, __tsplusTrace?: string): UIO<void> {
9
- return fiber.interrupt.forkDaemon.asUnit;
9
+ return IO.descriptorWith(({ id }) => fiber.interruptAsFork(id))
10
10
  }
@@ -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. If the
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 interruptAs: (fiberId: FiberId) => UIO<Exit<E, A>>;
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 interruptAs: (fiberId: FiberId) => UIO<Exit<E, A>>,
108
+ readonly interruptAsFork: (fiberId: FiberId) => UIO<void>,
111
109
  ) {
112
110
  this.await = wait;
113
111
  }
@@ -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 new FiberRefModify(self, f, __tsplusTrace);
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
- return new FiberRefLocally(value, fiberRef, use);
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 new FiberRefWith(fiberRef, f, __tsplusTrace);
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 new FiberRefDelete(self, __tsplusTrace);
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
  }