fpdart 0.6.0 icon indicating copy to clipboard operation
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 🎯)
/// 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 in IOEither (use toTaskEither instead) ⚠️
  • Improved performance of fpdart's sortBy 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 for None (fixes #95)
    • Removed Alt and Foldable type classes, the following methods are not available anymore
      • foldLeft
      • foldRight
      • foldMap
      • foldRightWithIndex
      • foldLeftWithIndex
      • length
      • any
      • all
      • concatenate
      • plus
      • prepend
      • append
  • 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 for Option type (thanks [again] to tim-smart 🎉)
    • Allow for decoding of non-primitive types (with custom fromJson constructors)
/// `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 and Option.none factories const (thanks to f-person 🎉)

Note: People who have the prefer_const_constructors lint enabled will notice a warning to use const 🤝

v0.4.0 - 16 December 2022 #

  • Added extension methods to work with nullable types (T?)
    • From T? to fpdart's types
      • toOption
      • toEither
      • toTaskOption
      • toIOEither
      • toTaskEither
      • toTaskEitherAsync
      • fromNullable (Either, IOEither, TaskOption TaskEither)
      • fromNullableAsync (TaskEither)
    • From fpdart's types to T?
      • toNullable (Either)
/// [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 to Either
  • 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 to TaskEither
  • Added safeCast (Either and Option)
  • Added safeCastStrict (Either and Option)
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);

v0.3.0 - 11 October 2022 #

  • Inverted onSome and onNone functions parameters in match method of Option [⚠️ 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 and sequence 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 in TaskEither (#58)
/// Chain [Either] to [TaskEither]
TaskEither<String, int> binding =
    TaskEither<String, String>.of("String").bindEither(Either.of(20));
  • Added lefts, rights, and partitionEithers methods to Either (#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 to Either, IOEither, and Tuple2 (#57)
  • Added mapLeft method to IOEither (#57)
  • Added fold method to Option (same as match) (#56)
  • Fixed chainFirst for Either, TaskEither, and IOEither 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"

v0.2.0 - 16 July 2022 #

v0.1.0 - 17 June 2022 #

  • Added idFuture and identityFuture methods (#38) by f-person 🎉
  • Added mapBoth method to Tuple2 (#30)
  • Fixed linting warnings
  • Fixed issue with upsert method for Map (#37) ⚠️
  • Minimum environment dart sdk to 2.16.0 ⚠️
environment:
  sdk: ">=2.16.0 <3.0.0"

v0.0.14 - 31 January 2022 #

  • Updated package linting to lints

v0.0.13 - 26 January 2022 #

  • New methods to TaskEither, TaskOption, Either, and Option
    • mapLeft (TaskEither)
    • bimap (TaskEither)
    • toTaskEither (Either)
    • toTaskOption (Option)
  • New Blog posts and tutorials section in README

v0.0.12 - 24 October 2021 #

  • Completed IORef type implementation, documentation, and testing

v0.0.11 - 22 September 2021 #

  • Fixed major issue in State and StateAsync implementation [BREAKING CHANGE]
    • Methods flatMap, map, map2, map3, ap, andThen, call, and flatten had an implementation issue that has been now fixed

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 in Monad and Monad2

v0.0.9 - 3 August 2021 #

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 and toTask methods to IO to lift and chain IO with Task
  • Added flatMapTask and toTask methods to IOEither to lift and chain IOEither with TaskEither
  • Added pattern matching extension methods to bool (boolean.dart)
  • Added functions to get random int, double, and bool in a functional way (using IO) (random.dart)
  • Added functions, extension methods, Ord, and Eq instances to DateTime (date.dart)

v0.0.7 - 6 July 2021 #

  • Released Part 2 of Fpdart, Functional Programming in Dart and Flutter
  • Added Compose and Compose2, used to easily compose functions in a chain
  • Added curry and uncurry extensions on functions up to 5 parameters
  • Completed TaskOption type implementation, documentation, and testing
  • Expanded documentation and examples
  • Added TaskEither.tryCatchK and Either.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 and optionOf (same as dartz)
  • Added Either.right(r) factory constructor to Either class (same as Either.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 and left functions to create instance of Either
    • Added id function (same as identity)
    • Added fold method to Either (same as match)
    • Added bind method to Either (same as flatMap)
    • Added bindFuture method to Either, which returns TaskEither

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 on Option and Either [BREAKING CHANGE]
  • Completed Tuple2 type implementation, documentation, and testing [BREAKING CHANGE]
  • Renamed fold method of Foldable to foldLeft [BREAKING CHANGE]
  • Updated methods API (foldRight, foldLeft, etc.) of Foldable 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 to Option 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
411
likes
140
pub points
98%
popularity
screenshot
image

Publisher

verified publisher iconsandromaglione.com

Functional programming in Dart and Flutter. All the main functional programming types and patterns fully documented, tested, and with examples.

Homepage
Repository (GitHub)
View/report issues

Documentation

Documentation
API reference

License

Icon for licenses.MIT (LICENSE)

More

Packages that depend on fpdart