import { Effect, Layer, ManagedRuntime } from "effect" import * as ServiceMap from "effect/ServiceMap" export const memoMap = Layer.makeMemoMapUnsafe() export function makeRunPromise(service: ServiceMap.Service, layer: Layer.Layer) { let rt: ManagedRuntime.ManagedRuntime | undefined return (fn: (svc: S) => Effect.Effect, options?: Effect.RunOptions) => { rt ??= ManagedRuntime.make(layer, { memoMap }) return rt.runPromise(service.use(fn), options) } } export function makeRuntime(service: ServiceMap.Service, layer: Layer.Layer) { let rt: ManagedRuntime.ManagedRuntime | undefined const getRuntime = () => (rt ??= ManagedRuntime.make(layer, { memoMap })) return { runSync: (fn: (svc: S) => Effect.Effect) => getRuntime().runSync(service.use(fn)), 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)), } }