diff options
Diffstat (limited to 'packages/core/src/effect/runtime.ts')
| -rw-r--r-- | packages/core/src/effect/runtime.ts | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/packages/core/src/effect/runtime.ts b/packages/core/src/effect/runtime.ts new file mode 100644 index 000000000..e4f682709 --- /dev/null +++ b/packages/core/src/effect/runtime.ts @@ -0,0 +1,21 @@ +import { Layer, type Context, ManagedRuntime, type Effect } from "effect" +import { memoMap } from "./memo-map" +import { Observability } from "./observability" + +export function makeRuntime<I, S, E>(service: Context.Service<I, S>, layer: Layer.Layer<I, E>) { + let rt: ManagedRuntime.ManagedRuntime<I, E> | undefined + const getRuntime = () => + (rt ??= ManagedRuntime.make(Layer.provideMerge(layer, Observability.layer) as Layer.Layer<I, E>, { + memoMap, + })) + + return { + runSync: <A, Err>(fn: (svc: S) => Effect.Effect<A, Err, I>) => getRuntime().runSync(service.use(fn)), + runPromiseExit: <A, Err>(fn: (svc: S) => Effect.Effect<A, Err, I>, options?: Effect.RunOptions) => + getRuntime().runPromiseExit(service.use(fn), options), + runPromise: <A, Err>(fn: (svc: S) => Effect.Effect<A, Err, I>, options?: Effect.RunOptions) => + getRuntime().runPromise(service.use(fn), options), + runFork: <A, Err>(fn: (svc: S) => Effect.Effect<A, Err, I>) => getRuntime().runFork(service.use(fn)), + runCallback: <A, Err>(fn: (svc: S) => Effect.Effect<A, Err, I>) => getRuntime().runCallback(service.use(fn)), + } +} |
