run-service.test.ts 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import { expect, test } from "bun:test"
  2. import { Effect, Layer, ServiceMap } from "effect"
  3. import { makeRuntime } from "../../src/effect/run-service"
  4. class Shared extends ServiceMap.Service<Shared, { readonly id: number }>()("@test/Shared") {}
  5. test("makeRuntime shares dependent layers through the shared memo map", async () => {
  6. let n = 0
  7. const shared = Layer.effect(
  8. Shared,
  9. Effect.sync(() => {
  10. n += 1
  11. return Shared.of({ id: n })
  12. }),
  13. )
  14. class One extends ServiceMap.Service<One, { readonly get: () => Effect.Effect<number> }>()("@test/One") {}
  15. const one = Layer.effect(
  16. One,
  17. Effect.gen(function* () {
  18. const svc = yield* Shared
  19. return One.of({
  20. get: Effect.fn("One.get")(() => Effect.succeed(svc.id)),
  21. })
  22. }),
  23. ).pipe(Layer.provide(shared))
  24. class Two extends ServiceMap.Service<Two, { readonly get: () => Effect.Effect<number> }>()("@test/Two") {}
  25. const two = Layer.effect(
  26. Two,
  27. Effect.gen(function* () {
  28. const svc = yield* Shared
  29. return Two.of({
  30. get: Effect.fn("Two.get")(() => Effect.succeed(svc.id)),
  31. })
  32. }),
  33. ).pipe(Layer.provide(shared))
  34. const { runPromise: runOne } = makeRuntime(One, one)
  35. const { runPromise: runTwo } = makeRuntime(Two, two)
  36. expect(await runOne((svc) => svc.get())).toBe(1)
  37. expect(await runTwo((svc) => svc.get())).toBe(1)
  38. expect(n).toBe(1)
  39. })