import { Context, Effect, pipe } from "effect"
interface LoggerService1 {
readonly log: (message: string) => Effect.Effect<void>
}
interface LoggerService2 {
readonly log: (message: string) => Effect.Effect<void>
}
const LoggerService1 = Context.GenericTag<LoggerService1>("@services/LoggerService1")
const LoggerService2 = Context.GenericTag<LoggerService2>("@services/LoggerService2")
const LoggerService1Impl: LoggerService1 = {
log: (message: string) =>
Effect.sync(() => {
console.log(`🔵 Logger1: ${message}`)
})
}
const logWithBothServices = (message: string) =>
Effect.gen(function* (_) {
const logger1 = yield* LoggerService1
const logger2 = yield* LoggerService2
yield* logger1.log(`[Logger1] ${message}`)
yield* logger2.log(`[Logger2] ${message}`)
})
pipe(
logWithBothServices("Hello from Effect!"),
Effect.provideService(LoggerService1, LoggerService1Impl),
Effect.runPromise
).then(() => {
console.log("✅ Program completed successfully!")
}).catch(console.error)
import { Context, Effect, pipe } from "effect"
interface LoggerService1 {
readonly log: (message: string) => Effect.Effect<void>
}
interface LoggerService2 {
readonly log: (message: string) => Effect.Effect<void>
}
const LoggerService1 = Context.GenericTag<LoggerService1>("@services/LoggerService1")
const LoggerService2 = Context.GenericTag<LoggerService2>("@services/LoggerService2")
const LoggerService1Impl: LoggerService1 = {
log: (message: string) =>
Effect.sync(() => {
console.log(`🔵 Logger1: ${message}`)
})
}
const logWithBothServices = (message: string) =>
Effect.gen(function* (_) {
const logger1 = yield* LoggerService1
const logger2 = yield* LoggerService2
yield* logger1.log(`[Logger1] ${message}`)
yield* logger2.log(`[Logger2] ${message}`)
})
pipe(
logWithBothServices("Hello from Effect!"),
Effect.provideService(LoggerService1, LoggerService1Impl),
Effect.runPromise
).then(() => {
console.log("✅ Program completed successfully!")
}).catch(console.error)