effect 3.11.1 → 3.11.2
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.
- package/dist/cjs/Micro.js +100 -85
- package/dist/cjs/Micro.js.map +1 -1
- package/dist/cjs/internal/version.js +1 -1
- package/dist/dts/Micro.d.ts +148 -120
- package/dist/dts/Micro.d.ts.map +1 -1
- package/dist/esm/Micro.js +100 -85
- package/dist/esm/Micro.js.map +1 -1
- package/dist/esm/internal/version.js +1 -1
- package/package.json +1 -1
- package/src/Micro.ts +201 -172
- package/src/internal/version.ts +1 -1
package/src/Micro.ts
CHANGED
|
@@ -169,7 +169,15 @@ export const MicroCauseTypeId = Symbol.for("effect/Micro/MicroCause")
|
|
|
169
169
|
export type MicroCauseTypeId = typeof MicroCauseTypeId
|
|
170
170
|
|
|
171
171
|
/**
|
|
172
|
-
* A
|
|
172
|
+
* A `MicroCause` is a data type that represents the different ways a `Micro` can fail.
|
|
173
|
+
*
|
|
174
|
+
* **Details**
|
|
175
|
+
*
|
|
176
|
+
* `MicroCause` comes in three forms:
|
|
177
|
+
*
|
|
178
|
+
* - `Die`: Indicates an unforeseen defect that wasn't planned for in the system's logic.
|
|
179
|
+
* - `Fail`: Covers anticipated errors that are recognized and typically handled within the application.
|
|
180
|
+
* - `Interrupt`: Signifies an operation that has been purposefully stopped.
|
|
173
181
|
*
|
|
174
182
|
* @since 3.4.6
|
|
175
183
|
* @experimental
|
|
@@ -290,7 +298,7 @@ abstract class MicroCauseImpl<Tag extends string, E> extends globalThis.Error im
|
|
|
290
298
|
}
|
|
291
299
|
}
|
|
292
300
|
|
|
293
|
-
class
|
|
301
|
+
class Fail<E> extends MicroCauseImpl<"Fail", E> implements MicroCause.Fail<E> {
|
|
294
302
|
constructor(
|
|
295
303
|
readonly error: E,
|
|
296
304
|
traces: ReadonlyArray<string> = []
|
|
@@ -307,9 +315,9 @@ class FailImpl<E> extends MicroCauseImpl<"Fail", E> implements MicroCause.Fail<E
|
|
|
307
315
|
export const causeFail = <E>(
|
|
308
316
|
error: E,
|
|
309
317
|
traces: ReadonlyArray<string> = []
|
|
310
|
-
): MicroCause<E> => new
|
|
318
|
+
): MicroCause<E> => new Fail(error, traces)
|
|
311
319
|
|
|
312
|
-
class
|
|
320
|
+
class Die extends MicroCauseImpl<"Die", never> implements MicroCause.Die {
|
|
313
321
|
constructor(
|
|
314
322
|
readonly defect: unknown,
|
|
315
323
|
traces: ReadonlyArray<string> = []
|
|
@@ -326,9 +334,9 @@ class DieImpl extends MicroCauseImpl<"Die", never> implements MicroCause.Die {
|
|
|
326
334
|
export const causeDie = (
|
|
327
335
|
defect: unknown,
|
|
328
336
|
traces: ReadonlyArray<string> = []
|
|
329
|
-
): MicroCause<never> => new
|
|
337
|
+
): MicroCause<never> => new Die(defect, traces)
|
|
330
338
|
|
|
331
|
-
class
|
|
339
|
+
class Interrupt extends MicroCauseImpl<"Interrupt", never> implements MicroCause.Interrupt {
|
|
332
340
|
constructor(traces: ReadonlyArray<string> = []) {
|
|
333
341
|
super("Interrupt", "interrupted", traces)
|
|
334
342
|
}
|
|
@@ -341,7 +349,7 @@ class InterruptImpl extends MicroCauseImpl<"Interrupt", never> implements MicroC
|
|
|
341
349
|
*/
|
|
342
350
|
export const causeInterrupt = (
|
|
343
351
|
traces: ReadonlyArray<string> = []
|
|
344
|
-
): MicroCause<never> => new
|
|
352
|
+
): MicroCause<never> => new Interrupt(traces)
|
|
345
353
|
|
|
346
354
|
/**
|
|
347
355
|
* @since 3.4.6
|
|
@@ -407,30 +415,30 @@ export const causeWithTrace: {
|
|
|
407
415
|
})
|
|
408
416
|
|
|
409
417
|
// ----------------------------------------------------------------------------
|
|
410
|
-
//
|
|
418
|
+
// MicroFiber
|
|
411
419
|
// ----------------------------------------------------------------------------
|
|
412
420
|
|
|
413
421
|
/**
|
|
414
422
|
* @since 3.11.0
|
|
415
423
|
* @experimental
|
|
416
|
-
* @category
|
|
424
|
+
* @category MicroFiber
|
|
417
425
|
*/
|
|
418
|
-
export const
|
|
426
|
+
export const MicroFiberTypeId = Symbol.for("effect/Micro/MicroFiber")
|
|
419
427
|
|
|
420
428
|
/**
|
|
421
429
|
* @since 3.11.0
|
|
422
430
|
* @experimental
|
|
423
|
-
* @category
|
|
431
|
+
* @category MicroFiber
|
|
424
432
|
*/
|
|
425
|
-
export type
|
|
433
|
+
export type MicroFiberTypeId = typeof MicroFiberTypeId
|
|
426
434
|
|
|
427
435
|
/**
|
|
428
436
|
* @since 3.11.0
|
|
429
437
|
* @experimental
|
|
430
|
-
* @category
|
|
438
|
+
* @category MicroFiber
|
|
431
439
|
*/
|
|
432
|
-
export interface
|
|
433
|
-
readonly [
|
|
440
|
+
export interface MicroFiber<out A, out E = never> {
|
|
441
|
+
readonly [MicroFiberTypeId]: MicroFiber.Variance<A, E>
|
|
434
442
|
|
|
435
443
|
readonly currentOpCount: number
|
|
436
444
|
readonly getRef: <I, A>(ref: Context.Reference<I, A>) => A
|
|
@@ -443,13 +451,13 @@ export interface Fiber<out A, out E = never> {
|
|
|
443
451
|
/**
|
|
444
452
|
* @since 3.11.0
|
|
445
453
|
* @experimental
|
|
446
|
-
* @category
|
|
454
|
+
* @category MicroFiber
|
|
447
455
|
*/
|
|
448
|
-
export declare namespace
|
|
456
|
+
export declare namespace MicroFiber {
|
|
449
457
|
/**
|
|
450
458
|
* @since 3.11.0
|
|
451
459
|
* @experimental
|
|
452
|
-
* @category
|
|
460
|
+
* @category MicroFiber
|
|
453
461
|
*/
|
|
454
462
|
export interface Variance<out A, out E = never> {
|
|
455
463
|
readonly _A: Covariant<A>
|
|
@@ -462,13 +470,13 @@ const fiberVariance = {
|
|
|
462
470
|
_E: identity
|
|
463
471
|
}
|
|
464
472
|
|
|
465
|
-
class
|
|
466
|
-
readonly [
|
|
473
|
+
class MicroFiberImpl<in out A = any, in out E = any> implements MicroFiber<A, E> {
|
|
474
|
+
readonly [MicroFiberTypeId]: MicroFiber.Variance<A, E>
|
|
467
475
|
|
|
468
476
|
readonly _stack: Array<Primitive> = []
|
|
469
477
|
readonly _observers: Array<(exit: MicroExit<A, E>) => void> = []
|
|
470
478
|
_exit: MicroExit<A, E> | undefined
|
|
471
|
-
public _children: Set<
|
|
479
|
+
public _children: Set<MicroFiberImpl<any, any>> | undefined
|
|
472
480
|
|
|
473
481
|
public currentOpCount = 0
|
|
474
482
|
|
|
@@ -476,7 +484,7 @@ class FiberImpl<in out A = any, in out E = any> implements Fiber<A, E> {
|
|
|
476
484
|
public context: Context.Context<never>,
|
|
477
485
|
public interruptible = true
|
|
478
486
|
) {
|
|
479
|
-
this[
|
|
487
|
+
this[MicroFiberTypeId] = fiberVariance
|
|
480
488
|
}
|
|
481
489
|
|
|
482
490
|
getRef<I, A>(ref: Context.Reference<I, A>): A {
|
|
@@ -563,7 +571,7 @@ class FiberImpl<in out A = any, in out E = any> implements Fiber<A, E> {
|
|
|
563
571
|
}
|
|
564
572
|
} catch (error) {
|
|
565
573
|
if (!hasProperty(current, evaluate)) {
|
|
566
|
-
return exitDie(`
|
|
574
|
+
return exitDie(`MicroFiber.runLoop: Not a valid effect: ${String(current)}`)
|
|
567
575
|
}
|
|
568
576
|
return exitDie(error)
|
|
569
577
|
}
|
|
@@ -571,7 +579,7 @@ class FiberImpl<in out A = any, in out E = any> implements Fiber<A, E> {
|
|
|
571
579
|
|
|
572
580
|
getCont<S extends successCont | failureCont>(
|
|
573
581
|
symbol: S
|
|
574
|
-
): Primitive & Record<S, (value: any, fiber:
|
|
582
|
+
): Primitive & Record<S, (value: any, fiber: MicroFiberImpl) => Primitive> | undefined {
|
|
575
583
|
while (true) {
|
|
576
584
|
const op = this._stack.pop()
|
|
577
585
|
if (!op) return undefined
|
|
@@ -588,16 +596,16 @@ class FiberImpl<in out A = any, in out E = any> implements Fiber<A, E> {
|
|
|
588
596
|
return Yield
|
|
589
597
|
}
|
|
590
598
|
|
|
591
|
-
children(): Set<
|
|
599
|
+
children(): Set<MicroFiber<any, any>> {
|
|
592
600
|
return this._children ??= new Set()
|
|
593
601
|
}
|
|
594
602
|
}
|
|
595
603
|
|
|
596
604
|
const fiberMiddleware = globalValue("effect/Micro/fiberMiddleware", () => ({
|
|
597
|
-
interruptChildren: undefined as ((fiber:
|
|
605
|
+
interruptChildren: undefined as ((fiber: MicroFiberImpl) => Micro<void> | undefined) | undefined
|
|
598
606
|
}))
|
|
599
607
|
|
|
600
|
-
const fiberInterruptChildren = (fiber:
|
|
608
|
+
const fiberInterruptChildren = (fiber: MicroFiberImpl) => {
|
|
601
609
|
if (fiber._children === undefined || fiber._children.size === 0) {
|
|
602
610
|
return undefined
|
|
603
611
|
}
|
|
@@ -607,17 +615,24 @@ const fiberInterruptChildren = (fiber: FiberImpl) => {
|
|
|
607
615
|
/**
|
|
608
616
|
* @since 3.11.0
|
|
609
617
|
* @experimental
|
|
610
|
-
* @category
|
|
618
|
+
* @category MicroFiber
|
|
611
619
|
*/
|
|
612
|
-
export const fiberAwait = <A, E>(self:
|
|
620
|
+
export const fiberAwait = <A, E>(self: MicroFiber<A, E>): Micro<MicroExit<A, E>> =>
|
|
613
621
|
async((resume) => sync(self.addObserver((exit) => resume(succeed(exit)))))
|
|
614
622
|
|
|
623
|
+
/**
|
|
624
|
+
* @since 3.11.2
|
|
625
|
+
* @experimental
|
|
626
|
+
* @category MicroFiber
|
|
627
|
+
*/
|
|
628
|
+
export const fiberJoin = <A, E>(self: MicroFiber<A, E>): Micro<A, E> => flatten(fiberAwait(self))
|
|
629
|
+
|
|
615
630
|
/**
|
|
616
631
|
* @since 3.11.0
|
|
617
632
|
* @experimental
|
|
618
|
-
* @category
|
|
633
|
+
* @category MicroFiber
|
|
619
634
|
*/
|
|
620
|
-
export const fiberInterrupt = <A, E>(self:
|
|
635
|
+
export const fiberInterrupt = <A, E>(self: MicroFiber<A, E>): Micro<void> =>
|
|
621
636
|
suspend(() => {
|
|
622
637
|
self.unsafeInterrupt()
|
|
623
638
|
return asVoid(fiberAwait(self))
|
|
@@ -626,9 +641,9 @@ export const fiberInterrupt = <A, E>(self: Fiber<A, E>): Micro<void> =>
|
|
|
626
641
|
/**
|
|
627
642
|
* @since 3.11.0
|
|
628
643
|
* @experimental
|
|
629
|
-
* @category
|
|
644
|
+
* @category MicroFiber
|
|
630
645
|
*/
|
|
631
|
-
export const fiberInterruptAll = <A extends Iterable<
|
|
646
|
+
export const fiberInterruptAll = <A extends Iterable<MicroFiber<any, any>>>(fibers: A): Micro<void> =>
|
|
632
647
|
suspend(() => {
|
|
633
648
|
for (const fiber of fibers) fiber.unsafeInterrupt()
|
|
634
649
|
const iter = fibers[Symbol.iterator]()
|
|
@@ -674,16 +689,16 @@ type Yield = typeof Yield
|
|
|
674
689
|
|
|
675
690
|
interface Primitive {
|
|
676
691
|
readonly [identifier]: string
|
|
677
|
-
readonly [successCont]: ((value: unknown, fiber:
|
|
692
|
+
readonly [successCont]: ((value: unknown, fiber: MicroFiberImpl) => Primitive | Yield) | undefined
|
|
678
693
|
readonly [failureCont]:
|
|
679
|
-
| ((cause: MicroCause<unknown>, fiber:
|
|
694
|
+
| ((cause: MicroCause<unknown>, fiber: MicroFiberImpl) => Primitive | Yield)
|
|
680
695
|
| undefined
|
|
681
696
|
readonly [ensureCont]:
|
|
682
|
-
| ((fiber:
|
|
683
|
-
| ((value: unknown, fiber:
|
|
697
|
+
| ((fiber: MicroFiberImpl) =>
|
|
698
|
+
| ((value: unknown, fiber: MicroFiberImpl) => Primitive | Yield)
|
|
684
699
|
| undefined)
|
|
685
700
|
| undefined
|
|
686
|
-
[evaluate](fiber:
|
|
701
|
+
[evaluate](fiber: MicroFiberImpl): Primitive | Yield
|
|
687
702
|
}
|
|
688
703
|
|
|
689
704
|
const microVariance = {
|
|
@@ -704,7 +719,7 @@ const MicroProto = {
|
|
|
704
719
|
},
|
|
705
720
|
toJSON(this: Primitive) {
|
|
706
721
|
return {
|
|
707
|
-
_id: "
|
|
722
|
+
_id: "Micro",
|
|
708
723
|
op: this[identifier],
|
|
709
724
|
...(args in this ? { args: this[args] } : undefined)
|
|
710
725
|
}
|
|
@@ -717,20 +732,20 @@ const MicroProto = {
|
|
|
717
732
|
}
|
|
718
733
|
}
|
|
719
734
|
|
|
720
|
-
function defaultEvaluate(_fiber:
|
|
735
|
+
function defaultEvaluate(_fiber: MicroFiberImpl): Primitive | Yield {
|
|
721
736
|
return exitDie(`Micro.evaluate: Not implemented`) as any
|
|
722
737
|
}
|
|
723
738
|
|
|
724
739
|
const makePrimitiveProto = <Op extends string>(options: {
|
|
725
740
|
readonly op: Op
|
|
726
|
-
readonly eval?: (fiber:
|
|
727
|
-
readonly contA?: (this: Primitive, value: any, fiber:
|
|
741
|
+
readonly eval?: (fiber: MicroFiberImpl) => Primitive | Micro<any, any, any> | Yield
|
|
742
|
+
readonly contA?: (this: Primitive, value: any, fiber: MicroFiberImpl) => Primitive | Micro<any, any, any> | Yield
|
|
728
743
|
readonly contE?: (
|
|
729
744
|
this: Primitive,
|
|
730
745
|
cause: MicroCause<any>,
|
|
731
|
-
fiber:
|
|
746
|
+
fiber: MicroFiberImpl
|
|
732
747
|
) => Primitive | Micro<any, any, any> | Yield
|
|
733
|
-
readonly ensure?: (this: Primitive, fiber:
|
|
748
|
+
readonly ensure?: (this: Primitive, fiber: MicroFiberImpl) => void | ((value: any, fiber: MicroFiberImpl) => void)
|
|
734
749
|
}): Primitive => ({
|
|
735
750
|
...MicroProto,
|
|
736
751
|
[identifier]: options.op,
|
|
@@ -745,22 +760,22 @@ const makePrimitive = <Fn extends (...args: Array<any>) => any, Single extends b
|
|
|
745
760
|
readonly single?: Single
|
|
746
761
|
readonly eval?: (
|
|
747
762
|
this: Primitive & { readonly [args]: Single extends true ? Parameters<Fn>[0] : Parameters<Fn> },
|
|
748
|
-
fiber:
|
|
763
|
+
fiber: MicroFiberImpl
|
|
749
764
|
) => Primitive | Micro<any, any, any> | Yield
|
|
750
765
|
readonly contA?: (
|
|
751
766
|
this: Primitive & { readonly [args]: Single extends true ? Parameters<Fn>[0] : Parameters<Fn> },
|
|
752
767
|
value: any,
|
|
753
|
-
fiber:
|
|
768
|
+
fiber: MicroFiberImpl
|
|
754
769
|
) => Primitive | Micro<any, any, any> | Yield
|
|
755
770
|
readonly contE?: (
|
|
756
771
|
this: Primitive & { readonly [args]: Single extends true ? Parameters<Fn>[0] : Parameters<Fn> },
|
|
757
772
|
cause: MicroCause<any>,
|
|
758
|
-
fiber:
|
|
773
|
+
fiber: MicroFiberImpl
|
|
759
774
|
) => Primitive | Micro<any, any, any> | Yield
|
|
760
775
|
readonly ensure?: (
|
|
761
776
|
this: Primitive & { readonly [args]: Single extends true ? Parameters<Fn>[0] : Parameters<Fn> },
|
|
762
|
-
fiber:
|
|
763
|
-
) => void | ((value: any, fiber:
|
|
777
|
+
fiber: MicroFiberImpl
|
|
778
|
+
) => void | ((value: any, fiber: MicroFiberImpl) => void)
|
|
764
779
|
}): Fn => {
|
|
765
780
|
const Proto = makePrimitiveProto(options as any)
|
|
766
781
|
return function() {
|
|
@@ -777,7 +792,7 @@ const makeExit = <Fn extends (...args: Array<any>) => any, Prop extends string>(
|
|
|
777
792
|
this:
|
|
778
793
|
& MicroExit<unknown, unknown>
|
|
779
794
|
& { [args]: Parameters<Fn>[0] },
|
|
780
|
-
fiber:
|
|
795
|
+
fiber: MicroFiberImpl<unknown, unknown>
|
|
781
796
|
) => Primitive | Yield
|
|
782
797
|
}): Fn => {
|
|
783
798
|
const Proto = {
|
|
@@ -789,7 +804,7 @@ const makeExit = <Fn extends (...args: Array<any>) => any, Prop extends string>(
|
|
|
789
804
|
},
|
|
790
805
|
toJSON(this: any) {
|
|
791
806
|
return {
|
|
792
|
-
_id: "
|
|
807
|
+
_id: "MicroExit",
|
|
793
808
|
_tag: options.op,
|
|
794
809
|
[options.prop]: this[args]
|
|
795
810
|
}
|
|
@@ -848,10 +863,10 @@ export const failCause: <E>(cause: MicroCause<E>) => Micro<never, E> = makeExit(
|
|
|
848
863
|
})
|
|
849
864
|
|
|
850
865
|
/**
|
|
851
|
-
* Creates a `Micro` effect that
|
|
866
|
+
* Creates a `Micro` effect that fails with the given error.
|
|
852
867
|
*
|
|
853
|
-
* This
|
|
854
|
-
* type level.
|
|
868
|
+
* This results in a `Fail` variant of the `MicroCause` type, where the error is
|
|
869
|
+
* tracked at the type level.
|
|
855
870
|
*
|
|
856
871
|
* @since 3.4.0
|
|
857
872
|
* @experimental
|
|
@@ -860,10 +875,10 @@ export const failCause: <E>(cause: MicroCause<E>) => Micro<never, E> = makeExit(
|
|
|
860
875
|
export const fail = <E>(error: E): Micro<never, E> => failCause(causeFail(error))
|
|
861
876
|
|
|
862
877
|
/**
|
|
863
|
-
* Creates a `Micro` effect that
|
|
878
|
+
* Creates a `Micro` effect that succeeds with a lazily evaluated value.
|
|
864
879
|
*
|
|
865
|
-
* If the evaluation of the value throws an error, the effect will fail with
|
|
866
|
-
* `
|
|
880
|
+
* If the evaluation of the value throws an error, the effect will fail with a
|
|
881
|
+
* `Die` variant of the `MicroCause` type.
|
|
867
882
|
*
|
|
868
883
|
* @since 3.4.0
|
|
869
884
|
* @experimental
|
|
@@ -925,7 +940,7 @@ export const yieldNowWith: (priority?: number) => Micro<void> = makePrimitive({
|
|
|
925
940
|
export const yieldNow: Micro<void> = yieldNowWith(0)
|
|
926
941
|
|
|
927
942
|
/**
|
|
928
|
-
* Creates a `Micro` effect that will succeed with
|
|
943
|
+
* Creates a `Micro` effect that will succeed with the value wrapped in `Some`.
|
|
929
944
|
*
|
|
930
945
|
* @since 3.4.0
|
|
931
946
|
* @experimental
|
|
@@ -934,7 +949,7 @@ export const yieldNow: Micro<void> = yieldNowWith(0)
|
|
|
934
949
|
export const succeedSome = <A>(a: A): Micro<Option.Option<A>> => succeed(Option.some(a))
|
|
935
950
|
|
|
936
951
|
/**
|
|
937
|
-
* Creates a `Micro` effect that
|
|
952
|
+
* Creates a `Micro` effect that succeeds with `None`.
|
|
938
953
|
*
|
|
939
954
|
* @since 3.4.0
|
|
940
955
|
* @experimental
|
|
@@ -955,8 +970,8 @@ export const failCauseSync = <E>(evaluate: LazyArg<MicroCause<E>>): Micro<never,
|
|
|
955
970
|
/**
|
|
956
971
|
* Creates a `Micro` effect that will die with the specified error.
|
|
957
972
|
*
|
|
958
|
-
* This
|
|
959
|
-
* the type level.
|
|
973
|
+
* This results in a `Die` variant of the `MicroCause` type, where the error is
|
|
974
|
+
* not tracked at the type level.
|
|
960
975
|
*
|
|
961
976
|
* @since 3.4.0
|
|
962
977
|
* @experimental
|
|
@@ -967,8 +982,8 @@ export const die = (defect: unknown): Micro<never> => exitDie(defect)
|
|
|
967
982
|
/**
|
|
968
983
|
* Creates a `Micro` effect that will fail with the lazily evaluated error.
|
|
969
984
|
*
|
|
970
|
-
* This
|
|
971
|
-
* type level.
|
|
985
|
+
* This results in a `Fail` variant of the `MicroCause` type, where the error is
|
|
986
|
+
* tracked at the type level.
|
|
972
987
|
*
|
|
973
988
|
* @since 3.4.6
|
|
974
989
|
* @experimental
|
|
@@ -1028,9 +1043,6 @@ export {
|
|
|
1028
1043
|
* The `Micro` equivalent of a try / catch block, which allows you to map
|
|
1029
1044
|
* thrown errors to a specific error type.
|
|
1030
1045
|
*
|
|
1031
|
-
* @since 3.4.0
|
|
1032
|
-
* @experimental
|
|
1033
|
-
* @category constructors
|
|
1034
1046
|
* @example
|
|
1035
1047
|
* ```ts
|
|
1036
1048
|
* import { Micro } from "effect"
|
|
@@ -1040,13 +1052,19 @@ export {
|
|
|
1040
1052
|
* catch: (cause) => new Error("caught", { cause })
|
|
1041
1053
|
* })
|
|
1042
1054
|
* ```
|
|
1055
|
+
*
|
|
1056
|
+
* @since 3.4.0
|
|
1057
|
+
* @experimental
|
|
1058
|
+
* @category constructors
|
|
1043
1059
|
*/
|
|
1044
1060
|
try_ as try
|
|
1045
1061
|
}
|
|
1046
1062
|
|
|
1047
1063
|
/**
|
|
1048
|
-
* Wrap a `Promise` into a `Micro` effect.
|
|
1049
|
-
*
|
|
1064
|
+
* Wrap a `Promise` into a `Micro` effect.
|
|
1065
|
+
*
|
|
1066
|
+
* Any errors will result in a `Die` variant of the `MicroCause` type, where the
|
|
1067
|
+
* error is not tracked at the type level.
|
|
1050
1068
|
*
|
|
1051
1069
|
* @since 3.4.0
|
|
1052
1070
|
* @experimental
|
|
@@ -1064,9 +1082,6 @@ export const promise = <A>(evaluate: (signal: AbortSignal) => PromiseLike<A>): M
|
|
|
1064
1082
|
* Wrap a `Promise` into a `Micro` effect. Any errors will be caught and
|
|
1065
1083
|
* converted into a specific error type.
|
|
1066
1084
|
*
|
|
1067
|
-
* @since 3.4.0
|
|
1068
|
-
* @experimental
|
|
1069
|
-
* @category constructors
|
|
1070
1085
|
* @example
|
|
1071
1086
|
* ```ts
|
|
1072
1087
|
* import { Micro } from "effect"
|
|
@@ -1076,6 +1091,10 @@ export const promise = <A>(evaluate: (signal: AbortSignal) => PromiseLike<A>): M
|
|
|
1076
1091
|
* catch: (cause) => new Error("caught", { cause })
|
|
1077
1092
|
* })
|
|
1078
1093
|
* ```
|
|
1094
|
+
*
|
|
1095
|
+
* @since 3.4.0
|
|
1096
|
+
* @experimental
|
|
1097
|
+
* @category constructors
|
|
1079
1098
|
*/
|
|
1080
1099
|
export const tryPromise = <A, E>(options: {
|
|
1081
1100
|
readonly try: (signal: AbortSignal) => PromiseLike<A>
|
|
@@ -1093,16 +1112,16 @@ export const tryPromise = <A, E>(options: {
|
|
|
1093
1112
|
}, options.try.length !== 0)
|
|
1094
1113
|
|
|
1095
1114
|
/**
|
|
1096
|
-
* Create a `Micro` effect using the current `
|
|
1115
|
+
* Create a `Micro` effect using the current `MicroFiber`.
|
|
1097
1116
|
*
|
|
1098
1117
|
* @since 3.4.0
|
|
1099
1118
|
* @experimental
|
|
1100
1119
|
* @category constructors
|
|
1101
1120
|
*/
|
|
1102
|
-
export const
|
|
1103
|
-
evaluate: (fiber:
|
|
1121
|
+
export const withMicroFiber: <A, E = never, R = never>(
|
|
1122
|
+
evaluate: (fiber: MicroFiberImpl<A, E>) => Micro<A, E, R>
|
|
1104
1123
|
) => Micro<A, E, R> = makePrimitive({
|
|
1105
|
-
op: "
|
|
1124
|
+
op: "WithMicroFiber",
|
|
1106
1125
|
eval(fiber) {
|
|
1107
1126
|
return this[args](fiber)
|
|
1108
1127
|
}
|
|
@@ -1115,7 +1134,7 @@ export const withFiber: <A, E = never, R = never>(
|
|
|
1115
1134
|
* @experimental
|
|
1116
1135
|
* @category constructors
|
|
1117
1136
|
*/
|
|
1118
|
-
export const yieldFlush: Micro<void> =
|
|
1137
|
+
export const yieldFlush: Micro<void> = withMicroFiber((fiber) => {
|
|
1119
1138
|
fiber.getRef(CurrentScheduler).flush()
|
|
1120
1139
|
return exitVoid
|
|
1121
1140
|
})
|
|
@@ -1230,7 +1249,7 @@ const fromIterator: (
|
|
|
1230
1249
|
fiber._stack.push(this)
|
|
1231
1250
|
return yieldWrapGet(state.value)
|
|
1232
1251
|
},
|
|
1233
|
-
eval(this: any, fiber:
|
|
1252
|
+
eval(this: any, fiber: MicroFiberImpl) {
|
|
1234
1253
|
return this[successCont](undefined, fiber)
|
|
1235
1254
|
}
|
|
1236
1255
|
})
|
|
@@ -1277,7 +1296,7 @@ export const as: {
|
|
|
1277
1296
|
} = dual(2, <A, E, R, B>(self: Micro<A, E, R>, value: B): Micro<B, E, R> => map(self, (_) => value))
|
|
1278
1297
|
|
|
1279
1298
|
/**
|
|
1280
|
-
* Wrap the success value of this `Micro` effect in
|
|
1299
|
+
* Wrap the success value of this `Micro` effect in a `Some`.
|
|
1281
1300
|
*
|
|
1282
1301
|
* @since 3.4.0
|
|
1283
1302
|
* @experimental
|
|
@@ -1299,11 +1318,11 @@ export const flip = <A, E, R>(self: Micro<A, E, R>): Micro<E, A, R> =>
|
|
|
1299
1318
|
})
|
|
1300
1319
|
|
|
1301
1320
|
/**
|
|
1302
|
-
* A more flexible version of `flatMap
|
|
1303
|
-
*
|
|
1321
|
+
* A more flexible version of `flatMap` that combines `map` and `flatMap` into a
|
|
1322
|
+
* single API.
|
|
1304
1323
|
*
|
|
1305
|
-
* It also
|
|
1306
|
-
*
|
|
1324
|
+
* It also lets you directly pass a `Micro` effect, which will be executed after
|
|
1325
|
+
* the current effect.
|
|
1307
1326
|
*
|
|
1308
1327
|
* @since 3.4.0
|
|
1309
1328
|
* @experimental
|
|
@@ -1311,11 +1330,11 @@ export const flip = <A, E, R>(self: Micro<A, E, R>): Micro<E, A, R> =>
|
|
|
1311
1330
|
*/
|
|
1312
1331
|
export const andThen: {
|
|
1313
1332
|
/**
|
|
1314
|
-
* A more flexible version of `flatMap
|
|
1315
|
-
*
|
|
1333
|
+
* A more flexible version of `flatMap` that combines `map` and `flatMap` into a
|
|
1334
|
+
* single API.
|
|
1316
1335
|
*
|
|
1317
|
-
* It also
|
|
1318
|
-
*
|
|
1336
|
+
* It also lets you directly pass a `Micro` effect, which will be executed after
|
|
1337
|
+
* the current effect.
|
|
1319
1338
|
*
|
|
1320
1339
|
* @since 3.4.0
|
|
1321
1340
|
* @experimental
|
|
@@ -1326,11 +1345,11 @@ export const andThen: {
|
|
|
1326
1345
|
) => [X] extends [Micro<infer A1, infer E1, infer R1>] ? Micro<A1, E | E1, R | R1>
|
|
1327
1346
|
: Micro<X, E, R>
|
|
1328
1347
|
/**
|
|
1329
|
-
* A more flexible version of `flatMap
|
|
1330
|
-
*
|
|
1348
|
+
* A more flexible version of `flatMap` that combines `map` and `flatMap` into a
|
|
1349
|
+
* single API.
|
|
1331
1350
|
*
|
|
1332
|
-
* It also
|
|
1333
|
-
*
|
|
1351
|
+
* It also lets you directly pass a `Micro` effect, which will be executed after
|
|
1352
|
+
* the current effect.
|
|
1334
1353
|
*
|
|
1335
1354
|
* @since 3.4.0
|
|
1336
1355
|
* @experimental
|
|
@@ -1341,11 +1360,11 @@ export const andThen: {
|
|
|
1341
1360
|
) => [X] extends [Micro<infer A1, infer E1, infer R1>] ? Micro<A1, E | E1, R | R1>
|
|
1342
1361
|
: Micro<X, E, R>
|
|
1343
1362
|
/**
|
|
1344
|
-
* A more flexible version of `flatMap
|
|
1345
|
-
*
|
|
1363
|
+
* A more flexible version of `flatMap` that combines `map` and `flatMap` into a
|
|
1364
|
+
* single API.
|
|
1346
1365
|
*
|
|
1347
|
-
* It also
|
|
1348
|
-
*
|
|
1366
|
+
* It also lets you directly pass a `Micro` effect, which will be executed after
|
|
1367
|
+
* the current effect.
|
|
1349
1368
|
*
|
|
1350
1369
|
* @since 3.4.0
|
|
1351
1370
|
* @experimental
|
|
@@ -1357,11 +1376,11 @@ export const andThen: {
|
|
|
1357
1376
|
): [X] extends [Micro<infer A1, infer E1, infer R1>] ? Micro<A1, E | E1, R | R1>
|
|
1358
1377
|
: Micro<X, E, R>
|
|
1359
1378
|
/**
|
|
1360
|
-
* A more flexible version of `flatMap
|
|
1361
|
-
*
|
|
1379
|
+
* A more flexible version of `flatMap` that combines `map` and `flatMap` into a
|
|
1380
|
+
* single API.
|
|
1362
1381
|
*
|
|
1363
|
-
* It also
|
|
1364
|
-
*
|
|
1382
|
+
* It also lets you directly pass a `Micro` effect, which will be executed after
|
|
1383
|
+
* the current effect.
|
|
1365
1384
|
*
|
|
1366
1385
|
* @since 3.4.0
|
|
1367
1386
|
* @experimental
|
|
@@ -1497,13 +1516,13 @@ export const sandbox = <A, E, R>(self: Micro<A, E, R>): Micro<A, MicroCause<E>,
|
|
|
1497
1516
|
export const raceAll = <Eff extends Micro<any, any, any>>(
|
|
1498
1517
|
all: Iterable<Eff>
|
|
1499
1518
|
): Micro<Micro.Success<Eff>, Micro.Error<Eff>, Micro.Context<Eff>> =>
|
|
1500
|
-
|
|
1519
|
+
withMicroFiber((parent) =>
|
|
1501
1520
|
async((resume) => {
|
|
1502
1521
|
const effects = Arr.fromIterable(all)
|
|
1503
1522
|
const len = effects.length
|
|
1504
1523
|
let doneCount = 0
|
|
1505
1524
|
let done = false
|
|
1506
|
-
const fibers = new Set<
|
|
1525
|
+
const fibers = new Set<MicroFiber<any, any>>()
|
|
1507
1526
|
const causes: Array<MicroCause<any>> = []
|
|
1508
1527
|
const onExit = (exit: MicroExit<any, any>) => {
|
|
1509
1528
|
doneCount++
|
|
@@ -1535,7 +1554,7 @@ export const raceAll = <Eff extends Micro<any, any, any>>(
|
|
|
1535
1554
|
/**
|
|
1536
1555
|
* Returns an effect that races all the specified effects,
|
|
1537
1556
|
* yielding the value of the first effect to succeed or fail. Losers of
|
|
1538
|
-
* the race will be interrupted immediately
|
|
1557
|
+
* the race will be interrupted immediately.
|
|
1539
1558
|
*
|
|
1540
1559
|
* @since 3.4.0
|
|
1541
1560
|
* @experimental
|
|
@@ -1544,10 +1563,10 @@ export const raceAll = <Eff extends Micro<any, any, any>>(
|
|
|
1544
1563
|
export const raceAllFirst = <Eff extends Micro<any, any, any>>(
|
|
1545
1564
|
all: Iterable<Eff>
|
|
1546
1565
|
): Micro<Micro.Success<Eff>, Micro.Error<Eff>, Micro.Context<Eff>> =>
|
|
1547
|
-
|
|
1566
|
+
withMicroFiber((parent) =>
|
|
1548
1567
|
async((resume) => {
|
|
1549
1568
|
let done = false
|
|
1550
|
-
const fibers = new Set<
|
|
1569
|
+
const fibers = new Set<MicroFiber<any, any>>()
|
|
1551
1570
|
const onExit = (exit: MicroExit<any, any>) => {
|
|
1552
1571
|
done = true
|
|
1553
1572
|
resume(fibers.size === 0 ? exit : flatMap(fiberInterruptAll(fibers), () => exit))
|
|
@@ -1569,7 +1588,7 @@ export const raceAllFirst = <Eff extends Micro<any, any, any>>(
|
|
|
1569
1588
|
|
|
1570
1589
|
/**
|
|
1571
1590
|
* Returns an effect that races two effects, yielding the value of the first
|
|
1572
|
-
* effect to succeed. Losers of the race will be interrupted immediately
|
|
1591
|
+
* effect to succeed. Losers of the race will be interrupted immediately.
|
|
1573
1592
|
*
|
|
1574
1593
|
* @since 3.4.0
|
|
1575
1594
|
* @experimental
|
|
@@ -1578,7 +1597,7 @@ export const raceAllFirst = <Eff extends Micro<any, any, any>>(
|
|
|
1578
1597
|
export const race: {
|
|
1579
1598
|
/**
|
|
1580
1599
|
* Returns an effect that races two effects, yielding the value of the first
|
|
1581
|
-
* effect to succeed. Losers of the race will be interrupted immediately
|
|
1600
|
+
* effect to succeed. Losers of the race will be interrupted immediately.
|
|
1582
1601
|
*
|
|
1583
1602
|
* @since 3.4.0
|
|
1584
1603
|
* @experimental
|
|
@@ -1587,7 +1606,7 @@ export const race: {
|
|
|
1587
1606
|
<A2, E2, R2>(that: Micro<A2, E2, R2>): <A, E, R>(self: Micro<A, E, R>) => Micro<A | A2, E | E2, R | R2>
|
|
1588
1607
|
/**
|
|
1589
1608
|
* Returns an effect that races two effects, yielding the value of the first
|
|
1590
|
-
* effect to succeed. Losers of the race will be interrupted immediately
|
|
1609
|
+
* effect to succeed. Losers of the race will be interrupted immediately.
|
|
1591
1610
|
*
|
|
1592
1611
|
* @since 3.4.0
|
|
1593
1612
|
* @experimental
|
|
@@ -1602,7 +1621,7 @@ export const race: {
|
|
|
1602
1621
|
|
|
1603
1622
|
/**
|
|
1604
1623
|
* Returns an effect that races two effects, yielding the value of the first
|
|
1605
|
-
* effect to succeed *or* fail. Losers of the race will be interrupted immediately
|
|
1624
|
+
* effect to succeed *or* fail. Losers of the race will be interrupted immediately.
|
|
1606
1625
|
*
|
|
1607
1626
|
* @since 3.4.0
|
|
1608
1627
|
* @experimental
|
|
@@ -1611,7 +1630,7 @@ export const race: {
|
|
|
1611
1630
|
export const raceFirst: {
|
|
1612
1631
|
/**
|
|
1613
1632
|
* Returns an effect that races two effects, yielding the value of the first
|
|
1614
|
-
* effect to succeed *or* fail. Losers of the race will be interrupted immediately
|
|
1633
|
+
* effect to succeed *or* fail. Losers of the race will be interrupted immediately.
|
|
1615
1634
|
*
|
|
1616
1635
|
* @since 3.4.0
|
|
1617
1636
|
* @experimental
|
|
@@ -1620,7 +1639,7 @@ export const raceFirst: {
|
|
|
1620
1639
|
<A2, E2, R2>(that: Micro<A2, E2, R2>): <A, E, R>(self: Micro<A, E, R>) => Micro<A | A2, E | E2, R | R2>
|
|
1621
1640
|
/**
|
|
1622
1641
|
* Returns an effect that races two effects, yielding the value of the first
|
|
1623
|
-
* effect to succeed *or* fail. Losers of the race will be interrupted immediately
|
|
1642
|
+
* effect to succeed *or* fail. Losers of the race will be interrupted immediately.
|
|
1624
1643
|
*
|
|
1625
1644
|
* @since 3.4.0
|
|
1626
1645
|
* @experimental
|
|
@@ -1674,7 +1693,7 @@ export const flatMap: {
|
|
|
1674
1693
|
)
|
|
1675
1694
|
const OnSuccessProto = makePrimitiveProto({
|
|
1676
1695
|
op: "OnSuccess",
|
|
1677
|
-
eval(this: any, fiber:
|
|
1696
|
+
eval(this: any, fiber: MicroFiberImpl): Primitive {
|
|
1678
1697
|
fiber._stack.push(this)
|
|
1679
1698
|
return this[args]
|
|
1680
1699
|
}
|
|
@@ -1732,10 +1751,9 @@ export const map: {
|
|
|
1732
1751
|
// ----------------------------------------------------------------------------
|
|
1733
1752
|
|
|
1734
1753
|
/**
|
|
1735
|
-
* The MicroExit type is
|
|
1736
|
-
*
|
|
1737
|
-
*
|
|
1738
|
-
* It uses the `Either` data type to represent the success and failure cases.
|
|
1754
|
+
* The `MicroExit` type is used to represent the result of a `Micro` computation. It
|
|
1755
|
+
* can either be successful, containing a value of type `A`, or it can fail,
|
|
1756
|
+
* containing an error of type `E` wrapped in a `MicroCause`.
|
|
1739
1757
|
*
|
|
1740
1758
|
* @since 3.4.6
|
|
1741
1759
|
* @experimental
|
|
@@ -1908,7 +1926,7 @@ export const exitVoidAll = <I extends Iterable<MicroExit<any, any>>>(
|
|
|
1908
1926
|
*/
|
|
1909
1927
|
export interface MicroScheduler {
|
|
1910
1928
|
readonly scheduleTask: (task: () => void, priority: number) => void
|
|
1911
|
-
readonly shouldYield: (fiber:
|
|
1929
|
+
readonly shouldYield: (fiber: MicroFiber<unknown, unknown>) => boolean
|
|
1912
1930
|
readonly flush: () => void
|
|
1913
1931
|
}
|
|
1914
1932
|
|
|
@@ -1958,7 +1976,7 @@ export class MicroSchedulerDefault implements MicroScheduler {
|
|
|
1958
1976
|
/**
|
|
1959
1977
|
* @since 3.5.9
|
|
1960
1978
|
*/
|
|
1961
|
-
shouldYield(fiber:
|
|
1979
|
+
shouldYield(fiber: MicroFiber<unknown, unknown>) {
|
|
1962
1980
|
return fiber.currentOpCount >= fiber.getRef(MaxOpsBeforeYield)
|
|
1963
1981
|
}
|
|
1964
1982
|
|
|
@@ -1998,7 +2016,7 @@ export const service: {
|
|
|
1998
2016
|
<I, S>(tag: Context.Tag<I, S>): Micro<S, never, I>
|
|
1999
2017
|
} =
|
|
2000
2018
|
(<I, S>(tag: Context.Tag<I, S>): Micro<S, never, I> =>
|
|
2001
|
-
|
|
2019
|
+
withMicroFiber((fiber) => succeed(Context.unsafeGet(fiber.context, tag)))) as any
|
|
2002
2020
|
|
|
2003
2021
|
/**
|
|
2004
2022
|
* Access the given `Context.Tag` from the environment, without tracking the
|
|
@@ -2013,7 +2031,7 @@ export const service: {
|
|
|
2013
2031
|
*/
|
|
2014
2032
|
export const serviceOption = <I, S>(
|
|
2015
2033
|
tag: Context.Tag<I, S>
|
|
2016
|
-
): Micro<Option.Option<S>> =>
|
|
2034
|
+
): Micro<Option.Option<S>> => withMicroFiber((fiber) => succeed(Context.getOption(fiber.context, tag)))
|
|
2017
2035
|
|
|
2018
2036
|
/**
|
|
2019
2037
|
* Update the Context with the given mapping function.
|
|
@@ -2050,7 +2068,7 @@ export const updateContext: {
|
|
|
2050
2068
|
self: Micro<A, E, R>,
|
|
2051
2069
|
f: (context: Context.Context<R2>) => Context.Context<NoInfer<R>>
|
|
2052
2070
|
): Micro<A, E, R2> =>
|
|
2053
|
-
|
|
2071
|
+
withMicroFiber<
|
|
2054
2072
|
/**
|
|
2055
2073
|
* Update the Context with the given mapping function.
|
|
2056
2074
|
*
|
|
@@ -2133,7 +2151,7 @@ export const updateService: {
|
|
|
2133
2151
|
tag: Context.Reference<I, A>,
|
|
2134
2152
|
f: (value: A) => A
|
|
2135
2153
|
): Micro<XA, E, R> =>
|
|
2136
|
-
|
|
2154
|
+
withMicroFiber((fiber) => {
|
|
2137
2155
|
const prev = Context.unsafeGet(fiber.context, tag)
|
|
2138
2156
|
fiber.context = Context.add(fiber.context, tag, f(prev))
|
|
2139
2157
|
return onExit(
|
|
@@ -2154,7 +2172,7 @@ export const updateService: {
|
|
|
2154
2172
|
* @category environment
|
|
2155
2173
|
*/
|
|
2156
2174
|
export const context = <R>(): Micro<Context.Context<R>> => getContext as any
|
|
2157
|
-
const getContext =
|
|
2175
|
+
const getContext = withMicroFiber((fiber) => succeed(fiber.context))
|
|
2158
2176
|
|
|
2159
2177
|
/**
|
|
2160
2178
|
* Merge the given `Context` with the current context.
|
|
@@ -2311,10 +2329,8 @@ export class CurrentScheduler extends Context.Reference<CurrentScheduler>()<
|
|
|
2311
2329
|
* If you have a `Micro` that uses `concurrency: "inherit"`, you can use this
|
|
2312
2330
|
* api to control the concurrency of that `Micro` when it is run.
|
|
2313
2331
|
*
|
|
2314
|
-
* @since 3.4.0
|
|
2315
|
-
* @experimental
|
|
2316
|
-
* @category environment refs
|
|
2317
2332
|
* @example
|
|
2333
|
+
* ```ts
|
|
2318
2334
|
* import * as Micro from "effect/Micro"
|
|
2319
2335
|
*
|
|
2320
2336
|
* Micro.forEach([1, 2, 3], (n) => Micro.succeed(n), {
|
|
@@ -2322,16 +2338,19 @@ export class CurrentScheduler extends Context.Reference<CurrentScheduler>()<
|
|
|
2322
2338
|
* }).pipe(
|
|
2323
2339
|
* Micro.withConcurrency(2) // use a concurrency of 2
|
|
2324
2340
|
* )
|
|
2341
|
+
* ```
|
|
2342
|
+
*
|
|
2343
|
+
* @since 3.4.0
|
|
2344
|
+
* @experimental
|
|
2345
|
+
* @category environment refs
|
|
2325
2346
|
*/
|
|
2326
2347
|
export const withConcurrency: {
|
|
2327
2348
|
/**
|
|
2328
2349
|
* If you have a `Micro` that uses `concurrency: "inherit"`, you can use this
|
|
2329
2350
|
* api to control the concurrency of that `Micro` when it is run.
|
|
2330
2351
|
*
|
|
2331
|
-
* @since 3.4.0
|
|
2332
|
-
* @experimental
|
|
2333
|
-
* @category environment refs
|
|
2334
2352
|
* @example
|
|
2353
|
+
* ```ts
|
|
2335
2354
|
* import * as Micro from "effect/Micro"
|
|
2336
2355
|
*
|
|
2337
2356
|
* Micro.forEach([1, 2, 3], (n) => Micro.succeed(n), {
|
|
@@ -2339,16 +2358,19 @@ export const withConcurrency: {
|
|
|
2339
2358
|
* }).pipe(
|
|
2340
2359
|
* Micro.withConcurrency(2) // use a concurrency of 2
|
|
2341
2360
|
* )
|
|
2361
|
+
* ```
|
|
2362
|
+
*
|
|
2363
|
+
* @since 3.4.0
|
|
2364
|
+
* @experimental
|
|
2365
|
+
* @category environment refs
|
|
2342
2366
|
*/
|
|
2343
2367
|
(concurrency: "unbounded" | number): <A, E, R>(self: Micro<A, E, R>) => Micro<A, E, R>
|
|
2344
2368
|
/**
|
|
2345
2369
|
* If you have a `Micro` that uses `concurrency: "inherit"`, you can use this
|
|
2346
2370
|
* api to control the concurrency of that `Micro` when it is run.
|
|
2347
2371
|
*
|
|
2348
|
-
* @since 3.4.0
|
|
2349
|
-
* @experimental
|
|
2350
|
-
* @category environment refs
|
|
2351
2372
|
* @example
|
|
2373
|
+
* ```ts
|
|
2352
2374
|
* import * as Micro from "effect/Micro"
|
|
2353
2375
|
*
|
|
2354
2376
|
* Micro.forEach([1, 2, 3], (n) => Micro.succeed(n), {
|
|
@@ -2356,6 +2378,11 @@ export const withConcurrency: {
|
|
|
2356
2378
|
* }).pipe(
|
|
2357
2379
|
* Micro.withConcurrency(2) // use a concurrency of 2
|
|
2358
2380
|
* )
|
|
2381
|
+
* ```
|
|
2382
|
+
*
|
|
2383
|
+
* @since 3.4.0
|
|
2384
|
+
* @experimental
|
|
2385
|
+
* @category environment refs
|
|
2359
2386
|
*/
|
|
2360
2387
|
<A, E, R>(self: Micro<A, E, R>, concurrency: "unbounded" | number): Micro<A, E, R>
|
|
2361
2388
|
} = dual(
|
|
@@ -3212,7 +3239,7 @@ export const catchAllCause: {
|
|
|
3212
3239
|
)
|
|
3213
3240
|
const OnFailureProto = makePrimitiveProto({
|
|
3214
3241
|
op: "OnFailure",
|
|
3215
|
-
eval(this: any, fiber:
|
|
3242
|
+
eval(this: any, fiber: MicroFiberImpl): Primitive {
|
|
3216
3243
|
fiber._stack.push(this as any)
|
|
3217
3244
|
return this[args]
|
|
3218
3245
|
}
|
|
@@ -3292,7 +3319,7 @@ export const catchCauseIf: {
|
|
|
3292
3319
|
/**
|
|
3293
3320
|
* Catch the error of the given `Micro` effect, allowing you to recover from it.
|
|
3294
3321
|
*
|
|
3295
|
-
* It only catches expected
|
|
3322
|
+
* It only catches expected errors.
|
|
3296
3323
|
*
|
|
3297
3324
|
* @since 3.4.6
|
|
3298
3325
|
* @experimental
|
|
@@ -3302,7 +3329,7 @@ export const catchAll: {
|
|
|
3302
3329
|
/**
|
|
3303
3330
|
* Catch the error of the given `Micro` effect, allowing you to recover from it.
|
|
3304
3331
|
*
|
|
3305
|
-
* It only catches expected
|
|
3332
|
+
* It only catches expected errors.
|
|
3306
3333
|
*
|
|
3307
3334
|
* @since 3.4.6
|
|
3308
3335
|
* @experimental
|
|
@@ -3312,7 +3339,7 @@ export const catchAll: {
|
|
|
3312
3339
|
/**
|
|
3313
3340
|
* Catch the error of the given `Micro` effect, allowing you to recover from it.
|
|
3314
3341
|
*
|
|
3315
|
-
* It only catches expected
|
|
3342
|
+
* It only catches expected errors.
|
|
3316
3343
|
*
|
|
3317
3344
|
* @since 3.4.6
|
|
3318
3345
|
* @experimental
|
|
@@ -3936,7 +3963,7 @@ export const matchCauseEffect: {
|
|
|
3936
3963
|
)
|
|
3937
3964
|
const OnSuccessAndFailureProto = makePrimitiveProto({
|
|
3938
3965
|
op: "OnSuccessAndFailure",
|
|
3939
|
-
eval(this: any, fiber:
|
|
3966
|
+
eval(this: any, fiber: MicroFiberImpl): Primitive {
|
|
3940
3967
|
fiber._stack.push(this)
|
|
3941
3968
|
return this[args]
|
|
3942
3969
|
}
|
|
@@ -4738,7 +4765,7 @@ export const interrupt: Micro<never> = failCause(causeInterrupt())
|
|
|
4738
4765
|
export const uninterruptible = <A, E, R>(
|
|
4739
4766
|
self: Micro<A, E, R>
|
|
4740
4767
|
): Micro<A, E, R> =>
|
|
4741
|
-
|
|
4768
|
+
withMicroFiber((fiber) => {
|
|
4742
4769
|
if (!fiber.interruptible) return self
|
|
4743
4770
|
fiber.interruptible = false
|
|
4744
4771
|
fiber._stack.push(setInterruptible(true))
|
|
@@ -4766,7 +4793,7 @@ const setInterruptible: (interruptible: boolean) => Primitive = makePrimitive({
|
|
|
4766
4793
|
export const interruptible = <A, E, R>(
|
|
4767
4794
|
self: Micro<A, E, R>
|
|
4768
4795
|
): Micro<A, E, R> =>
|
|
4769
|
-
|
|
4796
|
+
withMicroFiber((fiber) => {
|
|
4770
4797
|
if (fiber.interruptible) return self
|
|
4771
4798
|
fiber.interruptible = true
|
|
4772
4799
|
fiber._stack.push(setInterruptible(false))
|
|
@@ -4781,9 +4808,6 @@ export const interruptible = <A, E, R>(
|
|
|
4781
4808
|
* You can use the `restore` function to restore a `Micro` effect to the
|
|
4782
4809
|
* interruptibility state before the `uninterruptibleMask` was applied.
|
|
4783
4810
|
*
|
|
4784
|
-
* @since 3.4.0
|
|
4785
|
-
* @experimental
|
|
4786
|
-
* @category interruption
|
|
4787
4811
|
* @example
|
|
4788
4812
|
* ```ts
|
|
4789
4813
|
* import * as Micro from "effect/Micro"
|
|
@@ -4794,13 +4818,17 @@ export const interruptible = <A, E, R>(
|
|
|
4794
4818
|
* )
|
|
4795
4819
|
* )
|
|
4796
4820
|
* ```
|
|
4821
|
+
*
|
|
4822
|
+
* @since 3.4.0
|
|
4823
|
+
* @experimental
|
|
4824
|
+
* @category interruption
|
|
4797
4825
|
*/
|
|
4798
4826
|
export const uninterruptibleMask = <A, E, R>(
|
|
4799
4827
|
f: (
|
|
4800
4828
|
restore: <A, E, R>(effect: Micro<A, E, R>) => Micro<A, E, R>
|
|
4801
4829
|
) => Micro<A, E, R>
|
|
4802
4830
|
): Micro<A, E, R> =>
|
|
4803
|
-
|
|
4831
|
+
withMicroFiber((fiber) => {
|
|
4804
4832
|
if (!fiber.interruptible) return f(identity)
|
|
4805
4833
|
fiber.interruptible = false
|
|
4806
4834
|
fiber._stack.push(setInterruptible(true))
|
|
@@ -5017,7 +5045,7 @@ export const forEach: {
|
|
|
5017
5045
|
readonly concurrency?: Concurrency | undefined
|
|
5018
5046
|
readonly discard?: boolean | undefined
|
|
5019
5047
|
}): Micro<any, E, R> =>
|
|
5020
|
-
|
|
5048
|
+
withMicroFiber((parent) => {
|
|
5021
5049
|
const concurrencyOption = options?.concurrency === "inherit"
|
|
5022
5050
|
? parent.getRef(CurrentConcurrency)
|
|
5023
5051
|
: options?.concurrency ?? 1
|
|
@@ -5047,7 +5075,7 @@ export const forEach: {
|
|
|
5047
5075
|
)
|
|
5048
5076
|
}
|
|
5049
5077
|
return async((resume) => {
|
|
5050
|
-
const fibers = new Set<
|
|
5078
|
+
const fibers = new Set<MicroFiber<unknown, unknown>>()
|
|
5051
5079
|
let result: MicroExit<any, any> | undefined = undefined
|
|
5052
5080
|
let inProgress = 0
|
|
5053
5081
|
let doneCount = 0
|
|
@@ -5253,30 +5281,30 @@ export {
|
|
|
5253
5281
|
// ----------------------------------------------------------------------------
|
|
5254
5282
|
|
|
5255
5283
|
/**
|
|
5256
|
-
* Run the `Micro` effect in a new `
|
|
5284
|
+
* Run the `Micro` effect in a new `MicroFiber` that can be awaited, joined, or
|
|
5257
5285
|
* aborted.
|
|
5258
5286
|
*
|
|
5259
5287
|
* When the parent `Micro` finishes, this `Micro` will be aborted.
|
|
5260
5288
|
*
|
|
5261
5289
|
* @since 3.4.0
|
|
5262
5290
|
* @experimental
|
|
5263
|
-
* @category
|
|
5291
|
+
* @category fiber & forking
|
|
5264
5292
|
*/
|
|
5265
5293
|
export const fork = <A, E, R>(
|
|
5266
5294
|
self: Micro<A, E, R>
|
|
5267
|
-
): Micro<
|
|
5268
|
-
|
|
5295
|
+
): Micro<MicroFiber<A, E>, never, R> =>
|
|
5296
|
+
withMicroFiber((fiber) => {
|
|
5269
5297
|
fiberMiddleware.interruptChildren ??= fiberInterruptChildren
|
|
5270
5298
|
return succeed(unsafeFork(fiber, self))
|
|
5271
5299
|
})
|
|
5272
5300
|
|
|
5273
5301
|
const unsafeFork = <FA, FE, A, E, R>(
|
|
5274
|
-
parent:
|
|
5302
|
+
parent: MicroFiberImpl<FA, FE>,
|
|
5275
5303
|
effect: Micro<A, E, R>,
|
|
5276
5304
|
immediate = false,
|
|
5277
5305
|
daemon = false
|
|
5278
|
-
):
|
|
5279
|
-
const child = new
|
|
5306
|
+
): MicroFiber<A, E> => {
|
|
5307
|
+
const child = new MicroFiberImpl<A, E>(parent.context, parent.interruptible)
|
|
5280
5308
|
if (!daemon) {
|
|
5281
5309
|
parent.children().add(child)
|
|
5282
5310
|
child.addObserver(() => parent.children().delete(child))
|
|
@@ -5290,55 +5318,55 @@ const unsafeFork = <FA, FE, A, E, R>(
|
|
|
5290
5318
|
}
|
|
5291
5319
|
|
|
5292
5320
|
/**
|
|
5293
|
-
* Run the `Micro` effect in a new `
|
|
5321
|
+
* Run the `Micro` effect in a new `MicroFiber` that can be awaited, joined, or
|
|
5294
5322
|
* aborted.
|
|
5295
5323
|
*
|
|
5296
5324
|
* It will not be aborted when the parent `Micro` finishes.
|
|
5297
5325
|
*
|
|
5298
5326
|
* @since 3.4.0
|
|
5299
5327
|
* @experimental
|
|
5300
|
-
* @category
|
|
5328
|
+
* @category fiber & forking
|
|
5301
5329
|
*/
|
|
5302
5330
|
export const forkDaemon = <A, E, R>(
|
|
5303
5331
|
self: Micro<A, E, R>
|
|
5304
|
-
): Micro<
|
|
5332
|
+
): Micro<MicroFiber<A, E>, never, R> => withMicroFiber((fiber) => succeed(unsafeFork(fiber, self, false, true)))
|
|
5305
5333
|
|
|
5306
5334
|
/**
|
|
5307
|
-
* Run the `Micro` effect in a new `
|
|
5335
|
+
* Run the `Micro` effect in a new `MicroFiber` that can be awaited, joined, or
|
|
5308
5336
|
* aborted.
|
|
5309
5337
|
*
|
|
5310
5338
|
* The lifetime of the handle will be attached to the provided `MicroScope`.
|
|
5311
5339
|
*
|
|
5312
5340
|
* @since 3.4.0
|
|
5313
5341
|
* @experimental
|
|
5314
|
-
* @category
|
|
5342
|
+
* @category fiber & forking
|
|
5315
5343
|
*/
|
|
5316
5344
|
export const forkIn: {
|
|
5317
5345
|
/**
|
|
5318
|
-
* Run the `Micro` effect in a new `
|
|
5346
|
+
* Run the `Micro` effect in a new `MicroFiber` that can be awaited, joined, or
|
|
5319
5347
|
* aborted.
|
|
5320
5348
|
*
|
|
5321
5349
|
* The lifetime of the handle will be attached to the provided `MicroScope`.
|
|
5322
5350
|
*
|
|
5323
5351
|
* @since 3.4.0
|
|
5324
5352
|
* @experimental
|
|
5325
|
-
* @category
|
|
5353
|
+
* @category fiber & forking
|
|
5326
5354
|
*/
|
|
5327
|
-
(scope: MicroScope): <A, E, R>(self: Micro<A, E, R>) => Micro<
|
|
5355
|
+
(scope: MicroScope): <A, E, R>(self: Micro<A, E, R>) => Micro<MicroFiber<A, E>, never, R>
|
|
5328
5356
|
/**
|
|
5329
|
-
* Run the `Micro` effect in a new `
|
|
5357
|
+
* Run the `Micro` effect in a new `MicroFiber` that can be awaited, joined, or
|
|
5330
5358
|
* aborted.
|
|
5331
5359
|
*
|
|
5332
5360
|
* The lifetime of the handle will be attached to the provided `MicroScope`.
|
|
5333
5361
|
*
|
|
5334
5362
|
* @since 3.4.0
|
|
5335
5363
|
* @experimental
|
|
5336
|
-
* @category
|
|
5364
|
+
* @category fiber & forking
|
|
5337
5365
|
*/
|
|
5338
|
-
<A, E, R>(self: Micro<A, E, R>, scope: MicroScope): Micro<
|
|
5366
|
+
<A, E, R>(self: Micro<A, E, R>, scope: MicroScope): Micro<MicroFiber<A, E>, never, R>
|
|
5339
5367
|
} = dual(
|
|
5340
5368
|
2,
|
|
5341
|
-
<A, E, R>(self: Micro<A, E, R>, scope: MicroScope): Micro<
|
|
5369
|
+
<A, E, R>(self: Micro<A, E, R>, scope: MicroScope): Micro<MicroFiber<A, E>, never, R> =>
|
|
5342
5370
|
uninterruptibleMask((restore) =>
|
|
5343
5371
|
flatMap(scope.fork, (scope) =>
|
|
5344
5372
|
tap(
|
|
@@ -5349,16 +5377,16 @@ export const forkIn: {
|
|
|
5349
5377
|
)
|
|
5350
5378
|
|
|
5351
5379
|
/**
|
|
5352
|
-
* Run the `Micro` effect in a new `
|
|
5380
|
+
* Run the `Micro` effect in a new `MicroFiber` that can be awaited, joined, or
|
|
5353
5381
|
* aborted.
|
|
5354
5382
|
*
|
|
5355
5383
|
* The lifetime of the handle will be attached to the current `MicroScope`.
|
|
5356
5384
|
*
|
|
5357
5385
|
* @since 3.4.0
|
|
5358
5386
|
* @experimental
|
|
5359
|
-
* @category
|
|
5387
|
+
* @category fiber & forking
|
|
5360
5388
|
*/
|
|
5361
|
-
export const forkScoped = <A, E, R>(self: Micro<A, E, R>): Micro<
|
|
5389
|
+
export const forkScoped = <A, E, R>(self: Micro<A, E, R>): Micro<MicroFiber<A, E>, never, R | MicroScope> =>
|
|
5362
5390
|
flatMap(scope, (scope) => forkIn(self, scope))
|
|
5363
5391
|
|
|
5364
5392
|
// ----------------------------------------------------------------------------
|
|
@@ -5366,15 +5394,12 @@ export const forkScoped = <A, E, R>(self: Micro<A, E, R>): Micro<Fiber<A, E>, ne
|
|
|
5366
5394
|
// ----------------------------------------------------------------------------
|
|
5367
5395
|
|
|
5368
5396
|
/**
|
|
5369
|
-
* Execute the `Micro` effect and return a `
|
|
5397
|
+
* Execute the `Micro` effect and return a `MicroFiber` that can be awaited, joined,
|
|
5370
5398
|
* or aborted.
|
|
5371
5399
|
*
|
|
5372
5400
|
* You can listen for the result by adding an observer using the handle's
|
|
5373
5401
|
* `addObserver` method.
|
|
5374
5402
|
*
|
|
5375
|
-
* @since 3.4.0
|
|
5376
|
-
* @experimental
|
|
5377
|
-
* @category execution
|
|
5378
5403
|
* @example
|
|
5379
5404
|
* ```ts
|
|
5380
5405
|
* import * as Micro from "effect/Micro"
|
|
@@ -5388,6 +5413,10 @@ export const forkScoped = <A, E, R>(self: Micro<A, E, R>): Micro<Fiber<A, E>, ne
|
|
|
5388
5413
|
* console.log(exit)
|
|
5389
5414
|
* })
|
|
5390
5415
|
* ```
|
|
5416
|
+
*
|
|
5417
|
+
* @since 3.4.0
|
|
5418
|
+
* @experimental
|
|
5419
|
+
* @category execution
|
|
5391
5420
|
*/
|
|
5392
5421
|
export const runFork = <A, E>(
|
|
5393
5422
|
effect: Micro<A, E>,
|
|
@@ -5395,8 +5424,8 @@ export const runFork = <A, E>(
|
|
|
5395
5424
|
readonly signal?: AbortSignal | undefined
|
|
5396
5425
|
readonly scheduler?: MicroScheduler | undefined
|
|
5397
5426
|
} | undefined
|
|
5398
|
-
):
|
|
5399
|
-
const fiber = new
|
|
5427
|
+
): MicroFiberImpl<A, E> => {
|
|
5428
|
+
const fiber = new MicroFiberImpl<A, E>(CurrentScheduler.context(
|
|
5400
5429
|
options?.scheduler ?? new MicroSchedulerDefault()
|
|
5401
5430
|
))
|
|
5402
5431
|
fiber.evaluate(effect as any)
|
|
@@ -5458,7 +5487,7 @@ export const runPromise = <A, E>(
|
|
|
5458
5487
|
* Attempt to execute the `Micro` effect synchronously and return the `MicroExit`.
|
|
5459
5488
|
*
|
|
5460
5489
|
* If any asynchronous effects are encountered, the function will return a
|
|
5461
|
-
* `CauseDie` containing the `
|
|
5490
|
+
* `CauseDie` containing the `MicroFiber`.
|
|
5462
5491
|
*
|
|
5463
5492
|
* @since 3.4.6
|
|
5464
5493
|
* @experimental
|