- Minimum environment dart sdk to
3.0.0 ⚠️ (Dart 3️⃣)
environment:
sdk: ">=3.0.0 <4.0.0"
- Added new
ReaderTaskEither type
ReaderTaskEither models a complete program using Reader for dependency injection, Task to perform asynchronous computation, and Either to handle errors 🎯
- Added new
ReaderTask type
Either as sealed class (Dart 3️⃣)
- You can now use exhaustive pattern matching (
Left or Right)
/// Pattern matching
final match = right.match(
(l) => print('Left($l)'),
(r) => print('Right($r)'),
);
/// or use Dart's pattern matching as well 🤝
final dartMatch = switch (right) {
Left(value: final l) => 'Left($l)',
Right(value: final r) => 'Right($r)',
};
Option as sealed class (Dart 3️⃣)
- You can now use exhaustive pattern matching (
None or Some)
/// Pattern matching
final match = option.match(
() => print('None'),
(a) => print('Some($a)'),
);
/// or use Dart's pattern matching as well 🤝
final dartMatch = switch (option) {
None() => 'None',
Some(value: final a) => 'Some($a)',
};
- Types marked as
final (no extends nor implements) (Dart 3️⃣)
Unit
Reader
State
StateAsync
IO
IORef
IOOption
IOEither
Task
TaskOption
TaskEither
ReaderTask
ReaderTaskEither
- Removed
Tuple2, use Dart 3 Records instead (Tuple2(a, b) becomes simply (a, b) 🎯) ⚠️ (Dart 3️⃣)
- Updated all internal APIs to use records instead of
Tuple2
- Major refactoring of
Iterable and List extension methods
- Improved performance
- Correct return types (
Iterable and List) (#65)
- Added the following methods
prependAll (Iterable)
intersperse (Iterable)
difference (Iterable)
filterWithIndex (Iterable)
- Fixed the following methods ⚠️
takeWhileRight: Resulting List now in reversed order as expected
dropWhileRight: Resulting List now in reversed order as expected
- Updated the following methods ⚠️
foldRight, foldRightWithIndex (List): Changed parameter order in combine function
zipWith (Iterable): Changed parameters definition, no more curried
- Renamed the following methods ⚠️
plus → concat (Iterable)
concat → flatten (on Iterable<Iterable<T>>)
- Removed the following methods ⚠️
concatMap (use flatMap instead)
bind (use flatMap instead)
bindWithIndex (use flatMapWithIndex instead)
concatMapWithIndex (use flatMapWithIndex instead)
- Refactoring of
Map extension methods
- Improved performance
- Added the following methods
- Removed the following methods ⚠️
member (use containsKey instead)
elem (use containsValue instead)
toIterable (use toSortedList instead)
- Updated the following methods ⚠️
toIterable renamed to toSortedList (return a List instead of Iterable)
modifyAt changed parameter order and no more curried
modifyAtIfPresent changed parameter order and no more curried
updateAt no more curried
updateAtIfPresent no more curried
deleteAt no more curried
upsertAt no more curried
pop no more curried
foldLeft no more curried
foldLeftWithKey no more curried
foldLeftWithIndex no more curried
foldLeftWithKeyAndIndex no more curried
foldRight no more curried
foldRightWithKey no more curried
foldRightWithIndex no more curried
foldRightWithKeyAndIndex no more curried
union no more curried
intersection no more curried
isSubmap no more curried
collect no more curried
difference no more curried
- Added conversions helpers from
String to num, int, double, and bool using Option and Either (both as extension methods on String and as functions) (#80)
toNumOption
toIntOption
toDoubleOption
toBoolOption
toNumEither
toIntEither
toDoubleEither
toBoolEither
/// As extension on [String]
final result = "10".toNumOption; /// `Some(10)`
final result = "10.5".toNumOption; /// `Some(10.5)`
final result = "0xFF".toIntOption; /// `Some(255)`
final result = "10.5".toDoubleOption; /// `Some(10.5)`
final result = "NO".toBoolEither(() => "left"); /// `Left("left")`
/// As functions
final result = toNumOption("10"); /// `Some(10)`
final result = toNumOption("10.5"); /// `Some(10.5)`
final result = toIntOption("0xFF"); /// `Some(255)`
final result = toDoubleOption("10.5"); /// `Some(10.5)`
final result = toBoolEither("NO", () => "left"); /// `Left("left")`
- Changed
dateNow, now, random, and randomBool to getter functions
/// Before
Option<T> getRandomOption<T>(T value) => randomBool()
.map((isValid) => isValid ? some(value) : none<T>())
.run();
/// Now
Option<T> getRandomOption<T>(T value) => randomBool
.map((isValid) => isValid ? some(value) : none<T>())
.run();
- Removed
Predicate class and added extension methods in its place ⚠️
bool isEven(int n) => n % 2 == 0;
bool isDivisibleBy3(int n) => n % 3 == 0;
final isOdd = isEven.negate;
final isEvenAndDivisibleBy3 = isEven.and(isDivisibleBy3);
final isEvenOrDivisibleBy3 = isEven.or(isDivisibleBy3);
final isStringWithEvenLength = isEven.contramap<String>((n) => n.length);
- Updated curry / uncarry extensions ⚠️
- Renamed
curry to curryAll for functions with 3, 4, 5 parameters
- Changed definition of
curry to curry only the first parameter
- Changed
uncurry and curry extension to getter function
- Removed
curry and uncurry as functions (use extension method instead)
- Added
curryLast (curry last parameter)
int Function(int) subtractCurried(int n1) => (n2) => n1 - n2;
/// Before
subtractCurried.uncurry()(10, 5);
final addFunction = (int a, int b) => a + b;
final add = curry2(addFunction);
[1, 2, 3].map(add(1)); // returns [2, 3, 4]
/// New
subtractCurried.uncurry(10, 5);
final addFunction = (int a, int b) => a + b;
final add = addFunction.curry;
[1, 2, 3].map(add(1)); // returns [2, 3, 4]
[1, 2, 3].map(addFunction.curry(1)); // returns [2, 3, 4]
- Changed
Eq static constructors to methods
- Added
xor method to Eq
- Moved
DateTime instances of Eq as Eq static members
/// Before
final eq = dateEqYear; // Global
/// Now
final eq = Eq.dateEqYear;
- Added
Eq instances for num, int, double, String, and bool
[1, 2, 3].difference(Eq.eqInt, [2, 3, 4]); /// `[1]`
class Parent {
final int value1;
final double value2;
const Parent(this.value1, this.value2);
}
/// Equality for values of type [Parent] based on their `value1` ([int]).
final eqParentInt = Eq.eqInt.contramap<Parent>(
(p) => p.value1,
);
/// Equality for of type [Parent] based on their `value2` ([double]).
final eqParentDouble = Eq.eqDouble.contramap<Parent>(
(p) => p.value2,
);
- Changed
reverse in Order from static constructor to getter method
/// Before
final reversed = Order.reverse(instance);
/// Now
final reversed = instance.reverse;
- Moved
DateTime instances of Order as Order static members
- Added
Order instances for num, int, double
- Added new methods to
Order
class Parent {
final int value1;
final double value2;
const Parent(this.value1, this.value2);
}
/// Order values of type [Parent] based on their `value1` ([int]).
final orderParentInt = Order.orderInt.contramap<Parent>(
(p) => p.value1,
);
/// Order values of type [Parent] based on their `value2` ([double]).
final orderParentDouble = Order.orderDouble.contramap<Parent>(
(p) => p.value2,
);
- Removed
bool extension (match and fold), use the ternary operator or pattern matching instead ⚠️
final boolValue = Random().nextBool();
/// Before
final result = boolValue.match<int>(() => -1, () => 1);
final result = boolValue.fold<int>(() => -1, () => 1);
/// Now
final result = boolValue ? 1 : -1;
final result = switch (boolValue) { true => 1, false => -1 };
- Removed global
id and idFuture, use identity and identityFuture instead ⚠️
- Removed global
idFirst and idSecond functions ⚠️
- Removed
Compose class and extension methods ⚠️
- Removed
Magma typedef ⚠️
- Removed extension methods on nullable types (
toOption, toEither, toTaskOption, toIOEither, toTaskEither, toTaskEitherAsync) ⚠️
- Organized all extensions inside internal
extension folder
- Updated README