/// نتیجه‌ی یک عملیات داده‌ای: موفق (داده) یا خطا (پیام).
/// لایه‌ی data همیشه DataState برمی‌گرداند تا لایه‌های بالا throw نگیرند.
abstract class DataState<T> {
  final T? data;
  final String? error;
  const DataState(this.data, this.error);
}

class DataSuccess<T> extends DataState<T> {
  const DataSuccess(T data) : super(data, null);
}

class DataError<T> extends DataState<T> {
  const DataError(String error) : super(null, error);
}
