@fncts/io 0.0.37 → 0.0.39

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 (173) hide show
  1. package/Channel/definition.d.ts +108 -104
  2. package/FiberRef/unsafe.d.ts +5 -0
  3. package/Future/definition.d.ts +24 -3
  4. package/IO/api/all.d.ts +14 -15
  5. package/IO/definition.d.ts +17 -15
  6. package/_cjs/Channel/api/mapOutConcurrentIO.cjs +8 -2
  7. package/_cjs/Channel/api/mapOutConcurrentIO.cjs.map +1 -1
  8. package/_cjs/Channel/api/mergeAllWith.cjs +23 -14
  9. package/_cjs/Channel/api/mergeAllWith.cjs.map +1 -1
  10. package/_cjs/Channel/api/mergeWith.cjs +16 -4
  11. package/_cjs/Channel/api/mergeWith.cjs.map +1 -1
  12. package/_cjs/Channel/api.cjs +131 -36
  13. package/_cjs/Channel/api.cjs.map +1 -1
  14. package/_cjs/Channel/core-api.cjs +13 -3
  15. package/_cjs/Channel/core-api.cjs.map +1 -1
  16. package/_cjs/Channel/definition.cjs +18 -143
  17. package/_cjs/Channel/definition.cjs.map +1 -1
  18. package/_cjs/Channel/internal/ChannelExecutor.cjs +51 -49
  19. package/_cjs/Channel/internal/ChannelExecutor.cjs.map +1 -1
  20. package/_cjs/Channel/internal/SingleProducerAsyncInput.cjs +8 -2
  21. package/_cjs/Channel/internal/SingleProducerAsyncInput.cjs.map +1 -1
  22. package/_cjs/Console/live.cjs +1 -1
  23. package/_cjs/Console/live.cjs.map +1 -1
  24. package/_cjs/Fiber/FiberRuntime.cjs +23 -18
  25. package/_cjs/Fiber/FiberRuntime.cjs.map +1 -1
  26. package/_cjs/FiberRef/definition.cjs +3 -1
  27. package/_cjs/FiberRef/definition.cjs.map +1 -1
  28. package/_cjs/FiberRef/unsafe.cjs +6 -1
  29. package/_cjs/FiberRef/unsafe.cjs.map +1 -1
  30. package/_cjs/Future/api.cjs +12 -12
  31. package/_cjs/Future/api.cjs.map +1 -1
  32. package/_cjs/Future/definition.cjs +10 -3
  33. package/_cjs/Future/definition.cjs.map +1 -1
  34. package/_cjs/IO/api/all.cjs +4 -4
  35. package/_cjs/IO/api/all.cjs.map +1 -1
  36. package/_cjs/IO/api/asyncInterrupt.cjs +7 -4
  37. package/_cjs/IO/api/asyncInterrupt.cjs.map +1 -1
  38. package/_cjs/IO/api.cjs +38 -14
  39. package/_cjs/IO/api.cjs.map +1 -1
  40. package/_cjs/IO/definition.cjs.map +1 -1
  41. package/_cjs/IO/runtime.cjs +6 -3
  42. package/_cjs/IO/runtime.cjs.map +1 -1
  43. package/_cjs/Layer/api.cjs +4 -1
  44. package/_cjs/Layer/api.cjs.map +1 -1
  45. package/_cjs/Push/api.cjs +4 -1
  46. package/_cjs/Push/api.cjs.map +1 -1
  47. package/_cjs/Ref/Derived.cjs +35 -8
  48. package/_cjs/Ref/Derived.cjs.map +1 -1
  49. package/_cjs/Ref/DerivedAll.cjs +35 -8
  50. package/_cjs/Ref/DerivedAll.cjs.map +1 -1
  51. package/_cjs/RuntimeFlags/RuntimeFlags.cjs +3 -4
  52. package/_cjs/RuntimeFlags/RuntimeFlags.cjs.map +1 -1
  53. package/_cjs/STM/api/core-api.cjs +4 -1
  54. package/_cjs/STM/api/core-api.cjs.map +1 -1
  55. package/_cjs/STM/api.cjs +16 -4
  56. package/_cjs/STM/api.cjs.map +1 -1
  57. package/_cjs/Schedule/api.cjs +7 -1
  58. package/_cjs/Schedule/api.cjs.map +1 -1
  59. package/_cjs/ScopedRef/api.cjs +2 -2
  60. package/_cjs/ScopedRef/api.cjs.map +1 -1
  61. package/_cjs/Sink/api.cjs +7 -1
  62. package/_cjs/Sink/api.cjs.map +1 -1
  63. package/_cjs/Stream/api/zipAllWith.cjs +4 -1
  64. package/_cjs/Stream/api/zipAllWith.cjs.map +1 -1
  65. package/_cjs/Stream/api/zipWithChunks.cjs +4 -1
  66. package/_cjs/Stream/api/zipWithChunks.cjs.map +1 -1
  67. package/_cjs/Stream/api.cjs +36 -15
  68. package/_cjs/Stream/api.cjs.map +1 -1
  69. package/_cjs/SupervisorPatch.cjs +38 -15
  70. package/_cjs/SupervisorPatch.cjs.map +1 -1
  71. package/_cjs/TRef/definition.cjs +74 -20
  72. package/_cjs/TRef/definition.cjs.map +1 -1
  73. package/_mjs/Channel/api/mapOutConcurrentIO.mjs +8 -2
  74. package/_mjs/Channel/api/mapOutConcurrentIO.mjs.map +1 -1
  75. package/_mjs/Channel/api/mergeAllWith.mjs +23 -14
  76. package/_mjs/Channel/api/mergeAllWith.mjs.map +1 -1
  77. package/_mjs/Channel/api/mergeWith.mjs +16 -4
  78. package/_mjs/Channel/api/mergeWith.mjs.map +1 -1
  79. package/_mjs/Channel/api.mjs +132 -37
  80. package/_mjs/Channel/api.mjs.map +1 -1
  81. package/_mjs/Channel/core-api.mjs +14 -4
  82. package/_mjs/Channel/core-api.mjs.map +1 -1
  83. package/_mjs/Channel/definition.mjs +14 -135
  84. package/_mjs/Channel/definition.mjs.map +1 -1
  85. package/_mjs/Channel/internal/ChannelExecutor.mjs +52 -50
  86. package/_mjs/Channel/internal/ChannelExecutor.mjs.map +1 -1
  87. package/_mjs/Channel/internal/SingleProducerAsyncInput.mjs +8 -2
  88. package/_mjs/Channel/internal/SingleProducerAsyncInput.mjs.map +1 -1
  89. package/_mjs/Console/live.mjs +1 -1
  90. package/_mjs/Console/live.mjs.map +1 -1
  91. package/_mjs/Fiber/FiberRuntime.mjs +23 -18
  92. package/_mjs/Fiber/FiberRuntime.mjs.map +1 -1
  93. package/_mjs/FiberRef/definition.mjs +3 -1
  94. package/_mjs/FiberRef/definition.mjs.map +1 -1
  95. package/_mjs/FiberRef/unsafe.mjs +4 -0
  96. package/_mjs/FiberRef/unsafe.mjs.map +1 -1
  97. package/_mjs/Future/api.mjs +12 -12
  98. package/_mjs/Future/api.mjs.map +1 -1
  99. package/_mjs/Future/definition.mjs +7 -2
  100. package/_mjs/Future/definition.mjs.map +1 -1
  101. package/_mjs/IO/api/all.mjs +4 -4
  102. package/_mjs/IO/api/all.mjs.map +1 -1
  103. package/_mjs/IO/api/asyncInterrupt.mjs +7 -4
  104. package/_mjs/IO/api/asyncInterrupt.mjs.map +1 -1
  105. package/_mjs/IO/api.mjs +38 -14
  106. package/_mjs/IO/api.mjs.map +1 -1
  107. package/_mjs/IO/definition.mjs.map +1 -1
  108. package/_mjs/IO/runtime.mjs +6 -3
  109. package/_mjs/IO/runtime.mjs.map +1 -1
  110. package/_mjs/Layer/api.mjs +4 -1
  111. package/_mjs/Layer/api.mjs.map +1 -1
  112. package/_mjs/Push/api.mjs +4 -1
  113. package/_mjs/Push/api.mjs.map +1 -1
  114. package/_mjs/Ref/Derived.mjs +35 -8
  115. package/_mjs/Ref/Derived.mjs.map +1 -1
  116. package/_mjs/Ref/DerivedAll.mjs +35 -8
  117. package/_mjs/Ref/DerivedAll.mjs.map +1 -1
  118. package/_mjs/RuntimeFlags/RuntimeFlags.mjs +3 -4
  119. package/_mjs/RuntimeFlags/RuntimeFlags.mjs.map +1 -1
  120. package/_mjs/STM/api/core-api.mjs +4 -1
  121. package/_mjs/STM/api/core-api.mjs.map +1 -1
  122. package/_mjs/STM/api.mjs +16 -4
  123. package/_mjs/STM/api.mjs.map +1 -1
  124. package/_mjs/Schedule/api.mjs +7 -1
  125. package/_mjs/Schedule/api.mjs.map +1 -1
  126. package/_mjs/ScopedRef/api.mjs +2 -2
  127. package/_mjs/ScopedRef/api.mjs.map +1 -1
  128. package/_mjs/Sink/api.mjs +7 -1
  129. package/_mjs/Sink/api.mjs.map +1 -1
  130. package/_mjs/Stream/api/zipAllWith.mjs +4 -1
  131. package/_mjs/Stream/api/zipAllWith.mjs.map +1 -1
  132. package/_mjs/Stream/api/zipWithChunks.mjs +4 -1
  133. package/_mjs/Stream/api/zipWithChunks.mjs.map +1 -1
  134. package/_mjs/Stream/api.mjs +36 -15
  135. package/_mjs/Stream/api.mjs.map +1 -1
  136. package/_mjs/SupervisorPatch.mjs +38 -15
  137. package/_mjs/SupervisorPatch.mjs.map +1 -1
  138. package/_mjs/TRef/definition.mjs +74 -20
  139. package/_mjs/TRef/definition.mjs.map +1 -1
  140. package/_src/Channel/api/mapOutConcurrentIO.ts +5 -5
  141. package/_src/Channel/api/mergeAllWith.ts +9 -9
  142. package/_src/Channel/api/mergeWith.ts +16 -16
  143. package/_src/Channel/api.ts +128 -143
  144. package/_src/Channel/core-api.ts +17 -14
  145. package/_src/Channel/definition.ts +187 -236
  146. package/_src/Channel/internal/ChannelExecutor.ts +47 -45
  147. package/_src/Channel/internal/SingleProducerAsyncInput.ts +2 -2
  148. package/_src/Console/live.ts +1 -1
  149. package/_src/Fiber/FiberRuntime.ts +6 -3
  150. package/_src/FiberRef/definition.ts +4 -1
  151. package/_src/FiberRef/unsafe.ts +5 -0
  152. package/_src/Future/definition.ts +19 -3
  153. package/_src/IO/api/all.ts +14 -15
  154. package/_src/IO/api/asyncInterrupt.ts +4 -4
  155. package/_src/IO/api.ts +19 -15
  156. package/_src/IO/definition.ts +5 -3
  157. package/_src/IO/runtime.ts +6 -3
  158. package/_src/Layer/api.ts +4 -1
  159. package/_src/Push/api.ts +4 -4
  160. package/_src/Ref/Derived.ts +20 -18
  161. package/_src/Ref/DerivedAll.ts +21 -18
  162. package/_src/RuntimeFlags/RuntimeFlags.ts +1 -1
  163. package/_src/STM/api/core-api.ts +1 -1
  164. package/_src/STM/api.ts +4 -4
  165. package/_src/Schedule/api.ts +8 -8
  166. package/_src/ScopedRef/api.ts +4 -3
  167. package/_src/Sink/api.ts +8 -8
  168. package/_src/Stream/api/zipAllWith.ts +4 -4
  169. package/_src/Stream/api/zipWithChunks.ts +4 -4
  170. package/_src/Stream/api.ts +21 -19
  171. package/_src/SupervisorPatch.ts +1 -0
  172. package/_src/TRef/definition.ts +36 -33
  173. package/package.json +2 -2
