示例#1
0
 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());
 });
示例#2
0
 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());
 });
示例#3
0
    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);
            }
        }
                   ));
    }