@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.
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
  }