runtime.ts 1.1 KB

123456789101112131415161718192021
  1. import { Layer, type Context, ManagedRuntime, type Effect } from "effect"
  2. import { memoMap } from "./memo-map"
  3. import { Observability } from "./observability"
  4. export function makeRuntime<I, S, E>(service: Context.Service<I, S>, layer: Layer.Layer<I, E>) {
  5. let rt: ManagedRuntime.ManagedRuntime<I, E> | undefined
  6. const getRuntime = () =>
  7. (rt ??= ManagedRuntime.make(Layer.provideMerge(layer, Observability.layer) as Layer.Layer<I, E>, {
  8. memoMap,
  9. }))
  10. return {
  11. runSync: <A, Err>(fn: (svc: S) => Effect.Effect<A, Err, I>) => getRuntime().runSync(service.use(fn)),
  12. runPromiseExit: <A, Err>(fn: (svc: S) => Effect.Effect<A, Err, I>, options?: Effect.RunOptions) =>
  13. getRuntime().runPromiseExit(service.use(fn), options),
  14. runPromise: <A, Err>(fn: (svc: S) => Effect.Effect<A, Err, I>, options?: Effect.RunOptions) =>
  15. getRuntime().runPromise(service.use(fn), options),
  16. runFork: <A, Err>(fn: (svc: S) => Effect.Effect<A, Err, I>) => getRuntime().runFork(service.use(fn)),
  17. runCallback: <A, Err>(fn: (svc: S) => Effect.Effect<A, Err, I>) => getRuntime().runCallback(service.use(fn)),
  18. }
  19. }