diff --git a/CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/BindTests.cs b/CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/BindTests.cs index c26fb0b8..0bc900bd 100644 --- a/CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/BindTests.cs +++ b/CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/BindTests.cs @@ -1,39 +1,97 @@ -using FluentAssertions; -using Xunit; - -namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions -{ - public class BindTests : MaybeTestBase - { - [Fact] - public void Bind_returns_no_value_if_initial_maybe_is_null() - { - Maybe maybe = null; - - var maybe2 = maybe.Bind(ExpectAndReturnMaybe(null, T.Value)); - - maybe2.HasValue.Should().BeFalse(); - } - - [Fact] - public void Bind_returns_no_value_if_selector_returns_null() - { - Maybe maybe = T.Value; - - var maybe2 = maybe.Bind(ExpectAndReturn(T.Value, Maybe.None)); - - maybe2.HasValue.Should().BeFalse(); - } - - [Fact] - public void Bind_returns_value_if_selector_returns_value() - { - Maybe maybe = T.Value; - - var maybe2 = maybe.Bind(ExpectAndReturnMaybe(T.Value, T.Value)); - - maybe2.HasValue.Should().BeTrue(); - maybe2.Value.Should().Be(T.Value); - } - } -} \ No newline at end of file +using FluentAssertions; +using Xunit; + +namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions +{ + public class BindTests : MaybeTestBase + { + [Fact] + public void Bind_returns_no_value_if_initial_maybe_is_null() + { + Maybe maybe = null; + + var maybe2 = maybe.Bind(ExpectAndReturnMaybe(null, T.Value)); + + maybe2.HasValue.Should().BeFalse(); + } + + [Fact] + public void Bind_returns_no_value_if_selector_returns_null() + { + Maybe maybe = T.Value; + + var maybe2 = maybe.Bind(ExpectAndReturn(T.Value, Maybe.None)); + + maybe2.HasValue.Should().BeFalse(); + } + + [Fact] + public void Bind_returns_value_if_selector_returns_value() + { + Maybe maybe = T.Value; + + var maybe2 = maybe.Bind(ExpectAndReturnMaybe(T.Value, T.Value)); + + maybe2.HasValue.Should().BeTrue(); + maybe2.Value.Should().Be(T.Value); + } + + [Fact] + public void Bind_provides_context_to_selector() + { + Maybe maybe = null; + var context = 5; + + var maybe2 = maybe.Bind( + (value, ctx) => + { + ctx.Should().Be(context); + return Maybe.From(value); + }, + context + ); + + maybe2.HasValue.Should().BeFalse(); + } + + [Fact] + public void Bind_with_context_returns_no_value_if_initial_maybe_is_null() + { + Maybe maybe = null; + + var maybe2 = maybe.Bind( + (value, _) => ExpectAndReturnMaybe(null, T.Value)(value), + context: 5 + ); + + maybe2.HasValue.Should().BeFalse(); + } + + [Fact] + public void Bind_with_context_returns_no_value_if_selector_returns_null() + { + Maybe maybe = T.Value; + + var maybe2 = maybe.Bind( + (value, _) => ExpectAndReturn(T.Value, Maybe.None)(value), + context: 5 + ); + + maybe2.HasValue.Should().BeFalse(); + } + + [Fact] + public void Bind_with_context_returns_value_if_selector_returns_value() + { + Maybe maybe = T.Value; + + var maybe2 = maybe.Bind( + (value, _) => ExpectAndReturnMaybe(T.Value, T.Value)(value), + 5 + ); + + maybe2.HasValue.Should().BeTrue(); + maybe2.Value.Should().Be(T.Value); + } + } +} diff --git a/CSharpFunctionalExtensions/Maybe/Extensions/Bind.cs b/CSharpFunctionalExtensions/Maybe/Extensions/Bind.cs index f59261aa..2fe46ad4 100644 --- a/CSharpFunctionalExtensions/Maybe/Extensions/Bind.cs +++ b/CSharpFunctionalExtensions/Maybe/Extensions/Bind.cs @@ -1,15 +1,27 @@ -using System; - -namespace CSharpFunctionalExtensions -{ - public static partial class MaybeExtensions - { - public static Maybe Bind(in this Maybe maybe, Func> selector) - { - if (maybe.HasNoValue) - return Maybe.None; - - return selector(maybe.GetValueOrThrow()); - } - } -} \ No newline at end of file +using System; + +namespace CSharpFunctionalExtensions +{ + public static partial class MaybeExtensions + { + public static Maybe Bind(in this Maybe maybe, Func> selector) + { + if (maybe.HasNoValue) + return Maybe.None; + + return selector(maybe.GetValueOrThrow()); + } + + public static Maybe Bind( + in this Maybe maybe, + Func> selector, + TContext context + ) + { + if (maybe.HasNoValue) + return Maybe.None; + + return selector(maybe.GetValueOrThrow(), context); + } + } +}