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