@@ -158,6 +158,30 @@ export const makeRuntime = <R, K, E = unknown, A = unknown>(): Effect.Effect<
158
158
( self ) => runtime ( self ) < R > ( )
159
159
)
160
160
161
+ /**
162
+ * Create an Effect run function that is backed by a FiberMap.
163
+ *
164
+ * @since 3.13.0
165
+ * @categories constructors
166
+ */
167
+ export const makeRuntimePromise = < R , K , A = unknown , E = unknown > ( ) : Effect . Effect <
168
+ < XE extends E , XA extends A > (
169
+ key : K ,
170
+ effect : Effect . Effect < XA , XE , R > ,
171
+ options ?:
172
+ | Runtime . RunForkOptions & {
173
+ readonly onlyIfMissing ?: boolean | undefined
174
+ }
175
+ | undefined
176
+ ) => Promise < XA > ,
177
+ never ,
178
+ Scope . Scope | R
179
+ > =>
180
+ Effect . flatMap (
181
+ make < K , A , E > ( ) ,
182
+ ( self ) => runtimePromise ( self ) < R > ( )
183
+ )
184
+
161
185
const internalFiberIdId = - 1
162
186
const internalFiberId = FiberId . make ( internalFiberIdId , 0 )
163
187
const isInternalInterruption = Cause . reduceWithContext ( undefined , {
@@ -539,6 +563,48 @@ export const runtime: <K, A, E>(
539
563
}
540
564
)
541
565
566
+ /**
567
+ * Capture a Runtime and use it to fork Effect's, adding the forked fibers to the FiberMap.
568
+ *
569
+ * @since 3.13.0
570
+ * @categories combinators
571
+ */
572
+ export const runtimePromise = < K , A , E > ( self : FiberMap < K , A , E > ) : < R = never > ( ) => Effect . Effect <
573
+ < XE extends E , XA extends A > (
574
+ key : K ,
575
+ effect : Effect . Effect < XA , XE , R > ,
576
+ options ?:
577
+ | Runtime . RunForkOptions & {
578
+ readonly onlyIfMissing ?: boolean | undefined
579
+ readonly propagateInterruption ?: boolean | undefined
580
+ }
581
+ | undefined
582
+ ) => Promise < XA > ,
583
+ never ,
584
+ R
585
+ > =>
586
+ < R > ( ) =>
587
+ Effect . map (
588
+ runtime ( self ) < R > ( ) ,
589
+ ( runFork ) =>
590
+ < XE extends E , XA extends A > (
591
+ key : K ,
592
+ effect : Effect . Effect < XA , XE , R > ,
593
+ options ?:
594
+ | Runtime . RunForkOptions & { readonly propagateInterruption ?: boolean | undefined }
595
+ | undefined
596
+ ) : Promise < XA > =>
597
+ new Promise ( ( resolve , reject ) =>
598
+ runFork ( key , effect , options ) . addObserver ( ( exit ) => {
599
+ if ( Exit . isSuccess ( exit ) ) {
600
+ resolve ( exit . value )
601
+ } else {
602
+ reject ( Cause . squash ( exit . cause ) )
603
+ }
604
+ } )
605
+ )
606
+ )
607
+
542
608
/**
543
609
* @since 2.0.0
544
610
* @categories combinators
0 commit comments