public static MonadPlus <TResult> ReplaceBy <TSource, TResult>( this MonadPlus <TSource> @this, TResult value) { Require.NotNull(@this, nameof(@this)); return(@this.Select(_ => value)); }
/// <seealso cref="Apply{TSource, TResult}(MonadPlus{Func{TSource, TResult}}, MonadPlus{TSource})" /> public static MonadPlus <TResult> Gather <TSource, TResult>( this MonadPlus <TSource> @this, MonadPlus <Func <TSource, TResult> > applicative) { Require.NotNull(@this, nameof(@this)); Require.NotNull(applicative, nameof(applicative)); return(applicative.Bind(func => @this.Select(func))); }
// Select() with automatic resource management. public static MonadPlus <TResult> Using <TSource, TResult>( this MonadPlus <TSource> @this, Func <TSource, TResult> selector) where TSource : IDisposable { Require.NotNull(@this, nameof(@this)); Require.NotNull(selector, nameof(selector)); return(@this.Select(val => { using (val) { return selector(val); } })); }
private static Func <TKey, MonadPlus <TInner> > GetKeyLookup <TInner, TKey>( MonadPlus <TInner> inner, Func <TInner, TKey> innerKeySelector, IEqualityComparer <TKey> comparer) { Debug.Assert(inner != null); Debug.Assert(innerKeySelector != null); return(outerKey => inner.Select(innerKeySelector) .Where(innerKey => (comparer ?? EqualityComparer <TKey> .Default).Equals(innerKey, outerKey)) .ContinueWith(inner)); }
/// <seealso cref="MonadPlus.Lift{T1, T2, TResult}"/> public static MonadPlus <TResult> ZipWith <T1, T2, TResult>( this MonadPlus <T1> @this, MonadPlus <T2> second, Func <T1, T2, TResult> zipper) { Require.NotNull(@this, nameof(@this)); Require.NotNull(second, nameof(second)); Require.NotNull(zipper, nameof(zipper)); return(@this.Bind( arg1 => second.Select( arg2 => zipper(arg1, arg2)))); }