/// Abstract base class for all use cases in the application.
///
/// Use cases encapsulate application-specific business rules and orchestrate
/// the flow of data to and from the entities. They are typically invoked
/// from the presentation layer (e.g., BLoCs, ViewModels) and interact with
/// repositories from the data layer.
///
/// [Input] represents the type of data passed into the use case.
/// [Output] represents the type of data returned by the use case.
abstract class UseCase<Input, Output> {
  /// Executes the use case with the given [input].
  ///
  /// This method should contain the core business logic of the use case.
  Future<Output> call(Input input);
}

/// Abstract base class for use cases that do not require any input.
///
/// [Output] represents the type of data returned by the use case.
abstract class NoInputUseCase<Output> {
  /// Executes the use case.
  ///
  /// This method should contain the core business logic of the use case.
  Future<Output> call();
}
