import { Config, Context, Effect, Layer } from "effect";
interface IPersistenceModel { _id: string; }
const makeDefault = <PTX extends IPersistenceModel = IPersistenceModel>() =>
Effect.gen(function* () {
// simplified service for brevity
const someValue = yield* Config.string("FOO");
return {
get: () =>
Effect.gen(function* () {
return { _id: "foo" } as PTX;
}),
};
});
interface Repository<PTX extends IPersistenceModel>
extends Effect.Effect.Success<ReturnType<typeof makeDefault<PTX>>> {}
const Repository = <PTX extends IPersistenceModel>() =>
Context.GenericTag<Repository<PTX>>("Repository");
const RepositoryLayer = <PTX extends IPersistenceModel>() =>
Layer.effect(Repository<PTX>(), makeDefault<PTX>());
// usage example
interface Foobar extends IPersistenceModel {
name: string;
}
const program = Effect.gen(function* () {
const repo = yield* Repository<Foobar>();
const a = yield* repo.get(); // gets inferred as Foobar
});
import { Config, Context, Effect, Layer } from "effect";
interface IPersistenceModel { _id: string; }
const makeDefault = <PTX extends IPersistenceModel = IPersistenceModel>() =>
Effect.gen(function* () {
// simplified service for brevity
const someValue = yield* Config.string("FOO");
return {
get: () =>
Effect.gen(function* () {
return { _id: "foo" } as PTX;
}),
};
});
interface Repository<PTX extends IPersistenceModel>
extends Effect.Effect.Success<ReturnType<typeof makeDefault<PTX>>> {}
const Repository = <PTX extends IPersistenceModel>() =>
Context.GenericTag<Repository<PTX>>("Repository");
const RepositoryLayer = <PTX extends IPersistenceModel>() =>
Layer.effect(Repository<PTX>(), makeDefault<PTX>());
// usage example
interface Foobar extends IPersistenceModel {
name: string;
}
const program = Effect.gen(function* () {
const repo = yield* Repository<Foobar>();
const a = yield* repo.get(); // gets inferred as Foobar
});