package com.googlecode.totallylazy.transducers; import com.googlecode.totallylazy.functions.Function1; import java.util.concurrent.atomic.AtomicBoolean; import static com.googlecode.totallylazy.transducers.State.Continue; import static com.googlecode.totallylazy.transducers.State.Stop; public interface FlatMapTransducer<A, B> extends Transducer<A, B> { Function1<? super A, ? extends Sender<B>> mapper(); static <A, B> FlatMapTransducer<A, B> flatMapTransducer(Function1<? super A, ? extends Sender<B>> mapper) { AtomicBoolean complete = new AtomicBoolean(false); return new FlatMapTransducer<A, B>() { @Override public Function1<? super A, ? extends Sender<B>> mapper() { return mapper; } @Override public Receiver<A> apply(Receiver<B> receiver) { return Receiver.receiver(receiver, a -> { mapper.apply(a).send(Receiver.receiver(receiver, b -> { State state = receiver.next(b); if (state.equals(Stop)) complete.set(true); return state; })); return complete.get() ? Stop : Continue; }); } }; } }