package com.googlecode.totallylazy;
import com.googlecode.totallylazy.functions.Function1;
import com.googlecode.totallylazy.functions.Function2;
import com.googlecode.totallylazy.predicates.Predicate;
import java.util.Iterator;
import java.util.concurrent.Callable;
import static com.googlecode.totallylazy.Either.right;
import static com.googlecode.totallylazy.Sequences.sequence;
import static com.googlecode.totallylazy.Unchecked.cast;
public class Some<T> extends Option<T> {
private final T value;
private Some(T value) {
this.value = value;
}
public static <T> Some<T> some(T t) {
if (t == null) {
throw new IllegalArgumentException("some(T) can not be null");
}
return new Some<T>(t);
}
public Iterator<T> iterator() {
return sequence(value).iterator();
}
@Override
public T get() {
return value;
}
@Override
public boolean isEmpty() {
return false;
}
@Override
public Option<T> orElse(Option<T> other) {
return this;
}
@Override
public Option<T> orElse(Callable<? extends Option<T>> other) {
return this;
}
@Override
public T getOrElse(T other) {
return get();
}
@Override
public T getOrElse(Callable<? extends T> callable) {
return get();
}
@Override
public T getOrNull() {
return get();
}
@Override
public <E extends Exception> T getOrThrow(E e) throws E {
return get();
}
@Override
public <S> Option<S> map(Function1<? super T, ? extends S> callable) {
return option(Callers.call(callable, get()));
}
@Override
public Option<T> each(Function1<? super T, ?> callable) {
Callers.call(callable, get());
return this;
}
@Override
public <S> Option<S> flatMap(Function1<? super T, ? extends Option<? extends S>> callable) {
return cast(Callers.call(callable, get()));
}
@Override
public Option<T> filter(Predicate<? super T> predicate) {
return predicate.matches(value) ? this : Option.<T>none();
}
@Override
public <S> S fold(S seed, Function2<? super S, ? super T, ? extends S> callable) {
return Callers.call(callable, seed, get());
}
@Override
public <L> Either<L, T> toEither(L value) {
return right(this.value);
}
public Sequence<T> join(Iterable<? extends T> iterable) {
return Sequences.cons(value, iterable);
}
@Override
public boolean contains(T instance) {
return value.equals(instance);
}
@Override
public boolean exists(Predicate<? super T> predicate) {
return predicate.matches(value);
}
@Override
public boolean equals(Object o) {
return o instanceof Some && ((Some) o).value().equals(value());
}
@Override
public int hashCode() {
return value.hashCode();
}
@Override
public String toString() {
return "some(" + value + ")";
}
}