import { Context, Effect, Layer } from "effect"
class Foo extends Context.Tag("Foo")<Foo, { foo: number }>() {}
class Bar extends Context.Tag("Bar")<Bar, { bar: number }>() {}
const FooLive = Layer.effect(Foo, Effect.gen(function* () {
const { bar } = yield* Bar
return { foo: bar + 1 }
})) // Layer<Foo, never, Bar>
const BarLive = Layer.effect(Bar, Effect.gen(function* () {
const { foo } = yield* Foo
return { bar: foo * 2 }
})) // Layer<Bar, never, Foo>
const provideMergeFooBar = Layer.provideMerge(FooLive, BarLive) // Layer<Foo | Bar, never, Foo>
const provideFooBar = Layer.provide(FooLive, BarLive) // Layer<Foo, never, Foo>
const mergeFooBar = Layer.merge(FooLive, BarLive) // Layer<Foo | Bar, never, Foo | Bar>
import { Context, Effect, Layer } from "effect"
class Foo extends Context.Tag("Foo")<Foo, { foo: number }>() {}
class Bar extends Context.Tag("Bar")<Bar, { bar: number }>() {}
const FooLive = Layer.effect(Foo, Effect.gen(function* () {
const { bar } = yield* Bar
return { foo: bar + 1 }
})) // Layer<Foo, never, Bar>
const BarLive = Layer.effect(Bar, Effect.gen(function* () {
const { foo } = yield* Foo
return { bar: foo * 2 }
})) // Layer<Bar, never, Foo>
const provideMergeFooBar = Layer.provideMerge(FooLive, BarLive) // Layer<Foo | Bar, never, Foo>
const provideFooBar = Layer.provide(FooLive, BarLive) // Layer<Foo, never, Foo>
const mergeFooBar = Layer.merge(FooLive, BarLive) // Layer<Foo | Bar, never, Foo | Bar>