// Path: src/main/java/cn/xdean/jex/lang/collection/Either.java
// @Immutable
// public interface Either<L, R> {
// 
//   static <L, R> Either<L, R> left(L l) {
//     return new Left<>(l);
//   }
// 
//   static <L, R> Either<L, R> right(R r) {
//     return new Right<>(r);
//   }
// 
//   static <L, R> Either<L, R> leftOrNull(Optional<L> l) {
//     return leftOrDefault(l, null);
//   }
// 
//   static <L, R> Either<L, R> rightOrNull(Optional<R> r) {
//     return rightOrDefault(r, null);
//   }
// 
//   static <L, R> Either<L, R> leftOrDefault(Optional<L> l, R r) {
//     return l.isPresent() ? left(l.get()) : right(r);
//   }
// 
//   static <L, R> Either<L, R> rightOrDefault(Optional<R> r, L l) {
//     return r.isPresent() ? right(r.get()) : left(l);
//   }
// 
//   boolean isLeft();
// 
//   boolean isRight();
// 
//   L getLeft();
// 
//   R getRight();
// 
//   L toLeft(Function<? super R, ? extends L> f);
// 
//   R toRight(Function<? super L, ? extends R> f);
// 
//   Optional<L> asLeft();
// 
//   Optional<R> asRight();
// 
//   Either<L, R> ifLeft(Consumer<? super L> f);
// 
//   Either<L, R> ifRight(Consumer<? super R> f);
// 
//   void exec(
//       Consumer<? super L> ifLeft,
//       Consumer<? super R> ifRight);
// 
//   <L2> Either<L2, R> mapLeft(
//       Function<? super L, ? extends L2> f);
// 
//   <R2> Either<L, R2> mapRight(
//       Function<? super R, ? extends R2> f);
// 
//   <L2, R2> Either<L2, R2> map(
//       Function<? super L, ? extends L2> f,
//       Function<? super R, ? extends R2> g);
// 
//   <L2, R2> Either<L2, R2> flatMap(
//       Function<? super L, Either<L2, R2>> f,
//       Function<? super R, Either<L2, R2>> g);
// 
//   <L2> Either<L2, R> flatMapLeft(
//       Function<? super L, Either<L2, R>> f);
// 
//   <R2> Either<L, R2> flatMapRight(
//       Function<? super R, Either<L, R2>> f);
// 
//   <T> T unify(
//       Function<? super L, ? extends T> f,
//       Function<? super R, ? extends T> g);
// }
// 
// Path: src/main/java/cn/xdean/jex/lang/collection/Wrapper.java
// public class Wrapper<T> {
// 
//   public static <T> Wrapper<T> of(T t) {
//     return new Wrapper<>(t);
//   }
// 
//   public static <T> Wrapper<T> empty() {
//     return Wrapper.of(null);
//   }
// 
//   private T value;
// 
//   public Wrapper(T value) {
//     super();
//     this.value = value;
//   }
// 
//   public T get() {
//     return value;
//   }
// 
//   public void set(T t) {
//     value = t;
//   }
// 
//   @Override
//   public int hashCode() {
//     return Objects.hash(value);
//   }
// 
//   @Override
//   public boolean equals(Object obj) {
//     if (this == obj) {
//       return true;
//     } else if (obj == null) {
//       return false;
//     } else if (!(obj instanceof Wrapper)) {
//       return false;
//     }
//     Wrapper<?> other = (Wrapper<?>) obj;
//     return Objects.equals(value, other.value);
//   }
// 
//   @Override
//   public String toString() {
//     return "Wrapper [value=" + value + "]";
//   }
// }
// 
// Path: src/main/java/cn/xdean/jex/lang/function/type/ActionE0.java
// @FunctionalInterface
// public interface ActionE0<E extends Exception> {
//   void call() throws E;
// }
// 
// Path: src/main/java/cn/xdean/jex/lang/function/type/FuncE0.java
// @FunctionalInterface
// public interface FuncE0<R, E extends Exception> extends Callable<R> {
//   @Override
//   R call() throws E;
// }
// 
// Path: src/main/java/cn/xdean/jex/lang/function/FunctionAdapter.java
// public static <T> T supplierToRunnable(Supplier<T> s, Consumer<Runnable> c) {
//   Wrapper<T> w = new Wrapper<>(null);
//   c.accept(() -> w.set(s.get()));
//   return w.get();
// }


