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
  )
);
Was this page helpful?