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