Skip to content

Commit

Permalink
improved usage of type system
Browse files Browse the repository at this point in the history
  • Loading branch information
felixblaschke committed Jan 25, 2020
1 parent fc17ce6 commit 700ea4a
Show file tree
Hide file tree
Showing 8 changed files with 56 additions and 59 deletions.
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
- **New:** Iterable `lastIndex` getter
- **Improved:** Added `null` check for int `until`
- **Improved:** Added `null` check for int `times`
- **Improved:** Removed implicit casts
- **Improved:** Removed implicit casts and improved usage of strong types

## 1.1.0

Expand Down
4 changes: 2 additions & 2 deletions lib/int/int.dart
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,9 @@ extension Int_ on int {
Iterable<int> until(int n) {
ArgumentError.checkNotNull(n, "n");
if (this < n) {
return this.rangeTo(n - 1);
return rangeTo(n - 1);
} else if (this > n) {
return this.rangeTo(n + 1);
return rangeTo(n + 1);
} else {
return Iterable.empty();
}
Expand Down
8 changes: 4 additions & 4 deletions lib/iterable/iterable_double.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ extension IterableOfDouble_ on Iterable<double> {
/// [2.0, 6.0, 4.0, 8.0].sum(); // 20.0
/// ```
double sum() {
return this.sumByDouble((n) => n);
return sumByDouble((n) => n);
}

/// Returns the average value (arithmetic mean) of all elements.
Expand All @@ -19,7 +19,7 @@ extension IterableOfDouble_ on Iterable<double> {
/// [2.0, 4.0, 6.0, 8.0].average(); // 5.0
/// ```
double average() {
return this.averageBy((n) => n);
return averageBy((n) => n);
}

/// Returns the largest value of all elements
Expand All @@ -29,7 +29,7 @@ extension IterableOfDouble_ on Iterable<double> {
/// [9.0, 42.0, 3.0].max(); // 42.0
/// ```
double max() {
return this.maxBy((a, b) => a.compareTo(b));
return maxBy((a, b) => a.compareTo(b));
}

/// Returns the lowest value of all elements
Expand All @@ -39,6 +39,6 @@ extension IterableOfDouble_ on Iterable<double> {
/// [17.0, 13.0, 92.0].min(); // 13.0
/// ```
double min() {
return this.minBy((a, b) => a.compareTo(b));
return minBy((a, b) => a.compareTo(b));
}
}
8 changes: 4 additions & 4 deletions lib/iterable/iterable_int.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ extension IterableOfInt_ on Iterable<int> {
/// [2, 6, 4, 8].sum(); // 20
/// ```
int sum() {
return this.sumBy((n) => n);
return sumBy((n) => n);
}

/// Returns the average value (arithmetic mean) of all elements.
Expand All @@ -19,7 +19,7 @@ extension IterableOfInt_ on Iterable<int> {
/// [2, 4, 6, 8].average(); // 5.0
/// ```
double average() {
return this.averageBy((n) => n);
return averageBy((n) => n);
}

/// Returns the largest value of all elements
Expand All @@ -29,7 +29,7 @@ extension IterableOfInt_ on Iterable<int> {
/// [9, 42, 3].max(); // 42
/// ```
int max() {
return this.maxBy((a, b) => a.compareTo(b));
return maxBy((a, b) => a.compareTo(b));
}

/// Returns the lowest value of all elements
Expand All @@ -39,6 +39,6 @@ extension IterableOfInt_ on Iterable<int> {
/// [17, 13, 92].min(); // 13
/// ```
int min() {
return this.minBy((a, b) => a.compareTo(b));
return minBy((a, b) => a.compareTo(b));
}
}
75 changes: 36 additions & 39 deletions lib/iterable/iterable_object.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
part of supercharged;

/// Supercharged extensions on [Iterables] like [List] and [Set].
extension Iterable_<T, K, V> on Iterable<T> {
extension Iterable_<T> on Iterable<T> {
/// Returns the sum of all values produced by the [selector] function that is
/// applied to each element.
///
Expand All @@ -12,7 +12,7 @@ extension Iterable_<T, K, V> on Iterable<T> {
/// ```
int sumBy(int Function(T) selector) {
ArgumentError.checkNotNull(selector, "selector");
return this.fold(0, (value, element) => value + selector(element));
return map(selector).fold(0, (prev, curr) => prev + curr);
}

/// Returns the sum of all values produced by the [selector] function that is
Expand All @@ -24,8 +24,7 @@ extension Iterable_<T, K, V> on Iterable<T> {
/// ```
double sumByDouble(num Function(T) selector) {
ArgumentError.checkNotNull(selector, "selector");
return this
.fold(0.0, (value, element) => value + selector(element).toDouble());
return map(selector).fold(0.0, (prev, curr) => prev + curr);
}

/// Returns the average value (arithmetic mean) of all values produces by the
Expand All @@ -38,11 +37,11 @@ extension Iterable_<T, K, V> on Iterable<T> {
/// ```
double averageBy(num Function(T) selector) {
ArgumentError.checkNotNull(selector, "selector");
if (this.isEmpty) {
if (isEmpty) {
return null;
}

return (this as List<T>).sumByDouble(selector) / this.length;
return sumByDouble(selector) / length;
}

/// Splits the elements into lists of the specified [size].
Expand All @@ -62,14 +61,14 @@ extension Iterable_<T, K, V> on Iterable<T> {
throw ArgumentError("chunkSize must be positive integer greater than 0.");
}

if (this.isEmpty) {
if (isEmpty) {
return Iterable.empty();
}

var countOfChunks = (this.length / size.toDouble()).ceil();
var countOfChunks = (length / size.toDouble()).ceil();

return Iterable.generate(countOfChunks, (int index) {
var chunk = this.skip(index * size).take(size).toList();
var chunk = skip(index * size).take(size).toList();

if (fill != null) {
while (chunk.length < size) {
Expand All @@ -95,7 +94,7 @@ extension Iterable_<T, K, V> on Iterable<T> {
test = (_) => true;
}

if (this.isEmpty) {
if (isEmpty) {
return 0;
}

Expand All @@ -115,7 +114,7 @@ extension Iterable_<T, K, V> on Iterable<T> {
/// This method is an alias for [where].
Iterable<T> filter(bool Function(T element) test) {
ArgumentError.checkNotNull(test, "test");
return this.where(test);
return where(test);
}

/// Applies the function [funcIndexValue] to each element of this collection
Expand All @@ -131,9 +130,9 @@ extension Iterable_<T, K, V> on Iterable<T> {
void forEachIndexed(void Function(int index, T element) funcIndexValue) {
ArgumentError.checkNotNull(funcIndexValue, "funcIndexValue");
var index = 0;
var iterator = this.iterator;
while (iterator.moveNext()) {
funcIndexValue(index++, iterator.current);
var iter = iterator;
while (iter.moveNext()) {
funcIndexValue(index++, iter.current);
}
}

Expand All @@ -150,7 +149,7 @@ extension Iterable_<T, K, V> on Iterable<T> {
ArgumentError.checkNotNull(orElse, "orElse");

try {
return this.elementAt(index);
return elementAt(index);
} catch (error) {
return orElse();
}
Expand All @@ -164,7 +163,7 @@ extension Iterable_<T, K, V> on Iterable<T> {
/// ["a", "b"].elementAtOrNull(2); // null
/// ```
T elementAtOrNull(int index) {
return (this as List<T>).elementAtOrElse(index, () => null);
return elementAtOrElse(index, () => null);
}

/// Returns the first element. If there is no first element the [orElse]
Expand All @@ -177,7 +176,7 @@ extension Iterable_<T, K, V> on Iterable<T> {
/// ```
T firstOrElse(T Function() orElse) {
ArgumentError.checkNotNull(orElse, "orElse");
return (this as List<T>).firstWhere((_) => true, orElse: orElse);
return firstWhere((_) => true, orElse: orElse);
}

/// Returns the first element. If there is no first element it will
Expand All @@ -189,7 +188,7 @@ extension Iterable_<T, K, V> on Iterable<T> {
/// [].firstOrNull(); // null
/// ```
T firstOrNull() {
return (this as List<T>).firstOrElse(() => null);
return firstOrElse(() => null);
}

/// Returns the last element. If there is no last element the [orElse]
Expand All @@ -202,7 +201,7 @@ extension Iterable_<T, K, V> on Iterable<T> {
/// ```
T lastOrElse(T Function() orElse) {
ArgumentError.checkNotNull(orElse, "orElse");
return this.lastWhere((_) => true, orElse: orElse);
return lastWhere((_) => true, orElse: orElse);
}

/// Returns the last element. If there is no last element it will
Expand All @@ -214,7 +213,7 @@ extension Iterable_<T, K, V> on Iterable<T> {
/// [].lastOrElse(); // null
/// ```
T lastOrNull() {
return (this as List<T>).lastOrElse(() => null);
return lastOrElse(() => null);
}

/// Groups the elements of the list into a map by a key
Expand All @@ -240,7 +239,7 @@ extension Iterable_<T, K, V> on Iterable<T> {
/// valueTransform: (p) => p.name);
/// // map = {"young": ["John", "Carl"], "old": ["Peter", "Sarah"]}
/// ```
Map<K, List<V>> groupBy(K Function(T element) keySelector,
Map<K, List<V>> groupBy<K, V>(K Function(T element) keySelector,
{V Function(T element) valueTransform}) {
ArgumentError.checkNotNull(keySelector);

Expand All @@ -250,7 +249,7 @@ extension Iterable_<T, K, V> on Iterable<T> {

Map<K, List<V>> map = {};

this.forEach((element) {
forEach((element) {
var key = keySelector(element);

if (!map.containsKey(key)) {
Expand All @@ -270,9 +269,9 @@ extension Iterable_<T, K, V> on Iterable<T> {
/// ```dart
/// [1, 2, 3].associate((e) => MapEntry("key_$e", e * 100)); // {"key_1": 100, "key_2": 200, "key_3": 300}
/// ```
Map<K, V> associate(MapEntry<K, V> Function(T element) transform) {
Map<K, V> associate<K, V>(MapEntry<K, V> Function(T element) transform) {
ArgumentError.checkNotNull(transform, "transform");
return Map.fromEntries(this.map(transform));
return Map.fromEntries(map(transform));
}

/// Returns a map where every [element] is associated by a key produced from
Expand All @@ -284,10 +283,10 @@ extension Iterable_<T, K, V> on Iterable<T> {
/// ```dart
/// ["a", "ab", "abc"].associateBy((e) => e.length); // {1: "a", 2: "ab", 3: "abc"}
/// ```
Map<K, T> associateBy(K Function(T element) keySelector) {
Map<K, T> associateBy<K>(K Function(T element) keySelector) {
ArgumentError.checkNotNull(keySelector, "keySelector");
Map<K, T> map = Map();
this.forEach((element) {
forEach((element) {
var key = keySelector(element);
map[key] = element;
});
Expand All @@ -301,10 +300,10 @@ extension Iterable_<T, K, V> on Iterable<T> {
/// ```dart
/// ["a", "ab", "abc"].associateBy((e) => e.length); // {"a": 1, "ab": 2, "abc": 3}
/// ```
Map<T, V> associateWith(V Function(T element) valueSelector) {
Map<T, V> associateWith<V>(V Function(T element) valueSelector) {
ArgumentError.checkNotNull(valueSelector, "valueSelector");
Map<T, V> map = Map();
this.forEach((element) {
forEach((element) {
map[element] = valueSelector(element);
});
return map;
Expand All @@ -319,10 +318,10 @@ extension Iterable_<T, K, V> on Iterable<T> {
/// ```
T minBy(Comparator<T> comparator) {
ArgumentError.checkNotNull(comparator, "comparator");
if (this.isEmpty) {
if (isEmpty) {
return null;
}
return this.reduce(
return reduce(
(value, element) => comparator(value, element) < 0 ? value : element);
}

Expand All @@ -335,10 +334,10 @@ extension Iterable_<T, K, V> on Iterable<T> {
/// ```
T maxBy(Comparator<T> comparator) {
ArgumentError.checkNotNull(comparator, "comparator");
if (this.isEmpty) {
if (isEmpty) {
return null;
}
return this.reduce(
return reduce(
(value, element) => comparator(value, element) > 0 ? value : element);
}

Expand All @@ -350,7 +349,7 @@ extension Iterable_<T, K, V> on Iterable<T> {
/// ```
List<T> sortedBy(Comparator<T> comparator) {
ArgumentError.checkNotNull(comparator, "comparator");
var list = this.toList();
var list = toList();
list.sort(comparator);
return list;
}
Expand All @@ -365,8 +364,7 @@ extension Iterable_<T, K, V> on Iterable<T> {
/// ```
List<T> sortedByNum(num Function(T element) valueProvider) {
ArgumentError.checkNotNull(valueProvider, "valueProvider");
return (this as List<T>)
.sortedBy((a, b) => valueProvider(a).compareTo(valueProvider(b)));
return sortedBy((a, b) => valueProvider(a).compareTo(valueProvider(b)));
}

/// Returns this as sorted list using the [valueProvider] function that produces
Expand All @@ -379,8 +377,7 @@ extension Iterable_<T, K, V> on Iterable<T> {
/// ```
List<T> sortedByString(String Function(T element) valueProvider) {
ArgumentError.checkNotNull(valueProvider, "valueProvider");
return (this as List<T>)
.sortedBy((a, b) => valueProvider(a).compareTo(valueProvider(b)));
return sortedBy((a, b) => valueProvider(a).compareTo(valueProvider(b)));
}

/// Returns the last accessible index. If collection is empty this returns
Expand All @@ -393,8 +390,8 @@ extension Iterable_<T, K, V> on Iterable<T> {
/// list[list.lastIndex]; // "c"
/// ```
int get lastIndex {
if (this.isNotEmpty) {
return this.length - 1;
if (isNotEmpty) {
return length - 1;
} else {
return null;
}
Expand Down
4 changes: 2 additions & 2 deletions lib/map/map.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ extension Map_<K, V> on Map<K, V> {
/// ```
Iterable<MapEntry<K, V>> filter(bool Function(MapEntry<K, V>) test) {
ArgumentError.checkNotNull(test, "test");
return this.entries.filter(test);
return entries.filter(test);
}

/// Returns the number of entries that matches the [test].
Expand All @@ -24,7 +24,7 @@ extension Map_<K, V> on Map<K, V> {
/// [1, 2, 3, 13, 14, 15].count((n) => n > 9); // 3
/// ```
int count([bool Function(MapEntry<K, V> element) test]) {
return this.entries.count(test);
return entries.count(test);
}

/// Converts this map into a JSON string.
Expand Down
Loading

0 comments on commit 700ea4a

Please sign in to comment.