import { Queue as Q } from "@effect/io/Queue" export interface MemQueue { getOrCreateQueue: (k: string) => Effect> } /** * @tsplus type MemQueue.Ops */ export interface MemQueueOps extends Tag {} export const MemQueue: MemQueueOps = Tag() /** * @tsplus static MemQueue.Ops Live */ export const LiveMemQueue = Effect.gen(function*($) { const store = yield* $(Effect(new Map>())) return { getOrCreateQueue: (k: string) => Effect.gen(function*($) { const q = store.get(k) if (q) return q const newQ = yield* $(Q.unbounded()) store.set(k, newQ) return newQ }) } }).toLayer(MemQueue)