Seeking Feedback on Third-Party Mutation Registry Built with Effect

Some feedback on this Thirdparty mutation registry I build with Effect would be appreciated.
It works as inteded but I do wonder if there are better ways todo this with Effect and/or if I missused effect here somehow:
import { Effect } from "effect"

type MutationAction = "create" | "update" | "delete"

type MutationFn<T> = (data: T) => Effect.Effect<unknown, Error, never>

type MutationRegistry<T> = {
    [action in MutationAction]?: MutationFn<T>
}

class MutationService<T> {
    private registry: Map<string, MutationRegistry<T>> = new Map()

    registerMutation(
        collectionId: string,
        action: MutationAction,
        mutationFn: MutationFn<T>,
    ): Effect.Effect<void, never, never> {
        return Effect.sync(() => {
            const registry = this.registry.get(collectionId) || {}
            registry[action] = mutationFn
            this.registry.set(collectionId, registry)
        })
    }

    executeMutation(collectionId: string, action: MutationAction, data: T): Effect.Effect<unknown, Error, never> {
        return Effect.gen({ registry: this.registry }, function* (_) {
            const registry = yield* _(Effect.sync(() => new Map(this.registry)))
            const mutationRegistry = registry.get(collectionId)
            if (!mutationRegistry || !mutationRegistry[action]) {
                return yield* _(Effect.fail(new Error(`No mutation registered for ${collectionId}:${action}`)))
            }
            return yield* _(mutationRegistry[action]!(data))
        })
    }
}

const mutationService = new MutationService<{ id: string; name: string }>()
Was this page helpful?