diff --git a/CHANGELOG.md b/CHANGELOG.md index 144894fd..1e381e66 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,49 @@ +# v0.4.1 - 25 February 2023 +- New methods for `Option` type (thanks to [tim-smart](https://github.com/tim-smart) 🎉) + - `flatMapNullable` + - `flatMapThrowable` +```dart +final option = Option.of(10); + +option.flatMapNullable((a) => a + 1); /// 👈 `Some(11)` +option.flatMapThrowable((a) => a + 1); /// 👈 `Some(11)` + +option.flatMapNullable((a) => null); /// 👈 `None()` +option.flatMapThrowable((a) => throw "fail"); /// 👈 `None()` +``` + +- Improved support `fromJson` for `Option` type (thanks [again] to [tim-smart](https://github.com/tim-smart) 🎉) + - Allow for decoding of **non-primitive types** (with custom `fromJson` constructors) +```dart +/// `fromJson` on `DateTime` with `Option` type +final now = DateTime.now(); +Option.fromJson(now.toIso8601String(), (a) => DateTime.parse(a as String)); /// 👈 `Some(now)` + +Option.fromJson("fail", (a) => DateTime.parse(a as String)); /// 👈 `None()` +``` + +- New extension methods for `Map` (thanks [once again] to [tim-smart](https://github.com/tim-smart) 🎉) + - `extract` + - `extractMap` +```dart +final map = {'a': 1, 'b': 2, 'c': 3, 'd': 4}; +map.extract('b'); /// 👈 `Some(2)` +map.extract('b'); /// 👈 `None()`, not of type `String` ⚠️ + +final map = {'a': 1}; +map.extractMap('a'); /// 👈 `None()`, not a `Map` + +final map = {'a': {'b': 2} }; +map.extractMap('a'); /// 👈 `Some({'b': 2})` +``` + +- `Option.of` and `Option.none` factories `const` (thanks to [f-person](https://github.com/f-person) 🎉) + +> **Note**: People who have the [prefer_const_constructors](https://dart.dev/tools/linter-rules#prefer_const_constructors) lint enabled will notice a warning to use `const` 🤝 + +- New [`managing_imports`](./example/managing_imports) example (thanks to [RandalSchwartz](https://github.com/RandalSchwartz) 🎉) +- Updated [README](./README.md) introduction + # v0.4.0 - 16 December 2022 - Added extension methods to work with nullable types (`T?`) - From `T?` to `fpdart`'s types diff --git a/README.md b/README.md index 760a3a89..d6a65b44 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,20 @@ -# `Fpdart` +

+ + + +

+ -

+

+Functional programming in Dart and Flutter +

+ +

+All the main functional programming types and patterns fully documented, tested, and with examples +

+ + +

@@ -15,10 +29,7 @@

