Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/cbyad/either_option
A small typed and safe library for error handling with functionnal programming concept in Dart and flutter project
https://github.com/cbyad/either_option
dart either either-monad flutter functional-programming maybe option option-monad result
Last synced: 3 months ago
JSON representation
A small typed and safe library for error handling with functionnal programming concept in Dart and flutter project
- Host: GitHub
- URL: https://github.com/cbyad/either_option
- Owner: cbyad
- License: mit
- Created: 2019-07-02T10:12:21.000Z (over 5 years ago)
- Default Branch: master
- Last Pushed: 2022-10-31T09:36:48.000Z (about 2 years ago)
- Last Synced: 2024-09-29T16:05:03.928Z (3 months ago)
- Topics: dart, either, either-monad, flutter, functional-programming, maybe, option, option-monad, result
- Language: Dart
- Homepage:
- Size: 29.3 KB
- Stars: 34
- Watchers: 2
- Forks: 7
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# either_option
__either_option__ is a simple library typed for easy and safe error handling with functional programming style in Dart.
It aims to allow flutter/dart developpers to use the 2 most popular patterns and abstractions :
`Either` and `Option`, mainly used in FP language like Scala, Haskell, OCaml,...# Installation
Prerelease versions that support null safety
Package link on pub [either_option](https://pub.dev/packages/either_option)
In your pubspec.yaml dependencies addeither_option: ^2.0.0
# Overview
## Either
`Either` Represents a value of one of two possible types.
By convention we put missing or error value in an instance of `Left` and expected success value in an instance of `Right`.For example, we fetch an url from a repository [repository](example/lib/repository_example.dart) to get an *User* details and use `Either` :
```dart
Future> getUser(int id) async {
final baseUrl = "https://fakerestapi.azurewebsites.net/api/Users/$id";final res = await http.get(baseUrl);
if (res.statusCode == 200) {
dynamic body = json.decode(res.body);
User user = User.fromJson(body);
return Right(user);
}
if (res.statusCode == 404)
return Left(ServerError("This user doesn't exist"));return Left(ServerError("Unknown server error"));
}
```
So now to consume result we can use for example `fold` method and say what to do with value :```dart
main() async {
final Repository repository = Repository();final Either res = await repository.getUser(3);
final defaultUser = User(id: 0, username: "ko", password: "ko");
final userName = res.fold((_) => defaultUser.username, (user) => user.username);
print(userName); // "User 3"
//if res was a Left, print(userName) would give "ko"
}
```
## Option
`Option` Represents a value of one of two possible types.
By convention we consider missing value as an instance of `None` and expected success value in an instance of `Some`.```dart
Future> getUserOpt(int id) async {
final res = await http.get(baseUrl);
return Option.cond(
res.statusCode == 200, User.fromJson(json.decode(res.body)));
}
// -----------------------------------------
main() async {
final Repository repository = Repository();final Option res = await repository.getUserOpt(3);
final defaultUser = User(id: 0, username: "ko", password: "ko");
final userName = res.getOrElse(defaultUser).username;
print(userName); // "User 3"//if res was a None, print(userName) would give "ko"
}
```## Ressources & explanation
[Medium article](https://medium.com/@cb.yannick/a-small-monad-library-for-dart-flutter-project-e49b71205bd0?source=friends_link&sk=21c7527322b281aa6e161bad27086952)
# Features
Functions available :| | Option | Either|
| ------------ |:---------:| -----:|
| fold | :+1: | :+1: |
| map | :+1: | :+1: |
| flatMap | :+1: | :+1: |
| getOrElse | :+1: | |
| orElse | :+1: | |
| toLeft | :+1: | |
| toRight | :+1: | |
| toEither | :+1: | |
| Option.empty | :+1: | |
| Option.of | :+1: | |
| filter | :+1: | |
| exists | :+1: | |
| contains | :+1: | |
| swap | | :+1:|
| cond | :+1: | :+1:|# Example
* [Either & Option](example/lib/either_option_example.dart)
* [Repository](example/lib/repository_example.dart)# Tests
* [Either](test/either_test.dart)
* [Option](test/option_test.dart)