Skip to content

Commit 837a37a

Browse files
authored
Add flattenedToList and flattenedToSet (dart-archive/collection#328)
For iterables which are known to be exhausted after flattening performance is better than the `sync*` implementation using a collection literal. Add `flattenedToList` as a performance improvement over `flattened.` Add `flattenedToSet` as new behavior for flattening to unique elements. Originally implemented in dart-lang/sdk@8d3b6ce
1 parent 14b38e6 commit 837a37a

File tree

3 files changed

+80
-0
lines changed

3 files changed

+80
-0
lines changed

pkgs/collection/CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
generic.
77
- `CanonicalizedMap`: added constructor `fromEntries`.
88
- Mark "mixin" classes as `mixin`.
9+
- `extension IterableIterableExtension<T> on Iterable<Iterable<T>>`
10+
- Add `flattenedToList` as a performance improvement over `flattened.`
11+
- Add `flattenedToSet` as new behavior for flattening to unique elements.
912
- Deprecate `transitiveClosure`. Consider using `package:graphs`.
1013
- Deprecate `whereNotNull()` from `IterableNullableExtension`. Use `nonNulls`
1114
instead - this is an equivalent extension available in Dart core since

pkgs/collection/lib/src/iterable_extensions.dart

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -892,6 +892,26 @@ extension IterableIterableExtension<T> on Iterable<Iterable<T>> {
892892
yield* elements;
893893
}
894894
}
895+
896+
/// The sequential elements of each iterable in this iterable.
897+
///
898+
/// Iterates the elements of this iterable.
899+
/// For each one, which is itself an iterable,
900+
/// all the elements of that are added
901+
/// to the returned list, before moving on to the next element.
902+
List<T> get flattenedToList => [
903+
for (final elements in this) ...elements,
904+
];
905+
906+
/// The unique sequential elements of each iterable in this iterable.
907+
///
908+
/// Iterates the elements of this iterable.
909+
/// For each one, which is itself an iterable,
910+
/// all the elements of that are added
911+
/// to the returned set, before moving on to the next element.
912+
Set<T> get flattenedToSet => {
913+
for (final elements in this) ...elements,
914+
};
895915
}
896916

897917
/// Extensions that apply to iterables of [Comparable] elements.

pkgs/collection/test/extensions_test.dart

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1064,6 +1064,63 @@ void main() {
10641064
[1, 2, 3, 4]);
10651065
});
10661066
});
1067+
group('.flattenedToList', () {
1068+
var empty = iterable(<int>[]);
1069+
test('empty', () {
1070+
expect(iterable(<Iterable<int>>[]).flattenedToList, []);
1071+
});
1072+
test('multiple empty', () {
1073+
expect(iterable([empty, empty, empty]).flattenedToList, []);
1074+
});
1075+
test('single value', () {
1076+
expect(
1077+
iterable(<Iterable>[
1078+
iterable([1])
1079+
]).flattenedToList,
1080+
[1]);
1081+
});
1082+
test('multiple', () {
1083+
expect(
1084+
iterable(<Iterable>[
1085+
iterable([1, 2]),
1086+
empty,
1087+
iterable([3, 4])
1088+
]).flattenedToList,
1089+
[1, 2, 3, 4]);
1090+
});
1091+
});
1092+
group('.flattenedToSet', () {
1093+
var empty = iterable(<int>[]);
1094+
test('empty', () {
1095+
expect(iterable(<Iterable<int>>[]).flattenedToSet, <int>{});
1096+
});
1097+
test('multiple empty', () {
1098+
expect(iterable([empty, empty, empty]).flattenedToSet, <int>{});
1099+
});
1100+
test('single value', () {
1101+
expect(
1102+
iterable(<Iterable>[
1103+
iterable([1])
1104+
]).flattenedToSet,
1105+
{1});
1106+
});
1107+
test('multiple', () {
1108+
expect(
1109+
iterable(<Iterable>[
1110+
iterable([1, 2]),
1111+
empty,
1112+
iterable([3, 4])
1113+
]).flattenedToSet,
1114+
{1, 2, 3, 4});
1115+
expect(
1116+
iterable(<Iterable>[
1117+
iterable([1, 2, 3]),
1118+
empty,
1119+
iterable([2, 3, 4])
1120+
]).flattenedToSet,
1121+
{1, 2, 3, 4});
1122+
});
1123+
});
10671124
});
10681125
group('of comparable', () {
10691126
group('.min', () {

0 commit comments

Comments
 (0)