Last active
February 9, 2022 12:40
-
-
Save danielgomezrico/fc8b4b6b2b2ce433de9d31565d9b68bc to your computer and use it in GitHub Desktop.
Result Monad as example
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; | |
} | |
} | |
class Success<T> extends Result { | |
Success(this.result); | |
T result; | |
} | |
class Failure extends Result { | |
Failure(this.message); | |
String message; | |
} | |
/// | |
/// Our Models | |
/// | |
class User {} | |
/// | |
/// The service | |
/// | |
Result fetchUser() { | |
return Success(User()); | |
// return Failure("Sorry, the network was pretty bad"); | |
} | |
void main() { | |
final result = fetchUser(); | |
if(result.isSuccess()) { | |
print(result.asSuccess().result); | |
} else { | |
print(result.asFailure()); | |
} | |
} |
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