public static Task <IFailableResult <TResult, TNewFailure> > OnFailureAsync <TResult, TFailure, TNewFailure>(
     this IFailableResult <TResult, TFailure> result,
     Func <TFailure, Task <IFailableResult <TResult, TNewFailure> > > onFailureAsync
     ) =>
 result.Handle(
     s => SuccessResult <TResult, TNewFailure> .CreateAsync(s),
     f => onFailureAsync(f));
 public static Task <IFailableResult <TResult, TNewFailure> > OnFailureAsync <TResult, TFailure, TNewFailure>(
     this IFailableResult <TResult, TFailure> result,
     Func <TFailure, Task <TNewFailure> > onFailureAsync,
     bool configureAwait = false
     ) =>
 result.Handle(
     s => SuccessResult <TResult, TNewFailure> .CreateAsync(s),
     async f => FailureResult <TResult, TNewFailure> .Create(await onFailureAsync(f).ConfigureAwait(configureAwait)));
 public static Task <IFailableResult <TResult, TNewFailure> > OnFailureAsync <TResult, TFailure, TNewFailure>(
     this Task <IFailableResult <TResult, TFailure> > asyncResult,
     Func <TFailure, Task <IFailableResult <TResult, TNewFailure> > > onFailure,
     bool configureAwait = false
     ) =>
 asyncResult.HandleAsync(
     s => SuccessResult <TResult, TNewFailure> .CreateAsync(s),
     f => onFailure(f),
     configureAwait);