interface Foo { bar(): number }
const Foo = Context.GenericTag<Foo>('Foo')
const FooBuilder = Context.GenericTag<() => Foo>('FooBuilder')
const FooTestDouble = { value: 42, bar: () => FooTest.value }
const Main = Effect.gen(function*(){
const foo = yield* Foo
// ...
return foo.bar()
})
Defaults satisfies (..._:never) => Effect.Effect<unknown,unknown,never>
function Defaults(e: typeof Main) {
return pipe(
e,
// This example has very few dependencies, but we could have loads of dependencies here in production code
Effect.provideServiceEffect(Foo, Effect.map(FooBuilder, e => e())),
Effect.provideService(FooBuilder, () => { throw 'oh no! :('}),
)
}
it("Replaces FooBuilder", async () => {
const result = await pipe(
Main,
// TODO: How to replace FooBuilder with () => FooTestDouble ?
Defaults,
Effect.runPromise,
)
expect(result).toBe(FooTestDouble.value)
})
interface Foo { bar(): number }
const Foo = Context.GenericTag<Foo>('Foo')
const FooBuilder = Context.GenericTag<() => Foo>('FooBuilder')
const FooTestDouble = { value: 42, bar: () => FooTest.value }
const Main = Effect.gen(function*(){
const foo = yield* Foo
// ...
return foo.bar()
})
Defaults satisfies (..._:never) => Effect.Effect<unknown,unknown,never>
function Defaults(e: typeof Main) {
return pipe(
e,
// This example has very few dependencies, but we could have loads of dependencies here in production code
Effect.provideServiceEffect(Foo, Effect.map(FooBuilder, e => e())),
Effect.provideService(FooBuilder, () => { throw 'oh no! :('}),
)
}
it("Replaces FooBuilder", async () => {
const result = await pipe(
Main,
// TODO: How to replace FooBuilder with () => FooTestDouble ?
Defaults,
Effect.runPromise,
)
expect(result).toBe(FooTestDouble.value)
})