| 52 | |
| 53 | /** @internal */ |
| 54 | export const make = <R, ER>( |
| 55 | layer: Layer.Layer<R, ER, never>, |
| 56 | memoMap?: Layer.MemoMap |
| 57 | ): M.ManagedRuntime<R, ER> => { |
| 58 | memoMap = memoMap ?? internalLayer.unsafeMakeMemoMap() |
| 59 | const scope = internalRuntime.unsafeRunSyncEffect(fiberRuntime.scopeMake()) |
| 60 | let buildFiber: Fiber.RuntimeFiber<Runtime.Runtime<R>, ER> | undefined |
| 61 | const runtimeEffect = core.suspend(() => { |
| 62 | if (!buildFiber) { |
| 63 | const scheduler = new Scheduler.SyncScheduler() |
| 64 | buildFiber = internalRuntime.unsafeForkEffect( |
| 65 | core.tap( |
| 66 | Scope.extend( |
| 67 | internalLayer.toRuntimeWithMemoMap(layer, memoMap), |
| 68 | scope |
| 69 | ), |
| 70 | (rt) => { |
| 71 | self.cachedRuntime = rt |
| 72 | } |
| 73 | ), |
| 74 | { scope, scheduler } |
| 75 | ) |
| 76 | scheduler.flush() |
| 77 | } |
| 78 | return core.flatten(buildFiber.await) |
| 79 | }) |
| 80 | const self: ManagedRuntimeImpl<R, ER> = Object.assign(Object.create(ManagedRuntimeProto), { |
| 81 | memoMap, |
| 82 | scope, |
| 83 | runtimeEffect, |
| 84 | cachedRuntime: undefined, |
| 85 | runtime() { |
| 86 | return self.cachedRuntime === undefined ? |
| 87 | internalRuntime.unsafeRunPromiseEffect(self.runtimeEffect) : |
| 88 | Promise.resolve(self.cachedRuntime) |
| 89 | }, |
| 90 | dispose(): Promise<void> { |
| 91 | return internalRuntime.unsafeRunPromiseEffect(self.disposeEffect) |
| 92 | }, |
| 93 | disposeEffect: core.suspend(() => { |
| 94 | ;(self as Mutable<ManagedRuntimeImpl<R, ER>>).runtimeEffect = core.die("ManagedRuntime disposed") |
| 95 | self.cachedRuntime = undefined |
| 96 | return Scope.close(self.scope, core.exitVoid) |
| 97 | }), |
| 98 | runFork<A, E>(effect: Effect.Effect<A, E, R>, options?: Runtime.RunForkOptions): Fiber.RuntimeFiber<A, E | ER> { |
| 99 | return self.cachedRuntime === undefined ? |
| 100 | internalRuntime.unsafeForkEffect(provide(self, effect), options) : |
| 101 | internalRuntime.unsafeFork(self.cachedRuntime)(effect, options) |
| 102 | }, |
| 103 | runSyncExit<A, E>(effect: Effect.Effect<A, E, R>): Exit<A, E | ER> { |
| 104 | return self.cachedRuntime === undefined ? |
| 105 | internalRuntime.unsafeRunSyncExitEffect(provide(self, effect)) : |
| 106 | internalRuntime.unsafeRunSyncExit(self.cachedRuntime)(effect) |
| 107 | }, |
| 108 | runSync<A, E>(effect: Effect.Effect<A, E, R>): A { |
| 109 | return self.cachedRuntime === undefined ? |
| 110 | internalRuntime.unsafeRunSyncEffect(provide(self, effect)) : |
| 111 | internalRuntime.unsafeRunSync(self.cachedRuntime)(effect) |