/// <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); }
/// <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); }
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); } }