import { Layer, type Context, ManagedRuntime, type Effect } from "effect" import { memoMap } from "./memo-map" import { Observability } from "./observability" export function makeRuntime(service: Context.Service, layer: Layer.Layer) { let rt: ManagedRuntime.ManagedRuntime | undefined const getRuntime = () => (rt ??= ManagedRuntime.make(Layer.provideMerge(layer, Observability.layer) as Layer.Layer, { memoMap, })) return { runSync: (fn: (svc: S) => Effect.Effect) => getRuntime().runSync(service.use(fn)), runPromiseExit: (fn: (svc: S) => Effect.Effect, options?: Effect.RunOptions) => getRuntime().runPromiseExit(service.use(fn), options), runPromise: (fn: (svc: S) => Effect.Effect, options?: Effect.RunOptions) => getRuntime().runPromise(service.use(fn), options), runFork: (fn: (svc: S) => Effect.Effect) => getRuntime().runFork(service.use(fn)), runCallback: (fn: (svc: S) => Effect.Effect) => getRuntime().runCallback(service.use(fn)), } }