/// <summary> /// Returns <paramref name="a"/>.Value or throws <paramref name="e"/>() /// </summary> /// <typeparam name="T"></typeparam> /// <param name="a"></param> /// <param name="e"></param> /// <returns></returns> public static T OrElse <T>(this Maybe <T> a, Func <Exception> e) { if (a.IsNothing()) { throw e(); } return(a.Value); }
/// <summary> /// Calls <paramref name="fn"/> if <paramref name="m"/> has not value, otherwise does nothing /// </summary> /// <typeparam name="T"></typeparam> /// <param name="m"></param> /// <param name="fn"></param> /// <returns></returns> public static Maybe <T> DoWhenAbsent <T>(this Maybe <T> m, Action fn) { if (m.IsNothing()) { fn(); } return(m); }
/// <summary> /// Returns <paramref name="b"/> if <paramref name="a"/> has value, otherwise <see cref="Maybe<T>.Nothing"/> /// </summary> /// <typeparam name="T"></typeparam> /// <typeparam name="T2"></typeparam> /// <param name="a"></param> /// <param name="b"></param> /// <returns></returns> public static Maybe <T2> Compose <T, T2>(this Maybe <T> a, Maybe <T2> b) { if (a.IsNothing()) { return(Maybe <T2> .Nothing); } return(b); }
private static IEnumerable <TFlatten> Flatten <TMaybe, TFlatten>(this Maybe <TMaybe> maybe, Func <TMaybe, Maybe <TMaybe> > parentSelector, List <TFlatten> acc, Func <TMaybe, TFlatten> flattenSelector) { while (true) { if (maybe.IsNothing()) { return(acc); } acc.Add(flattenSelector(maybe.Value)); maybe = parentSelector(maybe.Value); } }
/// <summary> /// Returns <paramref name="b"/> if <paramref name="a"/> has value, otherwise <see cref="Maybe<T>.Nothing"/> /// </summary> /// <typeparam name="T"></typeparam> /// <typeparam name="T2"></typeparam> /// <param name="a"></param> /// <param name="b"></param> /// <returns></returns> public static Maybe <T2> Compose <T, T2>(this Maybe <T> a, Maybe <T2> b) => a.IsNothing() ? Maybe <T2> .Nothing : b;