Skip to content

Instantly share code, notes, and snippets.

@danielgomezrico
Last active December 15, 2023 15:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save danielgomezrico/630675acf18b6645d3893b09a750f99b to your computer and use it in GitHub Desktop.
Save danielgomezrico/630675acf18b6645d3893b09a750f99b to your computer and use it in GitHub Desktop.
Result Monad Example 2
///
/// The Result Monad
///
abstract class Result<T> {
bool isSuccess() {
return this is Success;
}
Success<T> asSuccess() {
return this as Success<T>;
}
Failure asFailure() {
return this as Failure;
}
Result bind(Result Function(Result) doNext) {
if (isSuccess()) {
return doNext(this);
} else {
return this;
}
}
}
class Success<T> extends Result {
Success(this.result);
T result;
}
class Failure extends Result {
Failure(this.message);
String message;
}
///
/// Our Models
///
class User {}
class RealEstate {}
///
/// The service
///
Result fetchUser() {
return Success(User());
//return Failure("Sorry, the network was pretty bad fetching user");
}
Result fetchRealEstate(int id) {
//return Success(RealEstate());
return Failure("Sorry, the network was pretty bad");
}
void main() {
final result = fetchUser()
.bind((userResult) => fetchRealEstate(1))
.bind((userResult) => fetchRealEstate(2));
if(result.isSuccess()) {
print(result.asSuccess().result);
} else {
print(result.asFailure().message);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment