package com.googlecode.totallylazy.transducers; import com.googlecode.totallylazy.predicates.Predicate; import java.util.concurrent.atomic.AtomicBoolean; import static com.googlecode.totallylazy.transducers.State.Stop; public interface TakeWhileTransducer<A> extends Transducer<A, A> { Predicate<? super A> predicate(); static <A> TakeWhileTransducer<A> takeWhileTransducer(Predicate<? super A> predicate) { AtomicBoolean complete = new AtomicBoolean(false); return new TakeWhileTransducer<A>() { @Override public Predicate<? super A> predicate() { return predicate; } @Override public Receiver<A> apply(Receiver<A> receiver) { return Receiver.receiver(receiver, item -> { if (complete.get()) return Stop; if (predicate.matches(item)) return receiver.next(item); else { complete.set(true); receiver.finish(); return Stop; } }); } }; } }