From c6eb42491216e9539af0de9ae25ee1e18f42313c Mon Sep 17 00:00:00 2001 From: Natalie Weizenbaum Date: Thu, 16 Jul 2026 18:56:17 -0700 Subject: [PATCH] Port `pairs` extension from dart-archive/collection#289 --- pkgs/collection/CHANGELOG.md | 1 + pkgs/collection/lib/collection.dart | 1 + pkgs/collection/lib/src/map_extensions.dart | 8 ++++++++ pkgs/collection/test/extensions_test.dart | 13 +++++++++++++ 4 files changed, 23 insertions(+) create mode 100644 pkgs/collection/lib/src/map_extensions.dart diff --git a/pkgs/collection/CHANGELOG.md b/pkgs/collection/CHANGELOG.md index 1aaf3527c..9c7b369ee 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 73ec17977..06ff13463 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 000000000..677dd18d7 --- /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 45ff84bad..d81a3ad1f 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.