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:
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 }>()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 }>()