@fncts/io 0.0.38 → 0.0.39

Sign up to get free protection for your applications and to get access to all the features.
Files changed (163) 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/_cjs/Channel/api/mapOutConcurrentIO.cjs +8 -2
  5. package/_cjs/Channel/api/mapOutConcurrentIO.cjs.map +1 -1
  6. package/_cjs/Channel/api/mergeAllWith.cjs +23 -14
  7. package/_cjs/Channel/api/mergeAllWith.cjs.map +1 -1
  8. package/_cjs/Channel/api/mergeWith.cjs +16 -4
  9. package/_cjs/Channel/api/mergeWith.cjs.map +1 -1
  10. package/_cjs/Channel/api.cjs +131 -36
  11. package/_cjs/Channel/api.cjs.map +1 -1
  12. package/_cjs/Channel/core-api.cjs +13 -3
  13. package/_cjs/Channel/core-api.cjs.map +1 -1
  14. package/_cjs/Channel/definition.cjs +18 -143
  15. package/_cjs/Channel/definition.cjs.map +1 -1
  16. package/_cjs/Channel/internal/ChannelExecutor.cjs +51 -49
  17. package/_cjs/Channel/internal/ChannelExecutor.cjs.map +1 -1
  18. package/_cjs/Channel/internal/SingleProducerAsyncInput.cjs +8 -2
  19. package/_cjs/Channel/internal/SingleProducerAsyncInput.cjs.map +1 -1
  20. package/_cjs/Console/live.cjs +1 -1
  21. package/_cjs/Console/live.cjs.map +1 -1
  22. package/_cjs/Fiber/FiberRuntime.cjs +23 -18
  23. package/_cjs/Fiber/FiberRuntime.cjs.map +1 -1
  24. package/_cjs/FiberRef/definition.cjs +3 -1
  25. package/_cjs/FiberRef/definition.cjs.map +1 -1
  26. package/_cjs/FiberRef/unsafe.cjs +6 -1
  27. package/_cjs/FiberRef/unsafe.cjs.map +1 -1
  28. package/_cjs/Future/api.cjs +12 -12
  29. package/_cjs/Future/api.cjs.map +1 -1
  30. package/_cjs/Future/definition.cjs +10 -3
  31. package/_cjs/Future/definition.cjs.map +1 -1
  32. package/_cjs/IO/api/asyncInterrupt.cjs +7 -4
  33. package/_cjs/IO/api/asyncInterrupt.cjs.map +1 -1
  34. package/_cjs/IO/api.cjs +38 -14
  35. package/_cjs/IO/api.cjs.map +1 -1
  36. package/_cjs/IO/runtime.cjs +6 -3
  37. package/_cjs/IO/runtime.cjs.map +1 -1
  38. package/_cjs/Layer/api.cjs +4 -1
  39. package/_cjs/Layer/api.cjs.map +1 -1
  40. package/_cjs/Push/api.cjs +4 -1
  41. package/_cjs/Push/api.cjs.map +1 -1
  42. package/_cjs/Ref/Derived.cjs +35 -8
  43. package/_cjs/Ref/Derived.cjs.map +1 -1
  44. package/_cjs/Ref/DerivedAll.cjs +35 -8
  45. package/_cjs/Ref/DerivedAll.cjs.map +1 -1
  46. package/_cjs/RuntimeFlags/RuntimeFlags.cjs +3 -4
  47. package/_cjs/RuntimeFlags/RuntimeFlags.cjs.map +1 -1
  48. package/_cjs/STM/api/core-api.cjs +4 -1
  49. package/_cjs/STM/api/core-api.cjs.map +1 -1
  50. package/_cjs/STM/api.cjs +16 -4
  51. package/_cjs/STM/api.cjs.map +1 -1
  52. package/_cjs/Schedule/api.cjs +7 -1
  53. package/_cjs/Schedule/api.cjs.map +1 -1
  54. package/_cjs/ScopedRef/api.cjs +2 -2
  55. package/_cjs/ScopedRef/api.cjs.map +1 -1
  56. package/_cjs/Sink/api.cjs +7 -1
  57. package/_cjs/Sink/api.cjs.map +1 -1
  58. package/_cjs/Stream/api/zipAllWith.cjs +4 -1
  59. package/_cjs/Stream/api/zipAllWith.cjs.map +1 -1
  60. package/_cjs/Stream/api/zipWithChunks.cjs +4 -1
  61. package/_cjs/Stream/api/zipWithChunks.cjs.map +1 -1
  62. package/_cjs/Stream/api.cjs +36 -15
  63. package/_cjs/Stream/api.cjs.map +1 -1
  64. package/_cjs/SupervisorPatch.cjs +38 -15
  65. package/_cjs/SupervisorPatch.cjs.map +1 -1
  66. package/_cjs/TRef/definition.cjs +74 -20
  67. package/_cjs/TRef/definition.cjs.map +1 -1
  68. package/_mjs/Channel/api/mapOutConcurrentIO.mjs +8 -2
  69. package/_mjs/Channel/api/mapOutConcurrentIO.mjs.map +1 -1
  70. package/_mjs/Channel/api/mergeAllWith.mjs +23 -14
  71. package/_mjs/Channel/api/mergeAllWith.mjs.map +1 -1
  72. package/_mjs/Channel/api/mergeWith.mjs +16 -4
  73. package/_mjs/Channel/api/mergeWith.mjs.map +1 -1
  74. package/_mjs/Channel/api.mjs +132 -37
  75. package/_mjs/Channel/api.mjs.map +1 -1
  76. package/_mjs/Channel/core-api.mjs +14 -4
  77. package/_mjs/Channel/core-api.mjs.map +1 -1
  78. package/_mjs/Channel/definition.mjs +14 -135
  79. package/_mjs/Channel/definition.mjs.map +1 -1
  80. package/_mjs/Channel/internal/ChannelExecutor.mjs +52 -50
  81. package/_mjs/Channel/internal/ChannelExecutor.mjs.map +1 -1
  82. package/_mjs/Channel/internal/SingleProducerAsyncInput.mjs +8 -2
  83. package/_mjs/Channel/internal/SingleProducerAsyncInput.mjs.map +1 -1
  84. package/_mjs/Console/live.mjs +1 -1
  85. package/_mjs/Console/live.mjs.map +1 -1
  86. package/_mjs/Fiber/FiberRuntime.mjs +23 -18
  87. package/_mjs/Fiber/FiberRuntime.mjs.map +1 -1
  88. package/_mjs/FiberRef/definition.mjs +3 -1
  89. package/_mjs/FiberRef/definition.mjs.map +1 -1
  90. package/_mjs/FiberRef/unsafe.mjs +4 -0
  91. package/_mjs/FiberRef/unsafe.mjs.map +1 -1
  92. package/_mjs/Future/api.mjs +12 -12
  93. package/_mjs/Future/api.mjs.map +1 -1
  94. package/_mjs/Future/definition.mjs +7 -2
  95. package/_mjs/Future/definition.mjs.map +1 -1
  96. package/_mjs/IO/api/asyncInterrupt.mjs +7 -4
  97. package/_mjs/IO/api/asyncInterrupt.mjs.map +1 -1
  98. package/_mjs/IO/api.mjs +38 -14
  99. package/_mjs/IO/api.mjs.map +1 -1
  100. package/_mjs/IO/runtime.mjs +6 -3
  101. package/_mjs/IO/runtime.mjs.map +1 -1
  102. package/_mjs/Layer/api.mjs +4 -1
  103. package/_mjs/Layer/api.mjs.map +1 -1
  104. package/_mjs/Push/api.mjs +4 -1
  105. package/_mjs/Push/api.mjs.map +1 -1
  106. package/_mjs/Ref/Derived.mjs +35 -8
  107. package/_mjs/Ref/Derived.mjs.map +1 -1
  108. package/_mjs/Ref/DerivedAll.mjs +35 -8
  109. package/_mjs/Ref/DerivedAll.mjs.map +1 -1
  110. package/_mjs/RuntimeFlags/RuntimeFlags.mjs +3 -4
  111. package/_mjs/RuntimeFlags/RuntimeFlags.mjs.map +1 -1
  112. package/_mjs/STM/api/core-api.mjs +4 -1
  113. package/_mjs/STM/api/core-api.mjs.map +1 -1
  114. package/_mjs/STM/api.mjs +16 -4
  115. package/_mjs/STM/api.mjs.map +1 -1
  116. package/_mjs/Schedule/api.mjs +7 -1
  117. package/_mjs/Schedule/api.mjs.map +1 -1
  118. package/_mjs/ScopedRef/api.mjs +2 -2
  119. package/_mjs/ScopedRef/api.mjs.map +1 -1
  120. package/_mjs/Sink/api.mjs +7 -1
  121. package/_mjs/Sink/api.mjs.map +1 -1
  122. package/_mjs/Stream/api/zipAllWith.mjs +4 -1
  123. package/_mjs/Stream/api/zipAllWith.mjs.map +1 -1
  124. package/_mjs/Stream/api/zipWithChunks.mjs +4 -1
  125. package/_mjs/Stream/api/zipWithChunks.mjs.map +1 -1
  126. package/_mjs/Stream/api.mjs +36 -15
  127. package/_mjs/Stream/api.mjs.map +1 -1
  128. package/_mjs/SupervisorPatch.mjs +38 -15
  129. package/_mjs/SupervisorPatch.mjs.map +1 -1
  130. package/_mjs/TRef/definition.mjs +74 -20
  131. package/_mjs/TRef/definition.mjs.map +1 -1
  132. package/_src/Channel/api/mapOutConcurrentIO.ts +5 -5
  133. package/_src/Channel/api/mergeAllWith.ts +9 -9
  134. package/_src/Channel/api/mergeWith.ts +16 -16
  135. package/_src/Channel/api.ts +128 -143
  136. package/_src/Channel/core-api.ts +17 -14
  137. package/_src/Channel/definition.ts +187 -236
  138. package/_src/Channel/internal/ChannelExecutor.ts +47 -45
  139. package/_src/Channel/internal/SingleProducerAsyncInput.ts +2 -2
  140. package/_src/Console/live.ts +1 -1
  141. package/_src/Fiber/FiberRuntime.ts +6 -3
  142. package/_src/FiberRef/definition.ts +4 -1
  143. package/_src/FiberRef/unsafe.ts +5 -0
  144. package/_src/Future/definition.ts +19 -3
  145. package/_src/IO/api/asyncInterrupt.ts +4 -4
  146. package/_src/IO/api.ts +19 -15
  147. package/_src/IO/runtime.ts +6 -3
  148. package/_src/Layer/api.ts +4 -1
  149. package/_src/Push/api.ts +4 -4
  150. package/_src/Ref/Derived.ts +20 -18
  151. package/_src/Ref/DerivedAll.ts +21 -18
  152. package/_src/RuntimeFlags/RuntimeFlags.ts +1 -1
  153. package/_src/STM/api/core-api.ts +1 -1
  154. package/_src/STM/api.ts +4 -4
  155. package/_src/Schedule/api.ts +8 -8
  156. package/_src/ScopedRef/api.ts +4 -3
  157. package/_src/Sink/api.ts +8 -8
  158. package/_src/Stream/api/zipAllWith.ts +4 -4
  159. package/_src/Stream/api/zipWithChunks.ts +4 -4
  160. package/_src/Stream/api.ts +21 -19
  161. package/_src/SupervisorPatch.ts +1 -0
  162. package/_src/TRef/definition.ts +36 -33
  163. 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> {
@@ -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
  }
