| 35 | }) |
| 36 | |
| 37 | const start = (key: Key, entry: Entry<E>, force: boolean, successor = false) => { |
| 38 | const ready = Deferred.makeUnsafe<void>() |
| 39 | const owner = fork( |
| 40 | (successor ? Effect.yieldNow : Deferred.await(ready)).pipe( |
| 41 | Effect.andThen(Effect.suspend(() => options.drain(key, force))), |
| 42 | Effect.onExit((exit) => Effect.sync(() => settle(key, entry, exit))), |
| 43 | Effect.exit, |
| 44 | Effect.asVoid, |
| 45 | ), |
| 46 | ) |
| 47 | entry.owner = owner |
| 48 | if (!successor) Deferred.doneUnsafe(ready, Effect.void) |
| 49 | } |
| 50 | |
| 51 | const settle = (key: Key, entry: Entry<E>, exit: Exit.Exit<void, E>) => { |
| 52 | if (Exit.isSuccess(exit) && !entry.stopping && entry.pendingWake) { |