Understanding `Effect.updateService` and Layer Provisioning in Effect Typescript

Hi! I'm having some trouble understanding how Effect.updateService works. I have a method where the requirements are provided by a layer, but in certain situatios I need to dynamically swap out a dependency.

Basically In the following I would expect program to log "2" instead of "3", but SomeServiceLevelDep never gets replaced it seems. Also I wonder why I have to provide SomeServiceLevelDep.Default to program in order to replace it, as it is already provided in SomeServive.

class SomeServiceLevelDep extends Context.Tag("SomeServiceLevelDep")<SomeServiceLevelDep, number>() {
  static Default = Layer.succeed(this, 2);
}

const makeSomeService = Effect.gen(function* () {
  const serviceLevelDep = yield* SomeServiceLevelDep;

  return {
    doSomething: () =>
      Effect.gen(function* () {
        return `${serviceLevelDep + 1}`;
      }),
  };
});

class SomeService extends Context.Tag("SomeService")<
  SomeService,
  Effect.Effect.Success<typeof makeSomeService>
>() {
  static readonly Default = Layer.effect(this, makeSomeService).pipe(
    Layer.provide(SomeServiceLevelDep.Default),
  );
}

const program = await Effect.gen(function* () {
  const service = yield* SomeService.pipe(Effect.updateService(SomeServiceLevelDep, () => 1));
  const result = yield* service.doSomething();
  yield* Effect.log("result", result);
}).pipe(
  Effect.provide([Logger.pretty, SomeService.Default, SomeServiceLevelDep.Default]),
  Effect.runPromise,
);
Was this page helpful?