Skip to content

Instantly share code, notes, and snippets.

@pauloantonelli
Last active February 26, 2023 03:59
Show Gist options
  • Save pauloantonelli/de9143298c6cc77cb378319b3817c19e to your computer and use it in GitHub Desktop.
Save pauloantonelli/de9143298c6cc77cb378319b3817c19e to your computer and use it in GitHub Desktop.
dart Either
abstract class IGlobalFailure implements Exception {
final String? message;
IGlobalFailure({this.message});
}
abstract class EitherFailure implements Exception {
final String? message;
EitherFailure({this.message});
}
class ResponseNotDefinedFailure extends EitherFailure {
ResponseNotDefinedFailure()
: super(message: 'Invalid Response. Failure or Success not defined');
}
abstract class Either<TSuccess, TFailure> {
final TFailure? _failure;
final TSuccess? _success;
Either({TSuccess? success, TFailure? failure})
: _failure = failure,
_success = success,
assert(success != null || failure != null)
//assert(failure == null && success != null)
;
T fold<T>(T Function(TFailure)? onFailure, T Function(TSuccess)? onSuccess) {
if (_failure != null && onFailure != null) return onFailure(_failure!);
if (_success != null && onSuccess != null) return onSuccess(_success!);
throw ResponseNotDefinedFailure();
}
static Right<TSuccess, TFailure> success<TSuccess, TFailure>(
TSuccess value) =>
Right<TSuccess, TFailure>(value);
static Left<TSuccess, TFailure> failure<TSuccess, TFailure>(TFailure value) =>
Left<TSuccess, TFailure>(value);
bool get isSuccess => _success != null;
bool get isFailure => _failure != null;
// ignore: unnecessary_this
TSuccess? operator |(TSuccess? newFailureResponse) =>
this.fold((_) => newFailureResponse, (value) => value);
}
class Right<TSuccess, TFailure> extends Either<TSuccess, TFailure> {
Right(TSuccess value) : super(success: value);
}
class Left<TSuccess, TFailure> extends Either<TSuccess, TFailure> {
Left(TFailure value) : super(failure: value);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment