public Ret Match <Ret>(Func <SUCCESS, Ret> Succ, Func <FAIL, Ret> Fail) => Check.NullReturn(MatchUnsafe(Succ, Fail));
public Ret Match <Ret>(Ret Succ, Func <FAIL, Ret> Fail) => Check.NullReturn(MatchUnsafe(_ => Succ, Fail));
public R MatchUntyped <R>(Func <object, R> Some, Func <R> None) => Check.NullReturn(None());
public Ret Match <Ret>(Func <R, Ret> Right, Func <L, Ret> Left, Func <Ret> Bottom = null) => Check.NullReturn(MatchUnsafe(Right, Left, Bottom));
public static IObservable <R2> MatchObservable <L, R, R2>(this EitherUnsafe <L, IObservable <R> > self, Func <R, R2> Right, Func <L, R2> Left) => self.IsRight ? self.CastRight().Select(Right).Select(Check.NullReturn) : Observable.Return(Check.NullReturn(Left(self.CastLeft())));
public R MatchUntyped <R>(Func <object, R> Some, Func <R> None) => IsSome ? Check.NullReturn(Some(value)) : Check.NullReturn(None());