Last active
December 15, 2023 15:06
-
-
Save danielgomezrico/630675acf18b6645d3893b09a750f99b to your computer and use it in GitHub Desktop.
Result Monad Example 2
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/// | |
/// 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