namespace InnovEnergy.Lib.Utils.Try; public partial class TryAsync { public TryAsync OnError(Func onError) where E : Exception { async Task TryIt() { try { return await Func(); } catch (E e) { return onError(e); } } return new TryAsync(TryIt); } public TryAsync OnError(Func>, R> onError) where E : Exception { async Task TryIt() { try { return await Func(); } catch (E e) { return onError(e, Func); } } return new TryAsync(TryIt); } public TryAsync Retry(Func shouldRetry) where E : Exception { async Task TryIt() { while(true) { try { return await Func(); } catch (E e) { if (!shouldRetry(e)) throw; } } } return new TryAsync(TryIt); } public TryAsync OnErrorDo(Action onError) where E:Exception { async Task TryIt() { try { return await Func(); } catch (E e) { onError(e); throw; } } return new TryAsync(TryIt); } public TryAsync OnSuccessDo(Action onSuccess) { async Task DoIt() { var result = await Func(); onSuccess(result); return result; } return new TryAsync(DoIt); } public TryAsync ThenTry(Func map) { async Task MapIt() { var r = await Throw(); return map(r); } return new TryAsync(MapIt); } }