Skip to content

Instantly share code, notes, and snippets.

@emanon-was
Created February 26, 2019 18:08
Show Gist options
  • Save emanon-was/0d88cfb3804d57c473a355993a161fc2 to your computer and use it in GitHub Desktop.
Save emanon-was/0d88cfb3804d57c473a355993a161fc2 to your computer and use it in GitHub Desktop.
import java.util.Optional;
public abstract class Result<T,E extends Throwable> {
public static <T,E extends Throwable> Ok<T,E> ok(T a) { return new Ok(a); }
public static <T,E extends Throwable> Err<T,E> err(E a) { return new Err(a); }
public abstract T unwrap() throws E;
public abstract boolean isOk();
public abstract boolean isErr();
public abstract Optional<T> getValue();
public abstract Optional<E> getError();
public static final class Ok<T,E extends Throwable> extends Result<T,E> {
private final T val;
public Ok(T val) { this.val = val; }
public T unwrap() throws E { return this.val; }
public boolean isOk() { return true; }
public boolean isErr() { return false; }
public Optional<T> getValue() { return Optional.ofNullable(this.val); }
public Optional<E> getError() { return Optional.empty(); }
@Override
public String toString() { return getClass().getName() + "[" + val + "]"; }
}
public static final class Err<T,E extends Throwable> extends Result<T,E> {
private final E err;
public Err(E err) { this.err = err; }
public T unwrap() throws E { throw this.err; }
public boolean isOk() { return false; }
public boolean isErr() { return true; }
public Optional<T> getValue() { return Optional.empty(); }
public Optional<E> getError() { return Optional.ofNullable(this.err); }
@Override
public String toString() { return getClass().getName() + "[" + err + "]"; }
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment