public static async Task <R> MatchAsync <T, R>(this Task <TryOption <T> > self, Func <T, R> Succ, Func <R> None, Func <Exception, R> Fail) => await self.ContinueWith(trySelf => { TryOptionResult <T> res = trySelf.Result.Try(); return(res.IsFaulted ? Fail(res.Exception) : res.Value.IsSome ? Succ(res.Value.Value) : None()); });
public static IObservable <R> MatchObservable <T, R>(this IObservable <TryOption <T> > self, Func <T, R> Succ, Func <R> None, Func <Exception, R> Fail) => self.Select(trySelf => { TryOptionResult <T> res = trySelf.Try(); return(res.IsFaulted ? Fail(res.Exception) : res.Value.IsSome ? Succ(res.Value.Value) : None()); });
public static TryOption <V> SelectMany <T, U, V>( this TryOption <T> self, Func <T, TryOption <U> > bind, Func <T, U, V> project ) { return(new TryOption <V>( () => { var resT = self.Try(); if (resT.IsFaulted) { return new TryOptionResult <V>(resT.Exception); } if (resT.Value.IsNone) { return new TryOptionResult <V>(None); } var resU = bind(resT.Value.Value).Try(); if (resU.IsFaulted) { return new TryOptionResult <V>(resU.Exception); } if (resU.Value.IsNone) { return new TryOptionResult <V>(None); } try { var res = new TryOptionResult <V>(project(resT.Value.Value, resU.Value.Value)); return res; } catch (Exception e) { TryConfig.ErrorLogger(e); return new TryOptionResult <V>(e); } } )); }