001package org.reactivestreams.tck.support;
002
003import java.util.NoSuchElementException;
004
005// simplest possible version of Scala's Option type
006public abstract class Optional<T> {
007
008  private static final Optional<Object> NONE = new Optional<Object>() {
009    @Override
010    public Object get() {
011      throw new NoSuchElementException(".get call on None!");
012    }
013
014    @Override
015    public boolean isEmpty() {
016      return true;
017    }
018  };
019
020  private Optional() {
021  }
022
023  @SuppressWarnings("unchecked")
024  public static <T> Optional<T> empty() {
025    return (Optional<T>) NONE;
026  }
027
028  @SuppressWarnings("unchecked")
029  public static <T> Optional<T> of(T it) {
030    if (it == null) return (Optional<T>) Optional.NONE;
031    else return new Some(it);
032  }
033
034  public abstract T get();
035
036  public abstract boolean isEmpty();
037
038  public boolean isDefined() {
039    return !isEmpty();
040  }
041
042  public static class Some<T> extends Optional<T> {
043    private final T value;
044
045    Some(T value) {
046      this.value = value;
047    }
048
049    @Override
050    public T get() {
051      return value;
052    }
053
054    @Override
055    public boolean isEmpty() {
056      return false;
057    }
058
059    @Override
060    public String toString() {
061      return String.format("Some(%s)", value);
062    }
063  }
064
065  @Override
066  public String toString() {
067    return "None";
068  }
069}