fpdart 0.6.0-dev.1
fpdart: ^0.6.0-dev.1 copied to clipboard
Functional programming in Dart and Flutter. All the main functional programming types and patterns fully documented, tested, and with examples.
0.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 π)
0.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
0.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)
0.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)
0.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
0.1.0 17 June 2022 #
0.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
0.0.12 24 October 2021 #
- Completed
IORef
type implementation, documentation, and testing- Merged PR (#25) by purplenoodlesoop π
0.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
0.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
0.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)
0.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
)
0.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) π
0.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) π
0.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
0.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]
0.0.3 13 June 2021 #
- Changed name of type
Maybe
toOption
to be inline with fp-ts, cats, and dartz [BREAKING CHANGE]
0.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
0.0.1 28 May 2021 #
Eq
Hash
PartialOrder