diff --git a/Recyclable.Collections/RecyclablePriorityQueue.AddRange.cs b/Recyclable.Collections/RecyclablePriorityQueue.AddRange.cs index c7786e2..44bdefd 100644 --- a/Recyclable.Collections/RecyclablePriorityQueue.AddRange.cs +++ b/Recyclable.Collections/RecyclablePriorityQueue.AddRange.cs @@ -1108,6 +1108,18 @@ namespace Recyclable.Collections } } + [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.AggressiveOptimization)] + internal static IEnumerator AddRange(this RecyclablePriorityQueue queue, IEnumerable source) + { + IEnumerator enumerator = source.GetEnumerator(); + while (enumerator.MoveNext()) + { + queue.Enqueue((T)enumerator.Current!); + } + + return enumerator; + } + [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.AggressiveOptimization)] internal static void AddRange(this RecyclablePriorityQueue queue, IEnumerable items) { diff --git a/Recyclable.CollectionsTests/RecyclablePriorityQueueTests.cs b/Recyclable.CollectionsTests/RecyclablePriorityQueueTests.cs index 98d90fb..ca701ba 100644 --- a/Recyclable.CollectionsTests/RecyclablePriorityQueueTests.cs +++ b/Recyclable.CollectionsTests/RecyclablePriorityQueueTests.cs @@ -371,6 +371,41 @@ namespace Recyclable.CollectionsTests _ = result.Should().Equal(expected); } + [Fact] + public void AddRangeEnumerableShouldAddItemsInSortedOrder() + { + using var queue = new RecyclablePriorityQueue(); + + _ = queue.AddRange((System.Collections.IEnumerable)_testData); + + var result = new List(); + while (queue.LongCount > 0) + { + result.Add(queue.Dequeue()); + } + + var expected = _testData.OrderBy(v => v).ToList(); + _ = result.Should().Equal(expected); + } + + [Fact] + public void AddRangeEnumerableShouldNotOverrideItems() + { + using var queue = new RecyclablePriorityQueue(); + + _ = queue.AddRange((System.Collections.IEnumerable)_testData); + _ = queue.AddRange((System.Collections.IEnumerable)_testData); + + var result = new List(); + while (queue.LongCount > 0) + { + result.Add(queue.Dequeue()); + } + + var expected = _testData.Concat(_testData).OrderBy(v => v).ToList(); + _ = result.Should().Equal(expected); + } + } }