public static Maybe <T> Collapse <T>(this Maybe <Maybe <T> > t) => t; // using implicit cast /// <summary> /// Flattens a recursive Maybe structure into IEnumerable /// </summary> /// <typeparam name="T"></typeparam> /// <param name="maybe"></param> /// <param name="parentSelector"></param> /// <example> /// Having { a: 1, parent: { a: 2, parent: { a: 3, parent: Nothing } } } /// We can flatten it to /// [ /// { a: 1, parent: { a: 2, parent: { a: 3, parent: Nothing } } }, /// { a: 2, parent: { a: 3, parent: Nothing } } , /// { a: 3, parent: Nothing } /// ] /// </example> /// <returns></returns> public static IEnumerable <T> Flatten <T>(this Maybe <T> maybe, Func <T, Maybe <T> > parentSelector) => maybe.FlattenSelect(parentSelector, x => x);