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)))));
 }
Exemple #2
0
        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);
        }
Exemple #3
0
        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);
        }