diff --git a/src/Atc/Factories/AsyncEnumerableFactory.cs b/src/Atc/Factories/AsyncEnumerableFactory.cs index 04026a1c..9b11e788 100644 --- a/src/Atc/Factories/AsyncEnumerableFactory.cs +++ b/src/Atc/Factories/AsyncEnumerableFactory.cs @@ -15,4 +15,16 @@ public static async IAsyncEnumerable Empty() await Task.CompletedTask; yield break; } + + /// + /// Converts a single item into an . + /// + /// The type of the item. + /// The item to convert. + /// An containing the single item. + public static async IAsyncEnumerable FromSingleItem(T item) + { + yield return item; + await Task.CompletedTask; + } } \ No newline at end of file diff --git a/test/Atc.Tests/Factories/AsyncEnumerableFactoryTests.cs b/test/Atc.Tests/Factories/AsyncEnumerableFactoryTests.cs index 6897abda..c10d08e3 100644 --- a/test/Atc.Tests/Factories/AsyncEnumerableFactoryTests.cs +++ b/test/Atc.Tests/Factories/AsyncEnumerableFactoryTests.cs @@ -86,4 +86,67 @@ public async Task Empty_ReturnsEmptySequence_WithDifferentTypes() Assert.Empty(stringResult); Assert.Empty(customTypeResult); } + + [Fact] + public async Task FromSingleItem_ReturnsAsyncEnumerableWithSingleItem() + { + // Arrange + const int item = 42; + + // Act + var result = new List(); + await foreach (var value in AsyncEnumerableFactory.FromSingleItem(item)) + { + result.Add(value); + } + + // Assert + Assert.Single(result); + Assert.Equal(item, result.First()); + } + + [Fact] + public async Task FromSingleItem_ReturnsAsyncEnumerable_WithReferenceType() + { + // Arrange + const string item = "TestString"; + + // Act + var result = new List(); + await foreach (var value in AsyncEnumerableFactory.FromSingleItem(item)) + { + result.Add(value); + } + + // Assert + Assert.Single(result); + Assert.Equal(item, result.First()); + } + + [Fact] + public async Task FromSingleItem_CanBeEnumeratedMultipleTimes() + { + // Arrange + var item = 42; + var asyncEnumerable = AsyncEnumerableFactory.FromSingleItem(item); + + // Act + var firstEnumeration = new List(); + await foreach (var value in asyncEnumerable) + { + firstEnumeration.Add(value); + } + + var secondEnumeration = new List(); + await foreach (var value in asyncEnumerable) + { + secondEnumeration.Add(value); + } + + // Assert + Assert.Single(firstEnumeration); + Assert.Single(secondEnumeration); + Assert.Equal(item, firstEnumeration.First()); + Assert.Equal(item, secondEnumeration.First()); + } } \ No newline at end of file