@@ -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
  );
@@ -35,8 +35,8 @@ export class Derived<EA, EB, A, B> extends RefInternal<never, never, EA, EB, A,
35
35
  new Derived<EC, ED, C, D>((f) =>
36
36
  f(
37
37
  value,
38
- (s) => getEither(s).match((e) => Either.left(eb(e)), bd),
39
- (c) => ca(c).flatMap((a) => setEither(a).match((e) => Either.left(ea(e)), Either.right)),
38
+ (s) => getEither(s).match({ Left: (e) => Either.left(eb(e)), Right: bd }),
39
+ (c) => ca(c).flatMap((a) => setEither(a).match({ Left: (e) => Either.left(ea(e)), Right: Either.right })),
40
40
  ),
41
41
  ),
42
42
  );
@@ -54,41 +54,43 @@ export class Derived<EA, EB, A, B> extends RefInternal<never, never, EA, EB, A,
54
54
  new DerivedAll<EC, ED, C, D>((f) =>
55
55
  f(
56
56
  value,
57
- (s) => getEither(s).match((e) => Either.left(eb(e)), bd),
57
+ (s) => getEither(s).match({ Left: (e) => Either.left(eb(e)), Right: bd }),
58
58
  (c) => (s) =>
59
59
  getEither(s)
60
- .match(
61
- (eb) => Either.left(ec(eb)),
62
- (b) => ca(c)(b),
63
- )
64
- .flatMap((a) => setEither(a).match((e) => Either.left(ea(e)), Either.right)),
60
+ .match({
61
+ Left: (eb) => Either.left(ec(eb)),
62
+ Right: (b) => ca(c)(b),
63
+ })
64
+ .flatMap((a) => setEither(a).match({ Left: (e) => Either.left(ea(e)), Right: Either.right })),
65
65
  ),
66
66
  ),
