package edu.uw.zookeeper.common;
import java.util.Iterator;
public abstract class Generators {
public static <V> ConstantGenerator<V> constant(V value) {
return ConstantGenerator.forValue(value);
}
public static <V> IteratorGenerator<V> iterator(Iterator<V> values) {
return IteratorGenerator.forIterator(values);
}
public static <V> DereferencingGenerator<V> dereferencing(Generator<? extends Generator<? extends V>> generator) {
return DereferencingGenerator.forGenerator(generator);
}
public static class ConstantGenerator<V> implements Generator<V> {
public static <V> ConstantGenerator<V> forValue(V value) {
return new ConstantGenerator<V>(value);
}
private final V value;
public ConstantGenerator(V value) {
this.value = value;
}
@Override
public V next() {
return value;
}
}
public static class DereferencingGenerator<V> implements Generator<V> {
public static <V> DereferencingGenerator<V> forGenerator(Generator<? extends Generator<? extends V>> generator) {
return new DereferencingGenerator<V>(generator);
}
private final Generator<? extends Generator<? extends V>> generator;
public DereferencingGenerator(Generator<? extends Generator<? extends V>> generator) {
this.generator = generator;
}
@Override
public V next() {
return generator.next().next();
}
}
public static class IteratorGenerator<V> implements Generator<V> {
public static <V> IteratorGenerator<V> forIterator(Iterator<V> values) {
return new IteratorGenerator<V>(values);
}
private final Iterator<V> values;
protected IteratorGenerator(Iterator<V> values) {
this.values = values;
}
@Override
public V next() {
return values.next();
}
}
private Generators() {}
}