From bdcd5295d4ad1bb52e54e1e38b6866d7da516174 Mon Sep 17 00:00:00 2001 From: Lukas Klingsbo Date: Wed, 22 Jul 2026 00:17:58 +0200 Subject: [PATCH] fix: Mark the reversed() cache as valid after rebuilding it --- lib/comparing_ordered_set.dart | 1 + lib/mapping_ordered_set.dart | 1 + test/comparing_ordered_set_test.dart | 19 +++++++++++++++++++ test/priority_ordered_set_test.dart | 19 +++++++++++++++++++ 4 files changed, 40 insertions(+) diff --git a/lib/comparing_ordered_set.dart b/lib/comparing_ordered_set.dart index 809be7d..4e77a87 100644 --- a/lib/comparing_ordered_set.dart +++ b/lib/comparing_ordered_set.dart @@ -62,6 +62,7 @@ class ComparingOrderedSet extends OrderedSet Iterable reversed() { if (!_validReverseCache) { _reverseCache = toList(growable: false).reversed; + _validReverseCache = true; } return _reverseCache; } diff --git a/lib/mapping_ordered_set.dart b/lib/mapping_ordered_set.dart index 59441af..c5ee899 100644 --- a/lib/mapping_ordered_set.dart +++ b/lib/mapping_ordered_set.dart @@ -40,6 +40,7 @@ class MappingOrderedSet, E> extends OrderedSet Iterable reversed() { if (!_validReverseCache) { _reverseCache = toList(growable: false).reversed; + _validReverseCache = true; } return _reverseCache; } diff --git a/test/comparing_ordered_set_test.dart b/test/comparing_ordered_set_test.dart index 11e48b6..4f8891c 100644 --- a/test/comparing_ordered_set_test.dart +++ b/test/comparing_ordered_set_test.dart @@ -425,6 +425,25 @@ void main() { orderedSet.addAll([a, b]); expect(orderedSet.reversed().join(), 'badc'); }); + + test('reversed result is cached between calls without mutations', () { + final orderedSet = OrderedSet.comparing( + compare: Comparing.on((e) => e.priority), + ); + orderedSet.addAll([ + ComparableObject(0, 'a'), + ComparableObject(1, 'b'), + ]); + + final firstCall = orderedSet.reversed(); + expect(identical(firstCall, orderedSet.reversed()), isTrue); + + orderedSet.add(ComparableObject(2, 'c')); + final afterMutation = orderedSet.reversed(); + expect(identical(firstCall, afterMutation), isFalse); + expect(afterMutation.join(), 'cba'); + expect(identical(afterMutation, orderedSet.reversed()), isTrue); + }); }); }); } diff --git a/test/priority_ordered_set_test.dart b/test/priority_ordered_set_test.dart index 85d66f5..49b7a1c 100644 --- a/test/priority_ordered_set_test.dart +++ b/test/priority_ordered_set_test.dart @@ -479,6 +479,25 @@ void main() { orderedSet.addAll([a, b]); expect(orderedSet.reversed().join(), 'badc'); }); + + test('reversed result is cached between calls without mutations', () { + final orderedSet = OrderedSet.mapping( + (e) => e.priority, + ); + orderedSet.addAll([ + ComparableObject(0, 'a'), + ComparableObject(1, 'b'), + ]); + + final firstCall = orderedSet.reversed(); + expect(identical(firstCall, orderedSet.reversed()), isTrue); + + orderedSet.add(ComparableObject(2, 'c')); + final afterMutation = orderedSet.reversed(); + expect(identical(firstCall, afterMutation), isFalse); + expect(afterMutation.join(), 'cba'); + expect(identical(afterMutation, orderedSet.reversed()), isTrue); + }); }); }); }