67
67
  );
68
68
  }
69
69
 
70
70
  get get(): FIO<EB, B> {
71
- return this.use((value, getEither) => value.get.flatMap((s) => getEither(s).match(IO.failNow, IO.succeedNow)));
71
+ return this.use((value, getEither) =>
72
+ value.get.flatMap((s) => getEither(s).match({ Left: IO.failNow, Right: IO.succeedNow })),
73
+ );
72
74
  }
73
75
 
74
76
  set(a: A): FIO<EA, void> {
75
- return this.use((value, _, setEither) => setEither(a).match(IO.failNow, (s) => value.set(s)));
77
+ return this.use((value, _, setEither) => setEither(a).match({ Left: IO.failNow, Right: (s) => value.set(s) }));
76
78
  }
77
79
 
78
80
  modify<C>(f: (b: B) => readonly [C, A], __tsplusTrace?: string | undefined): IO<never, EA | EB, C> {
79
81
  return this.use(
80
82
  (value, getEither, setEither) =>
81
83
  value.modify((s) =>
82
- getEither(s).match(
83
- (e) => tuple(Either.left(e), s),
84
- (a1) => {
84
+ getEither(s).match({
85
+ Left: (e) => tuple(Either.left(e), s),
86
+ Right: (a1) => {
85
87
  const [b, a2] = f(a1);
86
- return setEither(a2).match(
87
- (e) => tuple(Either.left(e), s),
88
- (s) => tuple(Either.right<EA | EB, C>(b), s),
89
- );
88
+ return setEither(a2).match({
89
+ Left: (e) => tuple(Either.left(e), s),
90
+ Right: (s) => tuple(Either.right<EA | EB, C>(b), s),
91
+ });
90
92
  },
91
- ),
93
+ }),
92
94
  ).absolve,
93
95
  );
94
96
  }