pootzko
1/14/2016 - 4:52 PM

Monad extension

Monad extension

using System;

namespace GoogleMaps.Net.Clustering.Extensions
{
    /// <summary>
    /// http://kunuk.wordpress.com/2014/06/04/monads-for-c-tool-for-cleaner-code/
    /// </summary>
    public static class MonadExtension
    {
        /// <summary>
        /// Maybe monad
        /// </summary>
        /// <typeparam name="TFrom">from type</typeparam>
        /// <typeparam name="TTo">to type</typeparam>
        /// <param name="input">input argument</param>
        /// <param name="evaluator">evaluate whether it is null</param>
        /// <returns>evaluated value</returns>
        public static TTo With<TFrom, TTo>(this TFrom input, Func<TFrom, TTo> evaluator) where TFrom : class
        {
            return input == null ? default(TTo) : evaluator(input);
        }

        /// <summary>
        /// Specify a return value if the chain is undefined
        /// </summary>
        /// <typeparam name="TFrom">from type</typeparam>
        /// <typeparam name="TTo">to type</typeparam>
        /// <param name="input">input argument</param>
        /// <param name="evaluator">evaluate whether it is null</param>
        /// <param name="failureValue">value to be return if chain is undefined</param>
        /// <returns>evaluated value</returns>
        public static TTo Return<TFrom, TTo>(this TFrom input, Func<TFrom, TTo> evaluator, TTo failureValue) where TFrom : class
        {
            return input == null ? failureValue : evaluator(input);
        }
    }
}