package com.googlecode.totallylazy.transducers; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import static com.googlecode.totallylazy.transducers.State.Continue; import static com.googlecode.totallylazy.transducers.State.Stop; public class ListSubject<T> implements Subject<T> { protected final List<Receiver<T>> receivers = new CopyOnWriteArrayList<>(); @Override public AutoCloseable send(Receiver<T> receiver) { receivers.add(receiver); return EMPTY_CLOSEABLE; } @Override public State start() { for (Receiver<T> receiver : receivers) { if (receiver.start().equals(Stop)) receivers.remove(receiver); } return receivers.isEmpty() ? Stop : Continue; } @Override public State next(T item) { for (Receiver<T> receiver : receivers) { if (receiver.next(item).equals(Stop)) receivers.remove(receiver); } return receivers.isEmpty() ? Stop : Continue; } @Override public State error(Throwable throwable) { for (Receiver<T> receiver : receivers) { if (receiver.error(throwable).equals(Stop)) receivers.remove(receiver); } return receivers.isEmpty() ? Stop : Continue; } @Override public void finish() { for (Receiver<T> receiver : receivers) { receiver.finish(); } } }