Esempio n. 1
0
        /// <seealso cref="Outcome.Lift{T1, T2, T3, T4, T5, TResult}"/>
        public static Outcome <TResult> ZipWith <T1, T2, T3, T4, T5, TResult>(
            this Outcome <T1> @this,
            Outcome <T2> second,
            Outcome <T3> third,
            Outcome <T4> fourth,
            Outcome <T5> fifth,
            Func <T1, T2, T3, T4, T5, TResult> zipper)
        {
            /* T4: NotNull(@this) */
            /* T4: NotNull(second) */
            /* T4: NotNull(third) */
            /* T4: NotNull(fourth) */
            /* T4: NotNull(fifth) */
            Require.NotNull(zipper, nameof(zipper));

            // > return @this.Bind(
            // >     arg1 => second.Bind(
            // >         arg2 => third.Bind(
            // >             arg3 => fourth.Bind(
            // >                 arg4 => fifth.Select(
            // >                     arg5 => zipper(arg1, arg2, arg3, arg4, arg5))))));
            return(@this.Bind(
                       arg1 => second.ZipWith(
                           third,
                           fourth,
                           fifth,
                           (arg2, arg3, arg4, arg5) => zipper(arg1, arg2, arg3, arg4, arg5))));
        }
Esempio n. 2
0
 public static Outcome <TResult> InvokeWith <TSource, TResult>(
     this Func <TSource, Outcome <TResult> > @this,
     Outcome <TSource> value)
 {
     /* T4: NotNull(value) */
     return(value.Bind(@this));
 }
Esempio n. 3
0
 public static Outcome <TResult> ContinueWith <TSource, TResult>(
     this Outcome <TSource> @this,
     Outcome <TResult> other)
 {
     /* T4: NotNull(@this) */
     return(@this.Bind(_ => other));
 }
Esempio n. 4
0
 public static Outcome <TResult> Select <TSource, TResult>(
     this Outcome <TSource> @this,
     Func <TSource, TResult> selector)
 {
     /* T4: NotNull(@this) */
     Require.NotNull(selector, nameof(selector));
     return(@this.Bind(val => Outcome <TResult> .η(selector(val))));
 }
Esempio n. 5
0
 /// <seealso cref="Apply{TSource, TResult}(Outcome{Func{TSource, TResult}}, Outcome{TSource})" />
 public static Outcome <TResult> Gather <TSource, TResult>(
     this Outcome <TSource> @this,
     Outcome <Func <TSource, TResult> > applicative)
 {
     /* T4: NotNull(@this) */
     /* T4: NotNull(applicative) */
     return(applicative.Bind(func => @this.Select(func)));
 }
Esempio n. 6
0
 // Bind() with automatic resource management.
 public static Outcome <TResult> Using <TSource, TResult>(
     this Outcome <TSource> @this,
     Func <TSource, Outcome <TResult> > binder)
     where TSource : IDisposable
 {
     /* T4: NotNull(@this) */
     Require.NotNull(binder, nameof(binder));
     return(@this.Bind(val => { using (val) { return binder(val); } }));
 }
Esempio n. 7
0
        // Generalizes both Bind() and ZipWith<T1, T2, TResult>().
        public static Outcome <TResult> SelectMany <TSource, TMiddle, TResult>(
            this Outcome <TSource> @this,
            Func <TSource, Outcome <TMiddle> > selector,
            Func <TSource, TMiddle, TResult> resultSelector)
        {
            /* T4: NotNull(@this) */
            Require.NotNull(selector, nameof(selector));
            Require.NotNull(resultSelector, nameof(resultSelector));

            return(@this.Bind(
                       val => selector(val).Select(
                           middle => resultSelector(val, middle))));
        }
Esempio n. 8
0
        /// <seealso cref="Outcome.Lift{T1, T2, TResult}"/>
        public static Outcome <TResult> ZipWith <T1, T2, TResult>(
            this Outcome <T1> @this,
            Outcome <T2> second,
            Func <T1, T2, TResult> zipper)
        {
            /* T4: NotNull(@this) */
            /* T4: NotNull(second) */
            Require.NotNull(zipper, nameof(zipper));

            return(@this.Bind(
                       arg1 => second.Select(
                           arg2 => zipper(arg1, arg2))));
        }
Esempio n. 9
0
        /// <seealso cref="Outcome.Lift{T1, T2, T3, TResult}"/>
        public static Outcome <TResult> ZipWith <T1, T2, T3, TResult>(
            this Outcome <T1> @this,
            Outcome <T2> second,
            Outcome <T3> third,
            Func <T1, T2, T3, TResult> zipper)
        {
            /* T4: NotNull(@this) */
            /* T4: NotNull(second) */
            /* T4: NotNull(third) */
            Require.NotNull(zipper, nameof(zipper));

            // This is the same as:
            // > return @this.Bind(
            // >     arg1 => second.Bind(
            // >        arg2 => third.Select(
            // >            arg3 => zipper(arg1, arg2, arg3))));
            // but faster if ZipWith is locally shadowed.
            return(@this.Bind(
                       arg1 => second.ZipWith(
                           third, (arg2, arg3) => zipper(arg1, arg2, arg3))));
        }