import cn.xdean.jex.lang.collection.Either;
import cn.xdean.jex.lang.collection.Wrapper;
import cn.xdean.jex.lang.function.type.ActionE0;
import cn.xdean.jex.lang.function.type.FuncE0;
import xdean.jex.log.LogFactory;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Optional;
import java.util.function.Function;
import static cn.xdean.jex.lang.function.FunctionAdapter.supplierToRunnable;
    return supplierToRunnable(task, r -> uncatch(r));
  }

  @SuppressWarnings("unchecked")
  public static <E extends Exception> Optional<E> throwToReturn(ActionE0<E> task) {
    try {
      task.call();
    } catch (Exception t) {
      try {
        return Optional.of((E) t);
      } catch (ClassCastException cce) {
        throw new RuntimeException("An unexcepted exception thrown.", t);
      }
    }
    return Optional.empty();
  }

  public static <T, E extends Exception> Either<T, E> throwToReturn(FuncE0<T, E> task) {
    Wrapper<T> w = new Wrapper<>(null);
    return Either.rightOrDefault(throwToReturn(() -> w.set(task.call())), w.get());
  }

  public static String getStackTraceString(Throwable tr) {
    if (tr == null) {
      return "";
    }
    Throwable t = tr;
    while (t.getCause() != null) {
      t = t.getCause();
    }
// Path: src/main/java/cn/xdean/jex/lang/collection/Either.java
// @Immutable
// public interface Either<L, R> {
// 
//   static <L, R> Either<L, R> left(L l) {
//     return new Left<>(l);
//   }
// 
//   static <L, R> Either<L, R> right(R r) {
//     return new Right<>(r);
//   }
// 
//   static <L, R> Either<L, R> leftOrNull(Optional<L> l) {
//     return leftOrDefault(l, null);
//   }
// 
//   static <L, R> Either<L, R> rightOrNull(Optional<R> r) {
//     return rightOrDefault(r, null);
//   }
// 
//   static <L, R> Either<L, R> leftOrDefault(Optional<L> l, R r) {
//     return l.isPresent() ? left(l.get()) : right(r);
//   }
// 
//   static <L, R> Either<L, R> rightOrDefault(Optional<R> r, L l) {
//     return r.isPresent() ? right(r.get()) : left(l);
//   }
// 
//   boolean isLeft();
// 
//   boolean isRight();
// 
//   L getLeft();
// 
//   R getRight();
// 
//   L toLeft(Function<? super R, ? extends L> f);
// 
//   R toRight(Function<? super L, ? extends R> f);
// 
//   Optional<L> asLeft();
// 
//   Optional<R> asRight();
// 
//   Either<L, R> ifLeft(Consumer<? super L> f);
// 
//   Either<L, R> ifRight(Consumer<? super R> f);
// 
//   void exec(
//       Consumer<? super L> ifLeft,
//       Consumer<? super R> ifRight);
// 
//   <L2> Either<L2, R> mapLeft(
//       Function<? super L, ? extends L2> f);
// 
//   <R2> Either<L, R2> mapRight(
//       Function<? super R, ? extends R2> f);
// 
//   <L2, R2> Either<L2, R2> map(
//       Function<? super L, ? extends L2> f,
//       Function<? super R, ? extends R2> g);
// 
//   <L2, R2> Either<L2, R2> flatMap(
//       Function<? super L, Either<L2, R2>> f,
//       Function<? super R, Either<L2, R2>> g);
// 
//   <L2> Either<L2, R> flatMapLeft(
//       Function<? super L, Either<L2, R>> f);
// 
//   <R2> Either<L, R2> flatMapRight(
//       Function<? super R, Either<L, R2>> f);
// 
//   <T> T unify(
//       Function<? super L, ? extends T> f,
//       Function<? super R, ? extends T> g);
// }
// 
// Path: src/main/java/cn/xdean/jex/lang/collection/Wrapper.java
// public class Wrapper<T> {
// 
//   public static <T> Wrapper<T> of(T t) {
//     return new Wrapper<>(t);
//   }
// 
//   public static <T> Wrapper<T> empty() {
//     return Wrapper.of(null);
//   }
// 
//   private T value;
// 
//   public Wrapper(T value) {
//     super();
//     this.value = value;
//   }
// 
//   public T get() {
//     return value;
//   }
// 
//   public void set(T t) {
//     value = t;
//   }
// 
//   @Override
//   public int hashCode() {
//     return Objects.hash(value);
//   }
// 
//   @Override
//   public boolean equals(Object obj) {
//     if (this == obj) {
//       return true;
//     } else if (obj == null) {
//       return false;
//     } else if (!(obj instanceof Wrapper)) {
//       return false;
//     }
//     Wrapper<?> other = (Wrapper<?>) obj;
//     return Objects.equals(value, other.value);
//   }
// 
//   @Override
//   public String toString() {
//     return "Wrapper [value=" + value + "]";
//   }
// }
// 
// Path: src/main/java/cn/xdean/jex/lang/function/type/ActionE0.java
// @FunctionalInterface
// public interface ActionE0<E extends Exception> {
//   void call() throws E;
// }
// 
// Path: src/main/java/cn/xdean/jex/lang/function/type/FuncE0.java
// @FunctionalInterface
// public interface FuncE0<R, E extends Exception> extends Callable<R> {
//   @Override
//   R call() throws E;
// }
// 
// Path: src/main/java/cn/xdean/jex/lang/function/FunctionAdapter.java
// public static <T> T supplierToRunnable(Supplier<T> s, Consumer<Runnable> c) {
//   Wrapper<T> w = new Wrapper<>(null);
//   c.accept(() -> w.set(s.get()));
//   return w.get();
// }


// Path: src/main/java/cn/xdean/jex/lang/ExceptionUtil.java
import cn.xdean.jex.lang.collection.Either;
import cn.xdean.jex.lang.collection.Wrapper;
import cn.xdean.jex.lang.function.type.ActionE0;
import cn.xdean.jex.lang.function.type.FuncE0;
import xdean.jex.log.LogFactory;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Optional;
import java.util.function.Function;
import static cn.xdean.jex.lang.function.FunctionAdapter.supplierToRunnable;

    return supplierToRunnable(task, r -> uncatch(r));
  }

  @SuppressWarnings("unchecked")
  public static <E extends Exception> Optional<E> throwToReturn(ActionE0<E> task) {
    try {
      task.call();
    } catch (Exception t) {
      try {
        return Optional.of((E) t);
      } catch (ClassCastException cce) {
        throw new RuntimeException("An unexcepted exception thrown.", t);
      }
    }
    return Optional.empty();
  }

  public static <T, E extends Exception> Either<T, E> throwToReturn(FuncE0<T, E> task) {
    Wrapper<T> w = new Wrapper<>(null);
    return Either.rightOrDefault(throwToReturn(() -> w.set(task.call())), w.get());
  }

  public static String getStackTraceString(Throwable tr) {
    if (tr == null) {
      return "";
    }
    Throwable t = tr;
    while (t.getCause() != null) {
      t = t.getCause();
    }
    StringWriter sw = new StringWriter();