@@ -1,12 +1,12 @@
1
1
  import type { ChildExecutorDecision } from "@fncts/io/Channel/ChildExecutorDecision";
2
- import type { BracketOut, Continuation, Ensuring } from "@fncts/io/Channel/definition";
2
+ import type { BracketOut, Continuation, ContinuationFinalizer, Ensuring } from "@fncts/io/Channel/definition";
3
3
  import type { ChannelState } from "@fncts/io/Channel/internal/ChannelState";
4
4
  import type { UpstreamPullStrategy } from "@fncts/io/Channel/UpstreamPullStrategy";
5
5
 
6
6
  import { Queue } from "@fncts/base/collection/immutable/Queue";
7
7
  import { identity } from "@fncts/base/data/function";
8
8
  import { Stack } from "@fncts/base/internal/Stack";
9
- import { ChannelTag, concrete, concreteContinuation, ContinuationFinalizer } from "@fncts/io/Channel/definition";
9
+ import { ChannelPrimitive, ChannelTag, concrete, concreteContinuation } from "@fncts/io/Channel/definition";
10
10
  import * as State from "@fncts/io/Channel/internal/ChannelState";
11
11
  import { UpstreamPullRequest } from "@fncts/io/Channel/UpstreamPullRequest";
12
12
 
@@ -14,7 +14,7 @@ type ErasedChannel<R> = Channel<R, unknown, unknown, unknown, unknown, unknown,
14
14
  export type ErasedExecutor<R> = ChannelExecutor<R, unknown, unknown, unknown, unknown, unknown, unknown>;
