diff --git a/pkgs/collection/CHANGELOG.md b/pkgs/collection/CHANGELOG.md index 1aaf3527..9c7b369e 100644 --- a/pkgs/collection/CHANGELOG.md +++ b/pkgs/collection/CHANGELOG.md @@ -1,5 +1,6 @@ ## 1.20.0-wip +- Adds `Map.pairs` extension method to make it easier to work with maps using records rather than MapEntry. - Adds `separated` and `separatedList` extension methods to `Iterable`. - Adds `separate` extension method to `List` - Add `IterableMapEntryExtension` for working on `Map` as a list of pairs, using diff --git a/pkgs/collection/lib/collection.dart b/pkgs/collection/lib/collection.dart index 73ec1797..06ff1346 100644 --- a/pkgs/collection/lib/collection.dart +++ b/pkgs/collection/lib/collection.dart @@ -17,6 +17,7 @@ export 'src/functions.dart'; export 'src/iterable_extensions.dart'; export 'src/iterable_zip.dart'; export 'src/list_extensions.dart'; +export 'src/map_extensions.dart'; export 'src/priority_queue.dart'; export 'src/queue_list.dart'; export 'src/union_set.dart'; diff --git a/pkgs/collection/lib/src/map_extensions.dart b/pkgs/collection/lib/src/map_extensions.dart new file mode 100644 index 00000000..677dd18d --- /dev/null +++ b/pkgs/collection/lib/src/map_extensions.dart @@ -0,0 +1,8 @@ +// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +extension MapExtensions on Map { + /// Like [Map.entries], but returns each entry as a record instead of a [MapEntry]. + Iterable<(K, V)> get pairs => entries.map((entry) => (entry.key, entry.value)); +} diff --git a/pkgs/collection/test/extensions_test.dart b/pkgs/collection/test/extensions_test.dart index 45ff84ba..d81a3ad1 100644 --- a/pkgs/collection/test/extensions_test.dart +++ b/pkgs/collection/test/extensions_test.dart @@ -2393,6 +2393,19 @@ void main() { }); }); }); + + group('Map', () { + group('pairs', () { + test('returns an empty list for an empty map', () { + expect(const {}.pairs, isEmpty); + }); + + test('returns a pair for every entry in the map', () { + expect(const {1: 2, 3: 4, 5: 6}.pairs, + equals(const [(1, 2), (3, 4), (5, 6)])); + }); + }); + }); } /// Creates a plain iterable not implementing any other class.