public static Nullable <TResult> SelectMany <TSource, TNullable, TResult>( this Nullable <TSource> source, Func <TSource, Nullable <TNullable> > projector, Func <TSource, TNullable, TResult> selector) where TSource : struct where TResult : struct where TNullable : struct { return(source .Bind(s => projector(s).Bind(value => Unit(selector(s, value))))); }
public static Nullable <char> Nullable_MoreComposition() { string sentence = "Hello world!"; Nullable <char> charToFind = NullableMonad.Unit('H'); Nullable <char> nextChar = charToFind .Bind(chr => GetIndexOfCharacter(sentence, chr)) .Bind(index => GetCharacterAtIndex(sentence, index + 1)); return(nextChar); }
public void Bind() { Nullable <int> n = 2; Nullable <int> n0 = null; Assert.Throws <ArgumentNullException>(() => NullableExtensions.Bind <int, int>(n, null)); Func <int, int?> binder1 = i => i * 2; Func <int, int?> binder2 = _ => null; Assert.True(n.Bind(binder1).HasValue); Assert.Equal(4, n.Bind(binder1).Value); Assert.False(n0.Bind(binder1).HasValue); Assert.False(n.Bind(binder2).HasValue); Assert.False(n0.Bind(binder2).HasValue); // selector not called Assert.False(n0.Bind(new Func <int, int?>(_ => throw new InvalidOperationException("Should not be called"))).HasValue); }