Swapping Service Implementations in Effect Typescript
Hey everyone, qq.. if I created a service (using Effect.Service) and added a non-default implementation, how can I swap the implementation for a program?
export class DatabaseConfig extends Effect.Service<DatabaseConfig>()(
"app/DatabaseConfig",
{
dependencies: [ConfigService.Default],
effect: Effect.gen(function* () {
const config = yield* ConfigService;
return {
connectionString: config.localConnectionString,
logging: false,
} as const;
}),
}
) {
static Local = Layer.effect(
this,
Effect.gen(function* () {
const config = yield* ConfigService;
return {
_tag: "app/DatabaseConfig",
connectionString: config.localConnectionString,
logging: true,
} as const;
}).pipe(Effect.provide(ConfigService.Default))
);
}
const program = Effect.gen(function* () {
const threads = yield* ThreadRepository;
const allThreads = yield* threads.getAll();
yield* Console.log(allThreads.length);
});
const runProgram = Effect.scoped(
program.pipe(
Effect.provide(ThreadRepository.Default.pipe(Layer.provide(DatabaseConfig.Local))) // <--- still uses DatabaseConfig.Default
)
);export class DatabaseConfig extends Effect.Service<DatabaseConfig>()(
"app/DatabaseConfig",
{
dependencies: [ConfigService.Default],
effect: Effect.gen(function* () {
const config = yield* ConfigService;
return {
connectionString: config.localConnectionString,
logging: false,
} as const;
}),
}
) {
static Local = Layer.effect(
this,
Effect.gen(function* () {
const config = yield* ConfigService;
return {
_tag: "app/DatabaseConfig",
connectionString: config.localConnectionString,
logging: true,
} as const;
}).pipe(Effect.provide(ConfigService.Default))
);
}
const program = Effect.gen(function* () {
const threads = yield* ThreadRepository;
const allThreads = yield* threads.getAll();
yield* Console.log(allThreads.length);
});
const runProgram = Effect.scoped(
program.pipe(
Effect.provide(ThreadRepository.Default.pipe(Layer.provide(DatabaseConfig.Local))) // <--- still uses DatabaseConfig.Default
)
);