diff --git a/Funcky.Async.Test/Monads/OptionAsyncExtensions/ToAsyncEnumerableTest.cs b/Funcky.Async.Test/Monads/OptionAsyncExtensions/ToAsyncEnumerableTest.cs new file mode 100644 index 00000000..8567e779 --- /dev/null +++ b/Funcky.Async.Test/Monads/OptionAsyncExtensions/ToAsyncEnumerableTest.cs @@ -0,0 +1,19 @@ +namespace Funcky.Async.Test.Monads.OptionAsyncExtensions; + +public sealed class ToAsyncEnumerableTest +{ + [Fact] + public async Task ReturnsEmptyEnumerableWhenOptionIsEmpty() + { + var option = Option.None; + Assert.True(await option.ToAsyncEnumerable().NoneAsync()); + } + + [Fact] + public async Task ReturnsEnumerableWithOneElementWhenOptionHasValue() + { + const int value = 42; + var option = Option.Some(value); + Assert.Equal(value, await option.ToAsyncEnumerable().SingleAsync()); + } +} diff --git a/Funcky.Async/Monads/Option/OptionExtensions.ToAsyncEnumerable.cs b/Funcky.Async/Monads/Option/OptionExtensions.ToAsyncEnumerable.cs new file mode 100644 index 00000000..ce32c3fe --- /dev/null +++ b/Funcky.Async/Monads/Option/OptionExtensions.ToAsyncEnumerable.cs @@ -0,0 +1,14 @@ +namespace Funcky.Monads; + +public static partial class OptionAsyncExtensions +{ + /// + /// Returns an that yields exactly one value when the option + /// has an item and nothing when the option is empty. + /// + public static IAsyncEnumerable ToAsyncEnumerable(this Option option) + where TItem : notnull + => option.Match( + none: AsyncEnumerable.Empty, + some: AsyncSequence.Return); +} diff --git a/Funcky.Async/PublicAPI.Unshipped.txt b/Funcky.Async/PublicAPI.Unshipped.txt index 7dc5c581..c2ca6bce 100644 --- a/Funcky.Async/PublicAPI.Unshipped.txt +++ b/Funcky.Async/PublicAPI.Unshipped.txt @@ -1 +1,2 @@ #nullable enable +static Funcky.Monads.OptionAsyncExtensions.ToAsyncEnumerable(this Funcky.Monads.Option option) -> System.Collections.Generic.IAsyncEnumerable!