using System; namespace ZeroLevel { public static class Monades { #region With public static TResult With(this TInput o, Func evaluator) { if (null != o) return evaluator(o); return default(TResult)!; } #endregion With #region Return public static TResult Return(this TInput o, Func evaluator, TResult failureValue) { if (null != o) return evaluator(o); return failureValue; } public static TResult Return(this TInput o, Func evaluator) { if (null != o) return evaluator(o); return default(TResult)!; } #endregion Return #region IsNotNull public static bool IsNotNull(this TInput o) { if (null != o) return true; return false; } #endregion IsNotNull #region If public static TInput If(this TInput o, Predicate evaluator) { if (null != o) return evaluator(o) ? o : default(TInput)!; return default(TInput)!; } public static TOutput Either(this TInput o, Func condition, Func ifTrue, Func ifFalse) => condition(o) ? ifTrue(o) : ifFalse(o); public static TOutput Either(this TInput o, Func ifTrue, Func ifFalse) => o.Either(x => x != null!, ifTrue, ifFalse); #endregion If #region Do public static TInput Do(this TInput o, Action action) { if (null != o) action(o); return o; } public static TInput Do(this TInput o, Action action, Action nullHandler) { if (null != o) { action(o); } else { nullHandler(); } return o; } #endregion Do } }