import { Context, Effect } from "effect-app" export interface RegisteredRepository { readonly seedNamespace: (namespace: string) => Effect.Effect } const make = Effect.sync(() => { const repos = new Map() return { register(modelName: string, repo: RegisteredRepository) { repos.set(modelName, repo) }, seedNamespace: (namespace: string) => Effect.suspend(() => Effect.forEach( repos.values(), (r) => r.seedNamespace(namespace), { concurrency: "unbounded", discard: true } ) ), get entries(): ReadonlyMap { return repos } } }) export class RepositoryRegistry extends Context.Opaque void readonly seedNamespace: (namespace: string) => Effect.Effect readonly entries: ReadonlyMap }>()("effect-app/RepositoryRegistry", { make }) {} export const RepositoryRegistryLive = RepositoryRegistry.toLayer(RepositoryRegistry.make)