Effect CommunityEC
Effect Community8mo ago
8 replies
Josue Diaz

Generic Service Factory with Context.Tag - Reducing Boilerplate

Is there a recommended pattern for creating a generic service factory?
I'm using Effect as a data gateway layer and want to reduce boilerplate when creating services. Currently I have:
export class UserUsecase extends Context.Tag("UserUsecase")<
  UserUsecase,
  {
    create: (user: CreateUser) => Effect.Effect<User, ErrorResult>;
    getAll: () => Effect.Effect<User[], ErrorResult>;
    getById: (id: string) => Effect.Effect<User | null, ErrorResult>;
    // ... more methods
  }
>() {}

And create services with this repetitive pattern:
export const userService = {
  create: (input) =>
    UserUsecase.pipe(
      Effect.andThen(({ create }) => create(input)),
      Effect.provide(makeUserUsecaseLive),
      RuntimeClient.runPromiseExit,
    ),
  getAll: () =>
    UserUsecase.pipe(
      Effect.andThen(({ getAll }) => getAll()),
      Effect.provide(makeUserUsecaseLive),
      RuntimeClient.runPromiseExit,
    ),
  // ... repeat for every method
};
Was this page helpful?