import { Effect, Context } from "effect";
class Analytics extends Context.Tag("Analytics")<
Analytics,
{
readonly sendRequest: () => Effect.Effect<void>;
}
>() {}
class Random extends Context.Tag("Random")<
Random,
{
readonly generateRandomValue: (id: string) => Effect.Effect<string>;
}
>() {}
const wheel = (userId: number) =>
Effect.gen(function* () {
const random = yield* Random;
const analytics = yield* Analytics;
return userId
});
const realAnalytics = Effect.provideService(Analytics, {
sendRequest: () => {
console.log("sending request and doing some computation");
return Effect.void;
},
});
const mockedAnalytics = Effect.provideService(Analytics, {
sendRequest: () => {
console.log("not doing anything - its just mock for testing");
return Effect.void;
},
});
const realRandom = Effect.provideService(Random, {
generateRandomValue: (id: string) =>
Effect.sync(() => `${Math.random()} - ${id}`),
});
const mockedRandom = Effect.provideService(Random, {
generateRandomValue: (id: string) => Effect.sync(() => `mockedValue-${id}`),
});
const mockedProgram = Effect.runPromise(
wheel(2).pipe(mockedAnalytics, mockedRandom),
);
const realProgram = Effect.runPromise(wheel(2).pipe(realAnalytics, realRandom));
import { Effect, Context } from "effect";
class Analytics extends Context.Tag("Analytics")<
Analytics,
{
readonly sendRequest: () => Effect.Effect<void>;
}
>() {}
class Random extends Context.Tag("Random")<
Random,
{
readonly generateRandomValue: (id: string) => Effect.Effect<string>;
}
>() {}
const wheel = (userId: number) =>
Effect.gen(function* () {
const random = yield* Random;
const analytics = yield* Analytics;
return userId
});
const realAnalytics = Effect.provideService(Analytics, {
sendRequest: () => {
console.log("sending request and doing some computation");
return Effect.void;
},
});
const mockedAnalytics = Effect.provideService(Analytics, {
sendRequest: () => {
console.log("not doing anything - its just mock for testing");
return Effect.void;
},
});
const realRandom = Effect.provideService(Random, {
generateRandomValue: (id: string) =>
Effect.sync(() => `${Math.random()} - ${id}`),
});
const mockedRandom = Effect.provideService(Random, {
generateRandomValue: (id: string) => Effect.sync(() => `mockedValue-${id}`),
});
const mockedProgram = Effect.runPromise(
wheel(2).pipe(mockedAnalytics, mockedRandom),
);
const realProgram = Effect.runPromise(wheel(2).pipe(realAnalytics, realRandom));