// service-b.ts
class ServiceB extends Effect.Tag("ServiceB")<
ServiceB,
{ sayHello: () => string, finallyDoIt: () => string}
>() {
static Live = Layer.succeed(ServiceB, {
sayHello: () => "hey",
finallyDoIt: () => "ok"
});
}
// service-a.ts
const doSomethingElse = () => Effect.gen(function* () {
const serviceB = yield* ServiceB;
return serviceB.finallyDoIt();
});
const make = Effect.gen(function* () {
const serviceB = yield* ServiceB;
return {
sayHello: () => {
return serviceB.sayHello();
},
doSomething: () => {
return doSomethingElse().pipe(Effect.provideService(ServiceB, serviceB));
},
};
});
class ServiceA extends Effect.Tag("ServiceA")<
ServiceA,
Effect.Effect.Success<typeof make>
>() {
static Live = Layer.effect(this, make).pipe(Layer.provide(ServiceB.Live));
}
// service-b.ts
class ServiceB extends Effect.Tag("ServiceB")<
ServiceB,
{ sayHello: () => string, finallyDoIt: () => string}
>() {
static Live = Layer.succeed(ServiceB, {
sayHello: () => "hey",
finallyDoIt: () => "ok"
});
}
// service-a.ts
const doSomethingElse = () => Effect.gen(function* () {
const serviceB = yield* ServiceB;
return serviceB.finallyDoIt();
});
const make = Effect.gen(function* () {
const serviceB = yield* ServiceB;
return {
sayHello: () => {
return serviceB.sayHello();
},
doSomething: () => {
return doSomethingElse().pipe(Effect.provideService(ServiceB, serviceB));
},
};
});
class ServiceA extends Effect.Tag("ServiceA")<
ServiceA,
Effect.Effect.Success<typeof make>
>() {
static Live = Layer.effect(this, make).pipe(Layer.provide(ServiceB.Live));
}