@@ -4,7 +4,7 @@ export interface Runner<A, E = never> {
44 readonly state : State < A , E >
55 readonly busy : boolean
66 readonly ensureRunning : ( work : Effect . Effect < A , E > ) => Effect . Effect < A , E >
7- readonly startShell : ( work : Effect . Effect < A , E > ) => Effect . Effect < A , E >
7+ readonly startShell : ( work : Effect . Effect < A , E > , ready ?: Deferred . Deferred < void > ) => Effect . Effect < A , E >
88 readonly cancel : Effect . Effect < void >
99}
1010
@@ -19,6 +19,7 @@ interface RunHandle<A, E> {
1919interface ShellHandle < A , E > {
2020 id : number
2121 cancelled : Deferred . Deferred < void >
22+ ready ?: Deferred . Deferred < void >
2223 fiber : Fiber . Fiber < A , E >
2324}
2425
@@ -106,6 +107,7 @@ export const make = <A, E = never>(
106107
107108 const stopShell = ( shell : ShellHandle < A , E > ) =>
108109 Effect . gen ( function * ( ) {
110+ if ( shell . ready ) yield * Deferred . await ( shell . ready ) . pipe ( Effect . exit , Effect . asVoid )
109111 yield * Deferred . succeed ( shell . cancelled , undefined ) . pipe ( Effect . asVoid )
110112 yield * Fiber . interrupt ( shell . fiber )
111113 } )
@@ -135,7 +137,7 @@ export const make = <A, E = never>(
135137 } ) ,
136138 ) . pipe ( Effect . flatten )
137139
138- const startShell = ( work : Effect . Effect < A , E > ) =>
140+ const startShell = ( work : Effect . Effect < A , E > , ready ?: Deferred . Deferred < void > ) =>
139141 SynchronizedRef . modifyEffect (
140142 ref ,
141143 Effect . fnUntraced ( function * ( st ) {
@@ -152,12 +154,12 @@ export const make = <A, E = never>(
152154 const id = next ( )
153155 const cancelled = yield * Deferred . make < void > ( )
154156 const fiber = yield * work . pipe ( Effect . ensuring ( finishShell ( id ) ) , Effect . forkChild )
155- const shell = { id, cancelled, fiber } satisfies ShellHandle < A , E >
157+ const shell = { id, cancelled, ready , fiber } satisfies ShellHandle < A , E >
156158 return [
157159 Effect . gen ( function * ( ) {
158160 const exit = yield * Fiber . await ( fiber )
159161 if ( Exit . isSuccess ( exit ) ) return exit . value
160- if ( ( yield * Deferred . isDone ( cancelled ) ) || Cause . hasInterruptsOnly ( exit . cause ) ) {
162+ if ( Cause . hasInterruptsOnly ( exit . cause ) || ( ( yield * Deferred . isDone ( cancelled ) ) && ! Cause . hasDies ( exit . cause ) ) ) {
161163 if ( onInterrupt ) return yield * onInterrupt
162164 return yield * Effect . die ( new Cancelled ( ) )
163165 }
@@ -192,8 +194,8 @@ export const make = <A, E = never>(
192194 case "ShellThenRun" :
193195 return [
194196 Effect . gen ( function * ( ) {
195- yield * Deferred . fail ( st . run . done , new Cancelled ( ) ) . pipe ( Effect . asVoid )
196197 yield * stopShell ( st . shell )
198+ yield * Deferred . fail ( st . run . done , new Cancelled ( ) ) . pipe ( Effect . asVoid )
197199 yield * idleIfCurrent ( )
198200 } ) ,
199201 { _tag : "Idle" } as const ,
0 commit comments