import { Effect } from "effect"
class MyRequirement extends Effect.Service<MyRequirement>()("MyRequirement", { succeed: () => 42 }) {}
class MyUseCase extends Effect.Service<MyUseCase>()("MyUseCase", {
dependencies: [MyRequirement.Default],
effect: Effect.gen(function*() {
const requirement = yield* MyRequirement
return Effect.fn("MyUseCase.execute")(function*() {
return requirement()
})
})
}) {}
function effectHandler<
Errors,
Requirements,
Args extends unknown[],
Service extends Effect.Effect<
(...args: Args) => Effect.Effect<void, Errors, Requirements>,
Errors,
Requirements
>
>(
service: Service
): (...args: Args) => Effect.Effect<void, Errors, Requirements> {
return Effect.fn("effectHandler")(function*(...args: Args) {
const execute = yield* service
yield* execute(...args)
})
}
const program = effectHandler(MyUseCase)
import { Effect } from "effect"
class MyRequirement extends Effect.Service<MyRequirement>()("MyRequirement", { succeed: () => 42 }) {}
class MyUseCase extends Effect.Service<MyUseCase>()("MyUseCase", {
dependencies: [MyRequirement.Default],
effect: Effect.gen(function*() {
const requirement = yield* MyRequirement
return Effect.fn("MyUseCase.execute")(function*() {
return requirement()
})
})
}) {}
function effectHandler<
Errors,
Requirements,
Args extends unknown[],
Service extends Effect.Effect<
(...args: Args) => Effect.Effect<void, Errors, Requirements>,
Errors,
Requirements
>
>(
service: Service
): (...args: Args) => Effect.Effect<void, Errors, Requirements> {
return Effect.fn("effectHandler")(function*(...args: Args) {
const execute = yield* service
yield* execute(...args)
})
}
const program = effectHandler(MyUseCase)