import { NodeRuntime } from '@effect/platform-node';
import { Context, Effect, Layer } from 'effect';
class MyString extends Context.Tag('MyString')<MyString, string>() {}
class Wrapper extends Context.Tag('Wrapper')<Wrapper, string>() {}
const WrapperLive = Layer.effect(Wrapper, MyString);
class WrapperWrapper1 extends Context.Tag('WrapperWrapper1')<
WrapperWrapper1,
string
>() {}
const WrapperWrapper1Live = Layer.effect(WrapperWrapper1, Wrapper);
class WrapperWrapper2 extends Context.Tag('WrapperWrapper2')<
WrapperWrapper2,
string
>() {}
const WrapperWrapper2Live = Layer.effect(WrapperWrapper2, Wrapper);
const program = Layer.effectDiscard(
Effect.gen(function* () {
const wrapper1 = yield* WrapperWrapper1;
// Expected "A" but got "B" ❌
console.log(wrapper1);
const wrapper2 = yield* WrapperWrapper2;
// Expected "B" and got "B" ✅
console.log(wrapper2);
}),
).pipe(
Layer.provide(
WrapperWrapper1Live.pipe(
Layer.provide(
WrapperLive.pipe(
Layer.provide(
Layer.effect(
MyString,
Effect.succeed('A').pipe(
Effect.tap(() => Effect.log('initialized A')),
),
),
),
),
),
),
),
Layer.provide(
WrapperWrapper2Live.pipe(
Layer.provide(
WrapperLive.pipe(
Layer.provide(
Layer.effect(
MyString,
Effect.succeed('B').pipe(
Effect.tap(() => Effect.log('initialized B')),
),
),
),
),
),
),
),
Layer.launch,
);
NodeRuntime.runMain(program);
import { NodeRuntime } from '@effect/platform-node';
import { Context, Effect, Layer } from 'effect';
class MyString extends Context.Tag('MyString')<MyString, string>() {}
class Wrapper extends Context.Tag('Wrapper')<Wrapper, string>() {}
const WrapperLive = Layer.effect(Wrapper, MyString);
class WrapperWrapper1 extends Context.Tag('WrapperWrapper1')<
WrapperWrapper1,
string
>() {}
const WrapperWrapper1Live = Layer.effect(WrapperWrapper1, Wrapper);
class WrapperWrapper2 extends Context.Tag('WrapperWrapper2')<
WrapperWrapper2,
string
>() {}
const WrapperWrapper2Live = Layer.effect(WrapperWrapper2, Wrapper);
const program = Layer.effectDiscard(
Effect.gen(function* () {
const wrapper1 = yield* WrapperWrapper1;
// Expected "A" but got "B" ❌
console.log(wrapper1);
const wrapper2 = yield* WrapperWrapper2;
// Expected "B" and got "B" ✅
console.log(wrapper2);
}),
).pipe(
Layer.provide(
WrapperWrapper1Live.pipe(
Layer.provide(
WrapperLive.pipe(
Layer.provide(
Layer.effect(
MyString,
Effect.succeed('A').pipe(
Effect.tap(() => Effect.log('initialized A')),
),
),
),
),
),
),
),
Layer.provide(
WrapperWrapper2Live.pipe(
Layer.provide(
WrapperLive.pipe(
Layer.provide(
Layer.effect(
MyString,
Effect.succeed('B').pipe(
Effect.tap(() => Effect.log('initialized B')),
),
),
),
),
),
),
),
Layer.launch,
);
NodeRuntime.runMain(program);