package com.googlecode.totallylazy.transducers; import com.googlecode.totallylazy.Sequence; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; import static com.googlecode.totallylazy.Sequences.sequence; public class CapturingReceiver<T> implements Receiver<T> { private final List<T> items = new CopyOnWriteArrayList<>(); private final AtomicBoolean started = new AtomicBoolean(false); private final AtomicBoolean finished = new AtomicBoolean(false); private final AtomicReference<Throwable> error = new AtomicReference<>(); public Sequence<T> items() { return sequence(items); } public boolean started() { return started.get(); } public Throwable error() { return error.get(); } public boolean finished() { return finished.get(); } @Override public State start() { started.set(true); return State.Continue; } @Override public State next(T item) { items.add(item); return State.Continue; } @Override public State error(Throwable throwable) { error.set(throwable); return State.Stop; } @Override public void finish() { finished.set(true); } }