package com.tinkerpop.pipes.sideeffect;
import com.tinkerpop.pipes.Pipe;
import com.tinkerpop.pipes.util.AbstractMetaPipe;
import com.tinkerpop.pipes.util.MetaPipe;
import com.tinkerpop.pipes.util.PipeHelper;
import com.tinkerpop.pipes.util.iterators.SingleExpandableIterator;
import java.util.Arrays;
import java.util.List;
import java.util.NoSuchElementException;
/**
* OptionalPipe will compute the incoming object within the internal pipe.
* It is similar to BackFilterPipe, except that no filtering occurs.
* Moreover, it is a SideEffectPipe in that it is only useful for its side-effect (internal pipe) behavior.
* However, getSideEffect() simply returns null as there is no internal data structure.
*
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
public class OptionalPipe<S> extends AbstractMetaPipe<S, S> implements SideEffectPipe.LazySideEffectPipe<S, Object>, MetaPipe {
private final Pipe<S, ?> pipe;
private final SingleExpandableIterator<S> expando = new SingleExpandableIterator<S>();
public OptionalPipe(final Pipe<S, ?> pipe) {
this.pipe = pipe;
this.pipe.setStarts(this.expando);
}
public S processNextStart() {
final S s = this.starts.next();
this.expando.add(s);
try {
while (true) {
this.pipe.next();
}
} catch (final NoSuchElementException e) {
}
return s;
}
/**
* The side effect is the behavior of the internal pipe which is not a gettable data structure.
*
* @return will return null
*/
public Object getSideEffect() {
return null;
}
public String toString() {
return PipeHelper.makePipeString(this, this.pipe);
}
public List<Pipe> getPipes() {
return (List) Arrays.asList(this.pipe);
}
}