public Maybe <Pair <A, B> > Zip <A, B>(Maybe <A> maybe, Maybe <B> other) { return(maybe.Cata( Maybe.Nothing <Pair <A, B> >, a => other.Cata( Maybe.Nothing <Pair <A, B> >, b => Maybe.Just(Pair.Create(a, b))))); }
public static IEnumerable <A> Enumerable <A>(this Maybe <A> maybe) { return(maybe.Cata(System.Linq.Enumerable.Empty <A>, a => a.PureEnumerable())); }
public static Validation <X, A> Validation <X, A>(this Maybe <A> maybe, Func <X> fail) { return(maybe.Cata(() => Jib.Validation.Failure <X, A>(fail()), Jib.Validation.Success <X, A>)); }
public static bool JustTest <A>(this Maybe <A> maybe, Func <A, bool> predicate) { return(maybe.Cata(() => false, predicate)); }
public bool Eq(Maybe <A> t1, Maybe <A> t2) { return(t1.Cata(() => t2.Cata(() => true, a2 => false), a1 => t2.Cata(() => false, a2 => teq.Eq(a1, a2)))); }
public static Either <X, A> Either <X, A>(this Maybe <A> maybe, Func <X> left) { return(maybe.Cata(() => Jib.Either.Left <X, A>((left())), Jib.Either.Right <X, A>)); }
public static Maybe <A> Where <A>(this Maybe <A> maybe, Func <A, bool> predicate) { return(maybe.Cata(Maybe.Nothing <A>, a => predicate(a) ? maybe : Maybe.Nothing <A>())); }
public static Maybe <B> Bind <A, B>(this Maybe <A> maybe, Func <A, Maybe <B> > f) { return(maybe.Cata(Maybe.Nothing <B>, f)); }
public static void CataVoid <A>(this Maybe <A> maybe, Action nothing, Action <A> just) { maybe.Cata(Unit.Func(nothing), Unit.Func(just)); }
public Maybe <B> Map <A, B>(Maybe <A> maybe, Func <A, B> f) { return(maybe.Cata(Maybe.Nothing <B>, a => Maybe.Just(f(a)))); }
public static IEnumerable <Maybe <B> > TraverseEnumerable <A, B>(this Maybe <A> maybe, Func <A, IEnumerable <B> > f) { return(maybe.Cata(() => Maybe.Nothing <B>().PureEnumerable(), a => f(a).Select(Maybe.Just))); }
public static Future <Maybe <A> > SequenceFuture <A>(this Maybe <Future <A> > maybe) { return(maybe.Cata(() => Maybe.Nothing <A>().PureFuture(), a => a.Map(Maybe.Just))); }
public static IEnumerable <Maybe <A> > SequenceEnumerable <A>(this Maybe <IEnumerable <A> > maybe) { return(maybe.Cata(() => Maybe.Nothing <A>().PureEnumerable(), a => a.Select(Maybe.Just))); }