15
15
  type ErasedContinuation<R> = Continuation<R, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown>;
16
16
 
17
- type Finalizer<R> = (exit: Exit<unknown, unknown>) => URIO<R, unknown>;
17
+ type Finalizer = (exit: Exit<unknown, unknown>) => URIO<any, any>;
18
18
 
19
19
  /*
20
20
  * -------------------------------------------------------------------------------------------------
@@ -303,7 +303,7 @@ export class ChannelExecutor<Env, InErr, InElem, InDone, OutErr, OutElem, OutDon
303
303
  if (this.input !== null) {
304
304
  const inputExecutor = this.input;
305
305
  this.input = null;
306
- const drainer: URIO<Env, unknown> = currentChannel.input.awaitRead.zipRight(
306
+ const drainer: URIO<Env, unknown> = currentChannel.i0.awaitRead.zipRight(
307
307
  IO.defer(() => {
308
308
  const state = inputExecutor.run();
309
309
 
@@ -311,16 +311,16 @@ export class ChannelExecutor<Env, InErr, InElem, InDone, OutErr, OutElem, OutDon
311
311
  case State.ChannelStateTag.Done: {
312
312
  const done = inputExecutor.getDone();
313
313
  return done.match(
314
- (cause) => currentChannel.input.error(cause),
315
- (value) => currentChannel.input.done(value),
314
+ (cause) => currentChannel.i0.error(cause),
315
+ (value) => currentChannel.i0.done(value),
316
316
  );
317
317
  }
318
318
  case State.ChannelStateTag.Emit: {
319
- return currentChannel.input.emit(inputExecutor.getEmit()).flatMap(() => drainer);
319
+ return currentChannel.i0.emit(inputExecutor.getEmit()).flatMap(() => drainer);
320
320
  }
321
321
  case State.ChannelStateTag.Effect: {
322
322
  return state.effect.matchCauseIO(
323
- (cause) => currentChannel.input.error(cause),
323
+ (cause) => currentChannel.i0.error(cause),
324
324
  () => drainer,
325
325
  );
326
326
  }
@@ -328,7 +328,7 @@ export class ChannelExecutor<Env, InErr, InElem, InDone, OutErr, OutElem, OutDon
328
328
  return readUpstream(
329
329
  state,
330
330
  () => drainer,
331
- (cause: Cause<any>) => currentChannel.input.error(cause),
331
+ (cause: Cause<any>) => currentChannel.i0.error(cause),
332
332
  );
333
333
  }
334
334
  }
@@ -357,7 +357,7 @@ export class ChannelExecutor<Env, InErr, InElem, InDone, OutErr, OutElem, OutDon
357
357
  }
358
358
  case ChannelTag.PipeTo: {
359
359
  const previousInput = this.input;
360
- const leftExec = new ChannelExecutor(currentChannel.left, this.providedEnv, (_) =>
360
+ const leftExec = new ChannelExecutor(currentChannel.i0, this.providedEnv, (_) =>
361
361
  this.executeCloseLastSubstream(_),
362
362
  );
363
363
  leftExec.input = previousInput;
@@ -370,7 +370,7 @@ export class ChannelExecutor<Env, InErr, InElem, InDone, OutErr, OutElem, OutDon
370
370
  return IO.unit;
371
371
  }
372
372
  });
373
- this.currentChannel = currentChannel.right();
373
+ this.currentChannel = currentChannel.i1();
374
374
  break;
375
375
  }
376
376
  case ChannelTag.Read: {
@@ -379,29 +379,29 @@ export class ChannelExecutor<Env, InErr, InElem, InDone, OutErr, OutElem, OutDon
379
379
  this.input,
380
380
  identity,
381
381
  (out) => {
382
- this.currentChannel = read.more(out);
382
+ this.currentChannel = read.i0(out);
383
383
  return null;
384
384
  },
385
385
  (exit) => {
386
- this.currentChannel = read.done.onExit(exit);
386
+ this.currentChannel = exit.match(read.i1.i1, read.i1.i0);
387
387
  return null;
388
388
  },
389
389
  );
390
390
  break;
391
391
  }
392
392
  case ChannelTag.Done: {
393
- result = this.doneSucceed(currentChannel.terminal());
393
+ result = this.doneSucceed(currentChannel.i0());
394
394
  break;
395
395
  }
396
396
  case ChannelTag.Halt: {
397
- result = this.doneHalt(currentChannel.cause());
397
+ result = this.doneHalt(currentChannel.i0());
398
398
  break;
399
399
  }
400
400
  case ChannelTag.FromIO: {
401
401
  const pio =
402
402
  this.providedEnv === null
403
- ? currentChannel.io
404
- : currentChannel.io.provideEnvironment(this.providedEnv as Environment<Env>);
403
+ ? currentChannel.i0
404
+ : currentChannel.i0.provideEnvironment(this.providedEnv as Environment<Env>);
405
405
  result = new State.Effect(
406
406
  pio.matchCauseIO(
407
407
  (cause) => {
@@ -425,11 +425,11 @@ export class ChannelExecutor<Env, InErr, InElem, InDone, OutErr, OutElem, OutDon
425
425
  break;
426
426
  }
427
427
  case ChannelTag.Defer: {
428
- this.currentChannel = currentChannel.effect();
428
+ this.currentChannel = currentChannel.i0();
429
429
  break;
430
430
  }
431
431
  case ChannelTag.Emit: {
432
- this.emitted = currentChannel.out();
432
+ this.emitted = currentChannel.i0();
433
433
  this.currentChannel = this.activeSubexecutor !== null ? null : Channel.endNow(undefined);
434
434
  result = State._Emit;
435
435
  break;
@@ -444,25 +444,25 @@ export class ChannelExecutor<Env, InErr, InElem, InDone, OutErr, OutElem, OutDon
444
444
  const prevLastClose = this.closeLastSubstream === null ? IO.unit : this.closeLastSubstream;
445
445
  this.closeLastSubstream = prevLastClose.flatMap(() => f);
446
446
  });
447
- const exec = new ChannelExecutor(() => currentChannel.value, this.providedEnv, innerExecuteLastClose);
447
+ const exec = new ChannelExecutor(() => currentChannel.i4, this.providedEnv, innerExecuteLastClose);
448
448
  exec.input = this.input;
449
449
  this.activeSubexecutor = new PullFromUpstream(
450
450
  exec,
451
- currentChannel.k,
451
+ currentChannel.i5,
452
452
  null,
453
453
  Queue.empty(),
454
- currentChannel.combineInners,
455
- currentChannel.combineAll,
456
- currentChannel.onPull,
457
- currentChannel.onEmit,
454
+ currentChannel.i0,
455
+ currentChannel.i1,
456
+ currentChannel.i2,
457
+ currentChannel.i3,
458
458
  );
459
459
  this.closeLastSubstream = null;
460
460
  this.currentChannel = null;
461
461
  break;
462
462
  }
463
463
  case ChannelTag.Fold: {
464
- this.doneStack = this.doneStack.prepend(currentChannel.k);
465
- this.currentChannel = currentChannel.value;
464
+ this.doneStack = this.doneStack.prepend(currentChannel.i1);
465
+ this.currentChannel = currentChannel.i0;
466
466
  break;
467
467
  }
468
468
  case ChannelTag.BracketOut: {
@@ -471,8 +471,8 @@ export class ChannelExecutor<Env, InErr, InElem, InDone, OutErr, OutElem, OutDon
471
471
  }
472
472
  case ChannelTag.Provide: {
473
473
  const previousEnv = this.providedEnv;
474
- this.providedEnv = currentChannel.environment;
475
- this.currentChannel = currentChannel.inner;
474
+ this.providedEnv = currentChannel.i0;
475
+ this.currentChannel = currentChannel.i1;
476
476
  this.addFinalizer(() =>
477
477
  IO.succeed(() => {
478
478
  this.providedEnv = previousEnv;
@@ -500,7 +500,7 @@ export class ChannelExecutor<Env, InErr, InElem, InDone, OutErr, OutElem, OutDon
500
500
  /**
501
501
  * @tsplus tailRec
502
502
  */
