class A extends Effect.Service<A>()("A", {
effect: Effect.gen(function*() {
return Effect.succeed('')
})
}) {}
class B extends Effect.Service<B>()("B", {
effect: Effect.gen(function*() {
return Effect.succeed(true)
})
}) {}
const doA = pipe(
A,
Effect.flatMap((a) => a)
)
const doB = pipe(
B,
Effect.flatMap((b) => b)
)
class Test extends Effect.Service<Test>()("Testy", {
effect: Effect.gen(function*() {
return {
doA,
doB
}
}),
}) {}
const LettersLayer = Layer.merge(A.Default, B.Default)
const test = Effect.gen(function*() { // Effect.Effect<Test, never, never>
const derp = yield* Test
return derp // Test
}).pipe(Effect.provide(Layer.merge(Test.Default, LettersLayer)))
const test2 = Effect.gen(function*() { // Effect.Effect<void, never, A | B>
const derp2 = yield* test
const here = derp2.doA // Effect.Effect<string, never, A>
const here2 = derp2.doB // Effect.Effect<boolean, never, B>
const blah = yield* here
const blah2 = yield* here2
})
class A extends Effect.Service<A>()("A", {
effect: Effect.gen(function*() {
return Effect.succeed('')
})
}) {}
class B extends Effect.Service<B>()("B", {
effect: Effect.gen(function*() {
return Effect.succeed(true)
})
}) {}
const doA = pipe(
A,
Effect.flatMap((a) => a)
)
const doB = pipe(
B,
Effect.flatMap((b) => b)
)
class Test extends Effect.Service<Test>()("Testy", {
effect: Effect.gen(function*() {
return {
doA,
doB
}
}),
}) {}
const LettersLayer = Layer.merge(A.Default, B.Default)
const test = Effect.gen(function*() { // Effect.Effect<Test, never, never>
const derp = yield* Test
return derp // Test
}).pipe(Effect.provide(Layer.merge(Test.Default, LettersLayer)))
const test2 = Effect.gen(function*() { // Effect.Effect<void, never, A | B>
const derp2 = yield* test
const here = derp2.doA // Effect.Effect<string, never, A>
const here2 = derp2.doB // Effect.Effect<boolean, never, B>
const blah = yield* here
const blah2 = yield* here2
})