- -Functional programming in Dart and Flutter. - -All the main functional programming types and patterns **fully documented**, tested, and with examples. +## Introduction > **Fpdart is fully documented. You do not need to have any previous experience with functional programming to start using `fpdart`. Give it a try!** @@ -28,10 +39,15 @@ Fpdart is inspired by [fp-ts](https://gcanti.github.io/fp-ts/), [cats](https://t *** +- [Introduction](#introduction) - [📖 Learn `functional programming` and `fpdart`](#-learn-functional-programming-and-fpdart) - [👨‍💻 Blog posts and tutorials](#-blog-posts-and-tutorials) - [💻 Installation](#-installation) - [✨ Examples](#-examples) + - [Pokeapi](#pokeapi) + - [Open Meteo API](#open-meteo-api) + - [Read/Write local file](#readwrite-local-file) + - [Manage imports](#manage-imports) - [Option](#option) - [Either](#either) - [IO](#io) @@ -84,7 +100,7 @@ Check out also this series of articles about functional programming with `fpdart ```yaml # pubspec.yaml dependencies: - fpdart: ^0.4.0 # Check out the latest version + fpdart: ^0.4.1 # Check out the latest version ``` ## ✨ Examples @@ -106,6 +122,9 @@ A 2 parts series explains step by step the Open Meteo API code: ### [Read/Write local file](./example/read_write_file/) Example of how to read and write a local file using functional programming. +### [Manage imports](./example/managing_imports) +Using `fpdart` with other libraries and noticing naming conflicts? Learn how to rename the classes that conflict with other SDK or third-party packages. + ### [Option](./lib/src/option.dart) Used when a return value can be missing. > For example, when parsing a `String` to `int`, since not all `String` @@ -336,6 +355,7 @@ In general, **any contribution or feedback is welcome** (and encouraged!). ## 📃 Versioning +- v0.4.1 - 25 February 2023 - **v0.4.0** - 16 December 2022 - **v0.3.0** - 11 October 2022 - **v0.2.0** - 16 July 2022 diff --git a/example/json_serializable/pubspec.lock b/example/json_serializable/pubspec.lock index f080a145..119888b8 100644 --- a/example/json_serializable/pubspec.lock +++ b/example/json_serializable/pubspec.lock @@ -191,7 +191,7 @@ packages: path: "../.." relative: true source: path - version: "0.4.0" + version: "0.4.1" frontend_server_client: dependency: transitive description: diff --git a/example/managing_imports/pubspec.lock b/example/managing_imports/pubspec.lock index a05fc7f1..6c13bd66 100644 --- a/example/managing_imports/pubspec.lock +++ b/example/managing_imports/pubspec.lock @@ -5,70 +5,80 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - url: "https://pub.dartlang.org" + sha256: e440ac42679dfc04bbbefb58ed225c994bc7e07fccc8a68ec7d3631a127e5da9 + url: "https://pub.dev" source: hosted - version: "52.0.0" + version: "54.0.0" analyzer: dependency: transitive description: name: analyzer - url: "https://pub.dartlang.org" + sha256: "2c2e3721ee9fb36de92faa060f3480c81b23e904352b087e5c64224b1a044427" + url: "https://pub.dev" source: hosted - version: "5.4.0" + version: "5.6.0" args: dependency: transitive description: name: args - url: "https://pub.dartlang.org" + sha256: "4cab82a83ffef80b262ddedf47a0a8e56ee6fbf7fe21e6e768b02792034dd440" + url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.4.0" async: dependency: transitive description: name: async - url: "https://pub.dartlang.org" + sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0 + url: "https://pub.dev" source: hosted version: "2.10.0" boolean_selector: dependency: transitive description: name: boolean_selector - url: "https://pub.dartlang.org" + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" source: hosted version: "2.1.1" collection: dependency: transitive description: name: collection - url: "https://pub.dartlang.org" + sha256: "4a07be6cb69c84d677a6c3096fcf960cc3285a8330b4603e0d463d15d9bd934c" + url: "https://pub.dev" source: hosted - version: "1.17.0" + version: "1.17.1" convert: dependency: transitive description: name: convert - url: "https://pub.dartlang.org" + sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" + url: "https://pub.dev" source: hosted version: "3.1.1" coverage: dependency: transitive description: name: coverage - url: "https://pub.dartlang.org" + sha256: "2fb815080e44a09b85e0f2ca8a820b15053982b2e714b59267719e8a9ff17097" + url: "https://pub.dev" source: hosted - version: "1.6.1" + version: "1.6.3" crypto: dependency: transitive description: name: crypto - url: "https://pub.dartlang.org" + sha256: aa274aa7774f8964e4f4f38cc994db7b6158dd36e9187aaceaddc994b35c6c67 + url: "https://pub.dev" source: hosted version: "3.0.2" file: dependency: transitive description: name: file - url: "https://pub.dartlang.org" + sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" + url: "https://pub.dev" source: hosted version: "6.1.4" fpdart: @@ -77,272 +87,310 @@ packages: path: "../.." relative: true source: path - version: "0.4.0" + version: "0.4.1" frontend_server_client: dependency: transitive description: name: frontend_server_client - url: "https://pub.dartlang.org" + sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612" + url: "https://pub.dev" source: hosted version: "3.2.0" glob: dependency: transitive description: name: glob - url: "https://pub.dartlang.org" + sha256: "4515b5b6ddb505ebdd242a5f2cc5d22d3d6a80013789debfbda7777f47ea308c" + url: "https://pub.dev" source: hosted version: "2.1.1" http_multi_server: dependency: transitive description: name: http_multi_server - url: "https://pub.dartlang.org" + sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" + url: "https://pub.dev" source: hosted version: "3.2.1" http_parser: dependency: transitive description: name: http_parser - url: "https://pub.dartlang.org" + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + url: "https://pub.dev" source: hosted version: "4.0.2" io: dependency: transitive description: name: io - url: "https://pub.dartlang.org" + sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" + url: "https://pub.dev" source: hosted - version: "1.0.3" + version: "1.0.4" js: dependency: transitive description: name: js - url: "https://pub.dartlang.org" + sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + url: "https://pub.dev" source: hosted - version: "0.6.5" + version: "0.6.7" lints: dependency: "direct dev" description: name: lints - url: "https://pub.dartlang.org" + sha256: "5e4a9cd06d447758280a8ac2405101e0e2094d2a1dbdd3756aec3fe7775ba593" + url: "https://pub.dev" source: hosted version: "2.0.1" logging: dependency: transitive description: name: logging - url: "https://pub.dartlang.org" + sha256: "04094f2eb032cbb06c6f6e8d3607edcfcb0455e2bb6cbc010cb01171dcb64e6d" + url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.1" matcher: dependency: transitive description: name: matcher - url: "https://pub.dartlang.org" + sha256: c94db23593b89766cda57aab9ac311e3616cf87c6fa4e9749df032f66f30dcb8 + url: "https://pub.dev" source: hosted version: "0.12.14" meta: dependency: transitive description: name: meta - url: "https://pub.dartlang.org" + sha256: "12307e7f0605ce3da64cf0db90e5fcab0869f3ca03f76be6bb2991ce0a55e82b" + url: "https://pub.dev" source: hosted - version: "1.8.0" + version: "1.9.0" mime: dependency: transitive description: name: mime - url: "https://pub.dartlang.org" + sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e + url: "https://pub.dev" source: hosted - version: "1.0.3" + version: "1.0.4" node_preamble: dependency: transitive description: name: node_preamble - url: "https://pub.dartlang.org" + sha256: "8ebdbaa3b96d5285d068f80772390d27c21e1fa10fb2df6627b1b9415043608d" + url: "https://pub.dev" source: hosted version: "2.0.1" package_config: dependency: transitive description: name: package_config - url: "https://pub.dartlang.org" + sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" + url: "https://pub.dev" source: hosted version: "2.1.0" path: dependency: transitive description: name: path - url: "https://pub.dartlang.org" + sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" + url: "https://pub.dev" source: hosted version: "1.8.3" pool: dependency: transitive description: name: pool - url: "https://pub.dartlang.org" + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + url: "https://pub.dev" source: hosted version: "1.5.1" pub_semver: dependency: transitive description: name: pub_semver - url: "https://pub.dartlang.org" + sha256: "307de764d305289ff24ad257ad5c5793ce56d04947599ad68b3baa124105fc17" + url: "https://pub.dev" source: hosted version: "2.1.3" shelf: dependency: transitive description: name: shelf - url: "https://pub.dartlang.org" + sha256: c24a96135a2ccd62c64b69315a14adc5c3419df63b4d7c05832a346fdb73682c + url: "https://pub.dev" source: hosted version: "1.4.0" shelf_packages_handler: dependency: transitive description: name: shelf_packages_handler - url: "https://pub.dartlang.org" + sha256: aef74dc9195746a384843102142ab65b6a4735bb3beea791e63527b88cc83306 + url: "https://pub.dev" source: hosted version: "3.0.1" shelf_static: dependency: transitive description: name: shelf_static - url: "https://pub.dartlang.org" + sha256: e792b76b96a36d4a41b819da593aff4bdd413576b3ba6150df5d8d9996d2e74c + url: "https://pub.dev" source: hosted version: "1.1.1" shelf_web_socket: dependency: transitive description: name: shelf_web_socket - url: "https://pub.dartlang.org" + sha256: a988c0e8d8ffbdb8a28aa7ec8e449c260f3deb808781fe1284d22c5bba7156e8 + url: "https://pub.dev" source: hosted version: "1.0.3" source_map_stack_trace: dependency: transitive description: name: source_map_stack_trace - url: "https://pub.dartlang.org" + sha256: "84cf769ad83aa6bb61e0aa5a18e53aea683395f196a6f39c4c881fb90ed4f7ae" + url: "https://pub.dev" source: hosted version: "2.1.1" source_maps: dependency: transitive description: name: source_maps - url: "https://pub.dartlang.org" + sha256: "708b3f6b97248e5781f493b765c3337db11c5d2c81c3094f10904bfa8004c703" + url: "https://pub.dev" source: hosted - version: "0.10.11" + version: "0.10.12" source_span: dependency: transitive description: name: source_span - url: "https://pub.dartlang.org" + sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 + url: "https://pub.dev" source: hosted version: "1.9.1" stack_trace: dependency: transitive description: name: stack_trace - url: "https://pub.dartlang.org" + sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 + url: "https://pub.dev" source: hosted version: "1.11.0" stream_channel: dependency: transitive description: name: stream_channel - url: "https://pub.dartlang.org" + sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" + url: "https://pub.dev" source: hosted version: "2.1.1" string_scanner: dependency: transitive description: name: string_scanner - url: "https://pub.dartlang.org" + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" source: hosted version: "1.2.0" term_glyph: dependency: transitive description: name: term_glyph - url: "https://pub.dartlang.org" + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" source: hosted version: "1.2.1" test: dependency: "direct main" description: name: test - url: "https://pub.dartlang.org" + sha256: "5301f54eb6fe945daa99bc8df6ece3f88b5ceaa6f996f250efdaaf63e22886be" + url: "https://pub.dev" source: hosted - version: "1.22.1" + version: "1.23.1" test_api: dependency: transitive description: name: test_api - url: "https://pub.dartlang.org" + sha256: "6182294da5abf431177fccc1ee02401f6df30f766bc6130a0852c6b6d7ee6b2d" + url: "https://pub.dev" source: hosted - version: "0.4.17" + version: "0.4.18" test_core: dependency: transitive description: name: test_core - url: "https://pub.dartlang.org" + sha256: d2e9240594b409565524802b84b7b39341da36dd6fd8e1660b53ad928ec3e9af + url: "https://pub.dev" source: hosted - version: "0.4.21" + version: "0.4.24" tuple: dependency: "direct main" description: name: tuple - url: "https://pub.dartlang.org" + sha256: "0ea99cd2f9352b2586583ab2ce6489d1f95a5f6de6fb9492faaf97ae2060f0aa" + url: "https://pub.dev" source: hosted version: "2.0.1" typed_data: dependency: transitive description: name: typed_data - url: "https://pub.dartlang.org" + sha256: "26f87ade979c47a150c9eaab93ccd2bebe70a27dc0b4b29517f2904f04eb11a5" + url: "https://pub.dev" source: hosted version: "1.3.1" very_good_analysis: dependency: "direct main" description: name: very_good_analysis - url: "https://pub.dartlang.org" + sha256: ebc48c51db35beeeec8c414e32f7bd78e612bd7f5992ccb0d46e19edaeb40b08 + url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "4.0.0+1" vm_service: dependency: transitive description: name: vm_service - url: "https://pub.dartlang.org" + sha256: f24bfb5ea0b015205e583dda73d67de44785d583ad0889929deaff3a32359ff5 + url: "https://pub.dev" source: hosted - version: "9.4.0" + version: "11.1.0" watcher: dependency: transitive description: name: watcher - url: "https://pub.dartlang.org" + sha256: "6a7f46926b01ce81bfc339da6a7f20afbe7733eff9846f6d6a5466aa4c6667c0" + url: "https://pub.dev" source: hosted version: "1.0.2" web_socket_channel: dependency: transitive description: name: web_socket_channel - url: "https://pub.dartlang.org" + sha256: ca49c0bc209c687b887f30527fb6a9d80040b072cc2990f34b9bec3e7663101b + url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.3.0" webkit_inspection_protocol: dependency: transitive description: name: webkit_inspection_protocol - url: "https://pub.dartlang.org" + sha256: "67d3a8b6c79e1987d19d848b0892e582dbb0c66c57cc1fef58a177dd2aa2823d" + url: "https://pub.dev" source: hosted version: "1.2.0" yaml: dependency: transitive description: name: yaml - url: "https://pub.dartlang.org" + sha256: "23812a9b125b48d4007117254bca50abb6c712352927eece9e155207b1db2370" + url: "https://pub.dev" source: hosted version: "3.1.1" sdks: - dart: ">=2.18.6 <3.0.0" + dart: ">=2.19.0 <4.0.0" diff --git a/example/open_meteo_api/pubspec.lock b/example/open_meteo_api/pubspec.lock index 05b6d88e..7b8e68ef 100644 --- a/example/open_meteo_api/pubspec.lock +++ b/example/open_meteo_api/pubspec.lock @@ -183,7 +183,7 @@ packages: path: "../.." relative: true source: path - version: "0.4.0" + version: "0.4.1" frontend_server_client: dependency: transitive description: diff --git a/example/pokeapi_functional/pubspec.lock b/example/pokeapi_functional/pubspec.lock index 1087b371..a88332a6 100644 --- a/example/pokeapi_functional/pubspec.lock +++ b/example/pokeapi_functional/pubspec.lock @@ -233,7 +233,7 @@ packages: path: "../.." relative: true source: path - version: "0.4.0" + version: "0.4.1" freezed: dependency: "direct main" description: diff --git a/example/read_write_file/pubspec.lock b/example/read_write_file/pubspec.lock index ebdf4fb9..e91c889d 100644 --- a/example/read_write_file/pubspec.lock +++ b/example/read_write_file/pubspec.lock @@ -7,7 +7,7 @@ packages: path: "../.." relative: true source: path - version: "0.4.0" + version: "0.4.1" lint: dependency: "direct dev" description: diff --git a/example/screenshots/screenshot_fpdart.png b/example/screenshots/screenshot_fpdart.png new file mode 100644 index 00000000..4d120e5b Binary files /dev/null and b/example/screenshots/screenshot_fpdart.png differ diff --git a/pubspec.yaml b/pubspec.yaml index 1547082e..50076785 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,9 +1,10 @@ name: fpdart -version: 0.4.0 +version: 0.4.1 homepage: https://www.sandromaglione.com/ repository: https://github.com/SandroMaglione/fpdart description: Functional programming in Dart and Flutter. All the main functional programming types and patterns fully documented, tested, and with examples. author: Maglione Sandro +documentation: https://www.sandromaglione.com/course/fpdart-functional-programming-dart-and-flutter environment: sdk: ">=2.17.0 <3.0.0" @@ -12,3 +13,7 @@ dev_dependencies: lints: ^2.0.1 test: ^1.23.1 glados: ^1.1.6 + +screenshots: + - description: "Basic usage of fpdart Option, Either, TaskEither types." + path: example/screenshots/screenshot_fpdart.png