503
- const unwind = (acc: List<Finalizer<Env>>): List<Finalizer<Env>> => {
503
+ const unwind = (acc: List<Finalizer>): List<Finalizer> => {
504
504
  if (this.doneStack.isEmpty()) {
505
505
  return acc.reverse;
506
506
  } else {
@@ -510,7 +510,7 @@ export class ChannelExecutor<Env, InErr, InElem, InDone, OutErr, OutElem, OutDon
510
510
  if (head._tag === ChannelTag.ContinuationK) {
511
511
  return unwind(acc);
512
512
  } else {
513
- return unwind(acc.prepend(head.finalizer));
513
+ return unwind(acc.prepend(head.i0));
514
514
  }
515
515
  }
516
516
  };
@@ -520,8 +520,8 @@ export class ChannelExecutor<Env, InErr, InElem, InDone, OutErr, OutElem, OutDon
520
520
  return effect;
521
521
  }
522
522
 
523
- private popNextFinalizers(): List<ContinuationFinalizer<Env, unknown, unknown>> {
524
- const builder = new ListBuffer<ContinuationFinalizer<Env, unknown, unknown>>();
523
+ private popNextFinalizers(): List<ContinuationFinalizer> {
524
+ const builder = new ListBuffer<ContinuationFinalizer>();
525
525
  /**
526
526
  * @tsplus tailrec
527
527
  */
@@ -980,7 +980,7 @@ export class ChannelExecutor<Env, InErr, InElem, InDone, OutErr, OutElem, OutDon
980
980
 
981
981
  if (head._tag === ChannelTag.ContinuationK) {
982
982
  this.doneStack = this.doneStack.unsafeTail;
983
- this.currentChannel = head.onSuccess(z);
983
+ this.currentChannel = head.i0(z);
984
984
  return null;
985
985
  } else {
986
986
  const finalizers = this.popNextFinalizers();
@@ -992,7 +992,7 @@ export class ChannelExecutor<Env, InErr, InElem, InDone, OutErr, OutElem, OutDon
992
992
  return State._Done;
993
993
  } else {
994
994
  const finalizerEffect = this.runFinalizers(
995
- finalizers.map((_) => _.finalizer),
995
+ finalizers.map((_) => _.i0),
996
996
  Exit.succeed(z),
997
997
  );
998
998
  this.storeInProgressFinalizer(finalizerEffect);
@@ -1020,7 +1020,7 @@ export class ChannelExecutor<Env, InErr, InElem, InDone, OutErr, OutElem, OutDon
1020
1020
 
1021
1021
  if (head._tag === ChannelTag.ContinuationK) {
1022
1022
  this.doneStack = this.doneStack.unsafeTail;
1023
- this.currentChannel = head.onHalt(cause);
1023
+ this.currentChannel = head.i1(cause);
1024
1024
  return null;
1025
1025
  } else {
1026
1026
  const finalizers = this.popNextFinalizers();
@@ -1032,7 +1032,7 @@ export class ChannelExecutor<Env, InErr, InElem, InDone, OutErr, OutElem, OutDon
1032
1032
  return State._Done;
1033
1033
  } else {
1034
1034
  const finalizerEffect = this.runFinalizers(
1035
- finalizers.map((_) => _.finalizer),
1035
+ finalizers.map((_) => _.i0),
1036
1036
  Exit.failCause(cause),
1037
1037
  );
1038
1038
  this.storeInProgressFinalizer(finalizerEffect);
@@ -1049,8 +1049,10 @@ export class ChannelExecutor<Env, InErr, InElem, InDone, OutErr, OutElem, OutDon
1049
1049
  }
1050
1050
  }
1051
1051
 
1052
- private addFinalizer(f: Finalizer<Env>) {
1053
- this.doneStack = this.doneStack.prepend(new ContinuationFinalizer(f));
1052
+ private addFinalizer(f: Finalizer) {
1053
+ const op = new ChannelPrimitive(ChannelTag.ContinuationFinalizer);
1054
+ op.i0 = f;
1055
+ this.doneStack = this.doneStack.prepend(op as any);
1054
1056
  }
1055
1057
 
1056
1058
  private provide<Env, OutErr, OutDone>(
@@ -1064,17 +1066,17 @@ export class ChannelExecutor<Env, InErr, InElem, InDone, OutErr, OutElem, OutDon
1064
1066
  }
1065
1067
  }
1066
1068
 
1067
- private runBracketOut(bracketOut: BracketOut<Env, unknown, unknown, unknown>): ChannelState<Env, unknown> | null {
1069
+ private runBracketOut(bracketOut: BracketOut): ChannelState<Env, unknown> | null {
1068
1070
  return new State.Effect(
1069
1071
  IO.uninterruptible(
1070
- this.provide(bracketOut.acquire).matchCauseIO(
1072
+ this.provide(bracketOut.i0).matchCauseIO(
1071
1073
  (cause) =>
1072
1074
  IO.succeed(() => {
1073
1075
  this.currentChannel = Channel.failCause(cause);
1074
1076
  }),
1075
1077
  (out) =>
1076
1078
  IO.succeed(() => {
1077
- this.addFinalizer((e) => this.provide(bracketOut.finalizer(out, e)));
1079
+ this.addFinalizer((e) => this.provide(bracketOut.i1(out, e)));
1078
1080
  this.currentChannel = Channel.write(() => out);
1079
1081
  }),
1080
1082
  ),
@@ -1082,8 +1084,8 @@ export class ChannelExecutor<Env, InErr, InElem, InDone, OutErr, OutElem, OutDon
1082
1084
  );
1083
1085
  }
1084
1086
 
1085
- private runEnsuring(ensuring: Ensuring<Env, any, any, any, any, any, any>) {
1086
- this.addFinalizer(ensuring.finalizer);
1087
- this.currentChannel = ensuring.channel;
1087
+ private runEnsuring(ensuring: Ensuring) {
1088
+ this.addFinalizer(ensuring.i1);
1089
+ this.currentChannel = ensuring.i0;
1088
1090
  }
1089
1091
  }
@@ -139,7 +139,7 @@ export class SingleProducerAsyncInput<Err, Elem, Done>
139
139
  switch (state._stateTag) {
140
140
  case StateTag.Emit: {
141
141
  return tuple(
142
- p.await.matchCause(onError, (de) => de.match(onDone, onElement)),
142
+ p.await.matchCause(onError, (de) => de.match({ Left: onDone, Right: onElement })),
143
143
  new StateEmit(state.notifyConsumers.enqueue(p)),
144
144
  );
145
145
  }
@@ -153,7 +153,7 @@ export class SingleProducerAsyncInput<Err, Elem, Done>
153
153
  return tuple(
154
154
  state.notifyProducer
155
155
  .succeed(undefined)
156
- .zipRight(p.await.matchCause(onError, (de) => de.match(onDone, onElement))),
156
+ .zipRight(p.await.matchCause(onError, (de) => de.match({ Left: onDone, Right: onElement }))),
157
157
  new StateEmit(Queue.single(p)),
158
158
  );
159
159
  }
@@ -8,7 +8,7 @@ export class LiveConsole extends Console {
8
8
  return IO(console.log(line));
9
9
  }
10
10
  error(line: string) {
11
- return IO(console.debug(line));
11
+ return IO(console.error(line));
12
12
  }
13
13
  }
14
14
 
@@ -293,7 +293,7 @@ export class FiberRuntime<E, A> implements Fiber.Runtime<E, A> {
293
293
  let ops = 0;
294
294
 
295
295
  while (true) {
296
- if (this._runtimeFlags.opSupervision) {
296
+ if ((this._runtimeFlags & RuntimeFlag.OpSupervision) !== 0) {
297
297
  this.getSupervisor().unsafeOnEffect(this, cur);
298
298
  }
299
299
 
@@ -304,7 +304,7 @@ export class FiberRuntime<E, A> implements Fiber.Runtime<E, A> {
304
304
 
305
305
  ops += 1;
306
306
 
307
- if (ops > 2048) {
307
+ if (ops > this.getFiberRef(FiberRef.currentMaxFiberOps)) {
308
308
  ops = 0;
309
309
  const oldCur = cur;
310
310
  const trace = lastTrace;
@@ -545,7 +545,10 @@ export class FiberRuntime<E, A> implements Fiber.Runtime<E, A> {
545
545
  }
546
546
 
547
547
  getFiberRef<A>(fiberRef: FiberRef<A>): A {
548
- return this._fiberRefs.getOrDefault(fiberRef);
548
+ if (this._fiberRefs.unFiberRefs.has(fiberRef)) {
549
+ return this._fiberRefs.unFiberRefs.unsafeGet(fiberRef)!.head[1] as A;
550
+ }
551
+ return fiberRef.initial;
549
552
  }
550
553
 
551
554
  tell(message: FiberMessage): void {
@@ -1,3 +1,4 @@
1
+ import { globalValue } from "@fncts/base/data/Global";
1
2
  import { AtomicNumber } from "@fncts/base/internal/AtomicNumber";
2
3
 
3
4
  export const FiberRefVariance = Symbol.for("fncts.io.FiberRef.Variance");
@@ -24,7 +25,9 @@ export declare namespace FiberRef {
24
25
  }
25
26
  }
26
27
 
27
- const fiberRefCounter = new AtomicNumber(0);
28
+ const FiberRefCounterId = Symbol.for("fncts.io.FiberRef.FiberRefCounter");
29
+
30
+ const fiberRefCounter = globalValue(FiberRefCounterId, () => new AtomicNumber(0));
28
31
 
29
32
  /**
30
33
  * @tsplus type fncts.io.FiberRef
@@ -115,3 +115,8 @@ export const currentIsFatal = FiberRef.unsafeMake<IsFatal>(IsFatal.empty);
115
115
  export const currentReportFatal = FiberRef.unsafeMake<(t: unknown) => never>((t) => {
116
116
  throw t;
117
117
  });
118
+
119
+ /**
120
+ * @tsplus static fncts.io.FiberRefOps currentMaxFiberOps
121
+ */
122
+ export const currentMaxFiberOps = FiberRef.unsafeMake<number>(2048);
@@ -1,14 +1,30 @@
1
+ export const FutureTypeId = Symbol.for("fncts.io.Future");
2
+ export type FutureTypeId = typeof FutureTypeId;
3
+
4
+ export const FutureVariance = Symbol.for("fncts.io.Future.Variance");
5
+ export type FutureVariance = typeof FutureVariance;
6
+
1
7
  /**
2
8
  * @tsplus type fncts.io.Future
3
9
  * @tsplus companion fncts.io.FutureOps
4
10
  */
5
- export class Future<E, A> {
11
+ export class Future<in out E, in out A> {
12
+ readonly [FutureTypeId]: FutureTypeId = FutureTypeId;
13
+ declare FutureVariance: {
14
+ readonly _A: (_: A) => A;
15
+ readonly _E: (_: E) => E;
16
+ };
6
17
  constructor(public state: State<E, A>, readonly blockingOn: FiberId) {}
7
18
  }
8
19
 
20
+ export declare namespace Future {
21
+ type ErrorOf<X> = [X] extends [{ [FutureVariance]: { _E: (_: infer E) => infer E } }] ? E : never;
22
+ type ValueOf<X> = [X] extends [{ [FutureVariance]: { _A: (_: infer A) => infer A } }] ? A : never;
23
+ }
24
+
9
25
  export const enum FutureStateTag {
10
- Done = "Done",
11
- Pending = "Pending",
26
+ Done,
27
+ Pending,
12
28
  }
13
29
 
14
30
  export class Pending<E, A> {
@@ -1,5 +1,4 @@
1
1
  import type { _A, _E, _R } from "@fncts/base/types";
2
- import type { EnvironmentOf, ErrorOf, IOVariance, ValueOf } from "@fncts/io/IO";
3
2
 
4
3
  /**
5
4
  * @tsplus static fncts.io.IOOps all
@@ -7,19 +6,19 @@ import type { EnvironmentOf, ErrorOf, IOVariance, ValueOf } from "@fncts/io/IO";
7
6
  export function all<T extends ReadonlyArray<IO<any, any, any>>>(
8
7
  ios: [...T],
9
8
  ): IO<
10
- { [K in number]: EnvironmentOf<T[K]> }[number],
11
- { [K in number]: ErrorOf<T[K]> }[number],
12
- { [K in keyof T]: ValueOf<T[K]> }
9
+ { [K in number]: IO.EnvironmentOf<T[K]> }[number],
10
+ { [K in number]: IO.ErrorOf<T[K]> }[number],
11
+ { [K in keyof T]: IO.ValueOf<T[K]> }
13
12
  >;
14
13
  export function all<T extends Iterable<IO<any, any, any>>>(
15
14
  ios: T,
16
- ): [T] extends [Iterable<infer A>] ? IO<EnvironmentOf<A>, ErrorOf<A>, Conc<ValueOf<A>>> : never;
15
+ ): [T] extends [Iterable<infer A>] ? IO<IO.EnvironmentOf<A>, IO.ErrorOf<A>, Conc<IO.ValueOf<A>>> : never;
17
16
  export function all<T extends Record<string, IO<any, any, any>>>(
18
17
  ios: T,
19
18
  ): IO<
20
- { [K in keyof T]: EnvironmentOf<T[K]> }[keyof T],
21
- { [K in keyof T]: ErrorOf<T[K]> }[keyof T],
22
- { [K in keyof T]: ValueOf<T[K]> }
19
+ { [K in keyof T]: IO.EnvironmentOf<T[K]> }[keyof T],
20
+ { [K in keyof T]: IO.ErrorOf<T[K]> }[keyof T],
21
+ { [K in keyof T]: IO.ValueOf<T[K]> }
23
22
  >;
24
23
  export function all(ios: Record<string, IO<any, any, any>> | Iterable<IO<any, any, any>>): IO<any, any, any> {
25
24
  if (Symbol.iterator in ios) {
@@ -38,19 +37,19 @@ export function all(ios: Record<string, IO<any, any, any>> | Iterable<IO<any, an
38
37
  export function allConcurrent<T extends ReadonlyArray<IO<any, any, any>>>(
39
38
  ios: [...T],
40
39
  ): IO<
41
- { [K in number]: EnvironmentOf<T[K]> }[number],
42
- { [K in number]: ErrorOf<T[K]> }[number],
43
- { [K in keyof T]: ValueOf<T[K]> }
40
+ { [K in number]: IO.EnvironmentOf<T[K]> }[number],
41
+ { [K in number]: IO.ErrorOf<T[K]> }[number],
42
+ { [K in keyof T]: IO.ValueOf<T[K]> }
44
43
  >;
45
44
  export function allConcurrent<T extends Iterable<IO<any, any, any>>>(
46
45
  ios: T,
47
- ): [T] extends [Iterable<infer A>] ? IO<EnvironmentOf<A>, ErrorOf<A>, Conc<ValueOf<A>>> : never;
46
+ ): [T] extends [Iterable<infer A>] ? IO<IO.EnvironmentOf<A>, IO.ErrorOf<A>, Conc<IO.ValueOf<A>>> : never;
48
47
  export function allConcurrent<T extends Record<string, IO<any, any, any>>>(
49
48
  ios: T,
50
49
  ): IO<
51
- { [K in keyof T]: EnvironmentOf<T[K]> }[keyof T],
52
- { [K in keyof T]: ErrorOf<T[K]> }[keyof T],
53
- { [K in keyof T]: ValueOf<T[K]> }
50
+ { [K in keyof T]: IO.EnvironmentOf<T[K]> }[keyof T],
51
+ { [K in keyof T]: IO.ErrorOf<T[K]> }[keyof T],
52
+ { [K in keyof T]: IO.ValueOf<T[K]> }
54
53
  >;
55
54
  export function allConcurrent(ios: Record<string, IO<any, any, any>> | Iterable<IO<any, any, any>>): IO<any, any, any> {
56
55
  if (Symbol.iterator in ios) {
@@ -25,14 +25,14 @@ export function asyncInterrupt<R, E, A>(
25
25
  let cancelerRef: URIO<R, any> = IO.unit!;
26
26
  return IO.async<R, E, A>((k) => {
27
27
  const result = register(k);
28
- result.match(
29
- (canceler) => {
28
+ result.match({
29
+ Left: (canceler) => {
30
30
  cancelerRef = canceler;
31
31
  },
32
- (done) => {
32
+ Right: (done) => {
33
33
  k(done);
34
34
  },
35
- );
35
+ });
36
36
  }, blockingOn).onInterrupt(() => cancelerRef);
37
37
  });
38
38
  }
package/_src/IO/api.ts CHANGED
@@ -6,7 +6,7 @@ import type { RuntimeFlags } from "@fncts/io/RuntimeFlags";
6
6
 
7
7
  import { IOError } from "@fncts/base/data/exceptions";
8
8
  import { identity, pipe, tuple } from "@fncts/base/data/function";
9
- import { IOPrimitive,IOTag } from "@fncts/io/IO/definition";
9
+ import { IOPrimitive, IOTag } from "@fncts/io/IO/definition";
10
10
  import { IO } from "@fncts/io/IO/definition";
11
11
 
12
12
  /**
@@ -122,10 +122,10 @@ export function bitap<E, A, R1, E1, R2, E2>(
122
122
  return <R>(self: IO<R, E, A>): IO<R | R1 | R2, E | E1 | E2, A> => {
123
123
  return self.matchCauseIO(
124
124
  (cause) =>
125
- cause.failureOrCause.match(
126
- (e) => onFailure(e).flatMap(() => IO.failCauseNow(cause)),
127
- () => IO.failCauseNow(cause),
128
- ),
125
+ cause.failureOrCause.match({
126
+ Left: (e) => onFailure(e).flatMap(() => IO.failCauseNow(cause)),
127
+ Right: () => IO.failCauseNow(cause),
128
+ }),
129
129
  (a) => onSuccess(a).zipRight(IO.succeedNow(a)),
130
130
  );
131
131
  };
@@ -200,7 +200,8 @@ export function catchAllCause<R, E, A, R1, E1, A1>(f: (_: Cause<E>) => IO<R1, E1
200
200
  export function catchJust<E, R1, E1, A1>(f: (e: E) => Maybe<IO<R1, E1, A1>>, __tsplusTrace?: string) {
201
201
  return <R, A>(ma: IO<R, E, A>): IO<R | R1, E | E1, A | A1> => {
202
202
  return ma.matchCauseIO(
203
- (cause) => cause.failureOrCause.match((e) => f(e).getOrElse(IO.failCauseNow(cause)), IO.failCauseNow),
203
+ (cause) =>
204
+ cause.failureOrCause.match({ Left: (e) => f(e).getOrElse(IO.failCauseNow(cause)), Right: IO.failCauseNow }),
204
205
  IO.succeedNow,
205
206
  );
206
207
  };
@@ -804,7 +805,7 @@ export function forever<R, E, A>(ma: IO<R, E, A>, __tsplusTrace?: string): IO<R,
804
805
  * @tsplus static fncts.io.IOOps fromEither
805
806
  */
806
807
  export function fromEither<E, A>(either: Lazy<Either<E, A>>, __tsplusTrace?: string): IO<never, E, A> {
807
- return IO.succeed(either).flatMap((ea) => ea.match(IO.failNow, IO.succeedNow));
808
+ return IO.succeed(either).flatMap((ea) => ea.match({ Left: IO.failNow, Right: IO.succeedNow }));
808
809
  }
809
810
 
810
811
  /**
@@ -814,7 +815,7 @@ export function fromEither<E, A>(either: Lazy<Either<E, A>>, __tsplusTrace?: str
814
815
  * @tsplus getter fncts.Either toIO
815
816
  */
816
817
  export function fromEitherNow<E, A>(either: Either<E, A>, __tsplusTrace?: string): IO<never, E, A> {
817
- return either.match(IO.failNow, IO.succeedNow);
818
+ return either.match({ Left: IO.failNow, Right: IO.succeedNow });
818
819
  }
819
820
 
820
821
  /**
@@ -1249,7 +1250,10 @@ export function matchIO<R1, R2, E, E1, E2, A, A1, A2>(
1249
1250
  __tsplusTrace?: string,
1250
1251
  ) {
1251
1252
  return <R>(self: IO<R, E, A>): IO<R | R1 | R2, E1 | E2, A1 | A2> => {
1252
- return self.matchCauseIO((cause) => cause.failureOrCause.match(onFailure, IO.failCauseNow), onSuccess);
1253
+ return self.matchCauseIO(
1254
+ (cause) => cause.failureOrCause.match({ Left: onFailure, Right: IO.failCauseNow }),
1255
+ onSuccess,
1256
+ );
1253
1257
  };
1254
1258
  }
1255
1259
 
@@ -1281,7 +1285,7 @@ export function matchTraceIO<E, A, R1, E1, A1, R2, E2, A2>(
1281
1285
  ) {
1282
1286
  return <R>(ma: IO<R, E, A>): IO<R | R1 | R2, E1 | E2, A1 | A2> => {
1283
1287
  return ma.matchCauseIO(
1284
- (cause) => cause.failureTraceOrCause.match(([e, trace]) => onFailure(e, trace), IO.failCauseNow),
1288
+ (cause) => cause.failureTraceOrCause.match({ Left: ([e, trace]) => onFailure(e, trace), Right: IO.failCauseNow }),
1285
1289
  onSuccess,
1286
1290
  );
1287
1291
  };
@@ -1786,7 +1790,7 @@ export function tryCatch<E, A>(effect: Lazy<A>, onThrow: (error: unknown) => E,
1786
1790
  * @tsplus getter fncts.io.IO absolve
1787
1791
  */
1788
1792
  export function absolve<R, E, E1, A>(ma: IO<R, E, Either<E1, A>>, __tsplusTrace?: string): IO<R, E | E1, A> {
1789
- return ma.flatMap((ea) => ea.match(IO.failNow, IO.succeedNow));
1793
+ return ma.flatMap((ea) => ea.match({ Left: IO.failNow, Right: IO.succeedNow }));
1790
1794
  }
1791
1795
 
1792
1796
  /**
@@ -1824,10 +1828,10 @@ export function tapError<E, R1, E1>(f: (e: E) => IO<R1, E1, any>, __tsplusTrace?
1824
1828
  return <R, A>(self: IO<R, E, A>) =>
1825
1829
  self.matchCauseIO(
1826
1830
  (cause) =>
1827
- cause.failureOrCause.match(
1828
- (e) => f(e).flatMap(() => IO.failCauseNow(cause)),
1829
- (_) => IO.failCauseNow(cause),
1830
- ),
1831
+ cause.failureOrCause.match({
1832
+ Left: (e) => f(e).flatMap(() => IO.failCauseNow(cause)),
1833
+ Right: (_) => IO.failCauseNow(cause),
1834
+ }),
1831
1835
  IO.succeedNow,
1832
1836
  );
1833
1837
  }
@@ -33,9 +33,11 @@ export abstract class IO<R, E, A> {
33
33
  };
34
34
  }
35
35
 
36
- export type EnvironmentOf<T> = [T] extends [{ [IOVariance]: { _R: () => infer R } }] ? R : never;
37
- export type ErrorOf<T> = [T] extends [{ [IOVariance]: { _E: () => infer E } }] ? E : never;
38
- export type ValueOf<T> = [T] extends [{ [IOVariance]: { _A: () => infer A } }] ? A : never;
36
+ export declare namespace IO {
37
+ export type EnvironmentOf<T> = [T] extends [{ [IOVariance]: { _R: () => infer R } }] ? R : never;
38
+ export type ErrorOf<T> = [T] extends [{ [IOVariance]: { _E: () => infer E } }] ? E : never;
39
+ export type ValueOf<T> = [T] extends [{ [IOVariance]: { _A: () => infer A } }] ? A : never;
40
+ }
39
41
 
40
42
  declare module "@fncts/base/data/Either/definition" {
41
43
  interface Either<E, A> extends IO<never, E, A> {}
@@ -96,9 +96,12 @@ export class Runtime<R> {
96
96
  };
97
97
 
98
98
  unsafeRun = <E, A>(io: IO<R, E, A>, __tsplusTrace?: string): Exit<E, A> => {
99
- return this.unsafeRunOrFork(io).match(() => {
100
- throw new Error("Encountered async boundary");
101
- }, Function.identity);
99
+ return this.unsafeRunOrFork(io).match({
100
+ Left: () => {
101
+ throw new Error("Encountered async boundary");
102
+ },
103
+ Right: Function.identity,
104
+ });
102
105
  };
103
106
  }
104
107
 
package/_src/Layer/api.ts CHANGED
@@ -205,7 +205,10 @@ export function matchLayer<E, ROut, RIn1, E1, ROut1, RIn2, E2, ROut2>(
205
205
  __tsplusTrace?: string,
206
206
  ) {
207
207
  return <RIn>(self: Layer<RIn, E, ROut>): Layer<RIn | RIn1 | RIn2, E1 | E2, ROut1 | ROut2> => {
208
- return self.matchCauseLayer((cause) => cause.failureOrCause.match(failure, Layer.failCauseNow), success);
208
+ return self.matchCauseLayer(
209
+ (cause) => cause.failureOrCause.match({ Left: failure, Right: Layer.failCauseNow }),
210
+ success,
211
+ );
209
212
  };
210
213
  }
211
214
 
package/_src/Push/api.ts CHANGED
@@ -36,10 +36,10 @@ export function asyncInterrupt<R, E, A>(
36
36
  };
37
37
  const eitherPush = Δ(IO(make(unsafeSink)));
38
38
  Δ(
39
- eitherPush.match(
40
- (canceller) => future.await.onInterrupt(canceller),
41
- (push) => push.run(sink),
42
- ),
39
+ eitherPush.match({
40
+ Left: (canceller) => future.await.onInterrupt(canceller),
41
+ Right: (push) => push.run(sink),
42
+ }),
43
43
  );
44
44
  }).scoped,
45
45
  );