fpdart 0.6.0 fpdart: ^0.6.0 copied to clipboard
Functional programming in Dart and Flutter. All the main functional programming types and patterns fully documented, tested, and with examples.
v0.6.0 - 6 May 2023 #
- Do notation #97 (Special thanks to @tim-smart 🎉)
- All the main types now have a
Do()
constructor used to initialize a Do notation chain - Updated examples to use Do notation (new recommended API 🎯)
- All the main types now have a
/// Without the Do notation
String goShopping() => goToShoppingCenter()
.alt(goToLocalMarket)
.flatMap(
(market) => market.buyBanana().flatMap(
(banana) => market.buyApple().flatMap(
(apple) => market.buyPear().flatMap(
(pear) => Option.of('Shopping: $banana, $apple, $pear'),
),
),
),
)
.getOrElse(
() => 'I did not find 🍌 or 🍎 or 🍐, so I did not buy anything 🤷♂️',
);
/// Using the Do notation
String goShoppingDo() => Option.Do(
($) {
final market = $(goToShoppingCenter().alt(goToLocalMarket));
final amount = $(market.buyAmount());
final banana = $(market.buyBanana());
final apple = $(market.buyApple());
final pear = $(market.buyPear());
return 'Shopping: $banana, $apple, $pear';
},
).getOrElse(
() => 'I did not find 🍌 or 🍎 or 🍐, so I did not buy anything 🤷♂️',
);
- Added new
IOOption
type - Added conversion methods from and to all classes (
IO
,IOOption
,IOEither
,Task
,TaskOption
,TaskEither
)- Removed
toTask
inIOEither
(usetoTaskEither
instead) ⚠️
- Removed
- Improved performance of
fpdart
'ssortBy
list extension #101 (thanks to @hbock-42 🎉) - Updated
pokeapi_functional
example to Riverpod v2 #99 (thanks to @utamori 🎉) - Updated repository folder structure #105
v0.5.0 - 4 March 2023 #
- Updates to
Option
type #92 [⚠️ BREAKING CHANGE]- Added
const factory
constructor forNone
(fixes #95) - Removed
Alt
andFoldable
type classes, the following methods are not available anymorefoldLeft
foldRight
foldMap
foldRightWithIndex
foldLeftWithIndex
length
any
all
concatenate
plus
prepend
append
- Added
- Updated examples and fixed lint warnings #93 (thanks to tim-smart 🎉)
v0.4.1 - 25 February 2023 #
- New methods for
Option
type (thanks to tim-smart 🎉)flatMapNullable
flatMapThrowable
final option = Option.of(10);
option.flatMapNullable((a) => a + 1); /// 👈 `Some(11)`
option.flatMapThrowable((a) => a + 1); /// 👈 `Some(11)`
option.flatMapNullable<int>((a) => null); /// 👈 `None()`
option.flatMapThrowable<int>((a) => throw "fail"); /// 👈 `None()`
- Improved support
fromJson
forOption
type (thanks [again] to tim-smart 🎉)- Allow for decoding of non-primitive types (with custom
fromJson
constructors)
- Allow for decoding of non-primitive types (with custom
/// `fromJson` on `DateTime` with `Option` type
final now = DateTime.now();
Option<DateTime>.fromJson(now.toIso8601String(), (a) => DateTime.parse(a as String)); /// 👈 `Some(now)`
Option<DateTime>.fromJson("fail", (a) => DateTime.parse(a as String)); /// 👈 `None()`
- New extension methods for
Map
(thanks [once again] to tim-smart 🎉)extract
extractMap
final map = <String, dynamic>{'a': 1, 'b': 2, 'c': 3, 'd': 4};
map.extract<int>('b'); /// 👈 `Some(2)`
map.extract<String>('b'); /// 👈 `None()`, not of type `String` ⚠️
final map = <String, dynamic>{'a': 1};
map.extractMap('a'); /// 👈 `None()`, not a `Map`
final map = <String, dynamic>{'a': {'b': 2} };
map.extractMap('a'); /// 👈 `Some({'b': 2})`
Option.of
andOption.none
factoriesconst
(thanks to f-person 🎉)
Note: People who have the prefer_const_constructors lint enabled will notice a warning to use
const
🤝
- New
managing_imports
example (thanks to RandalSchwartz 🎉) - Updated README introduction
v0.4.0 - 16 December 2022 #
- Added extension methods to work with nullable types (
T?
)- From
T?
tofpdart
's typestoOption
toEither
toTaskOption
toIOEither
toTaskEither
toTaskEitherAsync
fromNullable
(Either
,IOEither
,TaskOption
TaskEither
)fromNullableAsync
(TaskEither
)
- From
fpdart
's types toT?
toNullable
(Either
)
- From
/// [Option] <-> `int?`
int? value1 = 10.toOption().map((t) => t + 10).toNullable();
bool? value2 = value1?.isEven;
/// `bool?` -> [Either] -> `int?`
int? value3 = value2
.toEither(() => "Error")
.flatMap((a) => a ? right<String, int>(10) : left<String, int>("None"))
.toNullable();
/// `int?` -> [Option]
Option<int> value4 = (value3?.abs().round()).toOption().flatMap(Option.of);
- Added
toIOEither
toEither
- Removed parameter from
Either
fromNullable
[⚠️ BREAKING CHANGE]
final either = Either<String, int>.fromNullable(value, (r) => 'none');
/// 👆 Removed the value `(r)` (it was always null anyway 💁🏼♂️) 👇
final either = Either<String, int>.fromNullable(value, () => 'none');
- Added
chainEither
toTaskEither
- Added
safeCast
(Either
andOption
) - Added
safeCastStrict
(Either
andOption
)
int intValue = 10;
/// Unhandled exception: type 'int' is not a subtype of type 'List<int>' in type cast
final waitWhat = intValue as List<int>;
final first = waitWhat.first;
/// Safe 🎯
final wellYeah = Either<String, List<int>>.safeCast(
intValue,
(dynamic value) => 'Not a List!',
);
final firstEither = wellYeah.map((list) => list.first);
- Added Open API Meteo example (from imperative to functional programming)
- Added new articles
- Option type and Null Safety in dart
- Either - Error Handling in Functional Programming
- Future & Task: asynchronous Functional Programming
- Flutter Supabase Functional Programming with fpdart
- Open Meteo API - Functional programming with fpdart (Part 1)
- Open Meteo API - Functional programming with fpdart (Part 2)
v0.3.0 - 11 October 2022 #
- Inverted
onSome
andonNone
functions parameters inmatch
method ofOption
[⚠️ BREAKING CHANGE] (Read more on why 👉 #56)
/// Everywhere you are using `Option.match` you must change this:
final match = option.match(
(a) => print('Some($a)'),
() => print('None'), // <- `None` second 👎
);
/// to this (invert parameters order):
final match = option.match(
() => print('None'), // <- `None` first 👍
(a) => print('Some($a)'),
);
- Added
traverse
andsequence
methods (#55)traverseList
traverseListWithIndex
sequenceList
traverseListSeq
traverseListWithIndexSeq
sequenceListSeq
/// "a40" is invalid 💥
final inputValues = ["10", "20", "30", "a40"];
/// Verify that all the values can be converted to [int] 🔐
///
/// If **any** of them is invalid, then the result is [None] 🙅♂️
final traverseOption = inputValues.traverseOption(
(a) => Option.tryCatch(
/// If `a` does not contain a valid integer literal a [FormatException] is thrown
() => int.parse(a),
),
);
- Added
bindEither
method inTaskEither
(#58)
/// Chain [Either] to [TaskEither]
TaskEither<String, int> binding =
TaskEither<String, String>.of("String").bindEither(Either.of(20));
- Added
lefts
,rights
, andpartitionEithers
methods toEither
(#57)
final list = [
right<String, int>(1),
right<String, int>(2),
left<String, int>('a'),
left<String, int>('b'),
right<String, int>(3),
];
final result = Either.partitionEithers(list);
expect(result.first, ['a', 'b']);
expect(result.second, [1, 2, 3]);
- Added
bimap
method toEither
,IOEither
, andTuple2
(#57) - Added
mapLeft
method toIOEither
(#57) - Added
fold
method toOption
(same asmatch
) (#56) - Fixed
chainFirst
forEither
,TaskEither
, andIOEither
when chaining on a failure (Left
) (#47) by DevNico 🎉 - Added
const
to all constructors in which it was missing (#59) - Minimum environment dart sdk to
2.17.0
⚠️
environment:
sdk: ">=2.17.0 <3.0.0"
-
Updated README and documentation
-
Testing improvements (internal)
- Added testing utils
- Added Property-based testing using
glados
- Fixed tests for
match()
method by addingfail
in unexpected matched branch
-
Contribution improvements
- Added testing workflow with Github actions (#54)
v0.2.0 - 16 July 2022 #
- Refactoring for mixin breaking change (#42) by TimWhiting 🎉
- Added
chainFirst
method for the following classes (#39)TaskEither
Either
IO
IOEither
State
StateAsync
Reader
v0.1.0 - 17 June 2022 #
v0.0.13 - 26 January 2022 #
- New methods to
TaskEither
,TaskOption
,Either
, andOption
mapLeft
(TaskEither
)bimap
(TaskEither
)toTaskEither
(Either
)toTaskOption
(Option
)
- New Blog posts and tutorials section in
README
- New blog post How to map an Either to a Future in fpdart
v0.0.12 - 24 October 2021 #
- Completed
IORef
type implementation, documentation, and testing- Merged PR (#25) by purplenoodlesoop 🎉
v0.0.11 - 22 September 2021 #
- Fixed major issue in
State
andStateAsync
implementation [BREAKING CHANGE]- Methods
flatMap
,map
,map2
,map3
,ap
,andThen
,call
, andflatten
had an implementation issue that has been now fixed
- Methods
v0.0.10 - 13 August 2021 #
- Released introduction to Practical Functional Programming
- Completed
StateAsync
type implementation, documentation, and testing - Fixed problem with
Alt
typeclass (#21) - Added
call
method to more easily chain functions inMonad
andMonad2
v0.0.9 - 3 August 2021 #
- Released two new tutorials on the
Option
type: - Added
toJson
andfromJson
methods toOption
to usejson_serializable
to convertOption
type to and from Json (using@JsonSerializable
) - Added functional extension methods on
Map
- Added composable
Predicate
type (and&
, or|
, not~
, xor^
) (#18)
v0.0.8 - 13 July 2021 #
- Released Part 3 of Fpdart, Functional Programming in Dart and Flutter
- Added Pure Functional Flutter app example (
pokeapi_functional
) - Added
flatMapTask
andtoTask
methods toIO
to lift and chainIO
withTask
- Added
flatMapTask
andtoTask
methods toIOEither
to lift and chainIOEither
withTaskEither
- Added pattern matching extension methods to
bool
(boolean.dart
) - Added functions to get random
int
,double
, andbool
in a functional way (usingIO
) (random.dart
) - Added functions, extension methods,
Ord
, andEq
instances toDateTime
(date.dart
)
v0.0.7 - 6 July 2021 #
- Released Part 2 of Fpdart, Functional Programming in Dart and Flutter
- Added
Compose
andCompose2
, used to easily compose functions in a chain - Added
curry
anduncurry
extensions on functions up to 5 parameters - Completed
TaskOption
type implementation, documentation, and testing - Expanded documentation and examples
- Added
TaskEither.tryCatchK
andEither.tryCatchK
, by tim-smart (#10, #11) 🎉
v0.0.6 - 29 June 2021 #
- Released Part 1 of Fpdart, Functional Programming in Dart and Flutter
- Added functional extension methods on
Iterable
(List
) - Completed
IOEither
type implementation, documentation, and testing - Added
constF
function - Added
option
andoptionOf
(same as dartz) - Added
Either.right(r)
factory constructor toEither
class (same asEither.of(r)
) (#3) - Added example on reading local file using
TaskEither
(read_write_file) - Added more examples
- Added constant constructors to Eq and variants, by mateusfccp (#4) 🎉
v0.0.5 - 20 June 2021 #
- Completed
State
type implementation, documentation, and testing - Completed
Reader
type implementation, documentation, and testing - Completed
IO
type implementation, documentation, and testing - Merged PR (#2) by jacobaraujo7 🎉
- Added
right
andleft
functions to create instance ofEither
- Added
id
function (same asidentity
) - Added
fold
method toEither
(same asmatch
) - Added
bind
method toEither
(same asflatMap
) - Added
bindFuture
method toEither
, which returnsTaskEither
- Added
v0.0.4 - 15 June 2021 #
- Completed
Unit
type documentation - Completed
Task
type implementation, documentation, and testing - Completed
TaskEither
type implementation, documentation, and testing - Completed implementation, documentation, and testing of
Foldable
instance onOption
andEither
[BREAKING CHANGE] - Completed
Tuple2
type implementation, documentation, and testing [BREAKING CHANGE] - Renamed
fold
method ofFoldable
tofoldLeft
[BREAKING CHANGE] - Updated methods API (
foldRight
,foldLeft
, etc.) ofFoldable
instances (Option
,Either
,Tuple
) [BREAKING CHANGE] IList
not longer working correctly (waiting for a better solution for immutable collections) [BREAKING CHANGE]
v0.0.3 - 13 June 2021 #
- Changed name of type
Maybe
toOption
to be inline with fp-ts, cats, and dartz [BREAKING CHANGE]
v0.0.2 - 13 June 2021 #
First major release:
Types #
Either
IList
Maybe
Reader
State
Task
TaskEither
Tuple
Unit
Typeclasses #
Alt
Applicative
Band
BoundedSemilattice
CommutativeGroup
CommutativeMonoid
CommutativeSemigroup
Eq
Extend
Filterable
Foldable
Functor
Group
Hash
HKT
Monad
Monoid
Order
PartialOrder
Semigroup
Semilattice
Examples #
Either
curry
Maybe
Reader
State
v0.0.1 - 28 May 2021 #
Eq
Hash
PartialOrder