package com.googlecode.totallylazy.transducers; import com.googlecode.totallylazy.predicates.Predicate; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import static com.googlecode.totallylazy.transducers.State.Continue; public interface DropWhileTransducer<A> extends Transducer<A, A> { Predicate<? super A> predicate(); static <A> Transducer<A, A> dropWhileTransducer(Predicate<? super A> predicate) { AtomicBoolean complete = new AtomicBoolean(false); return new DropWhileTransducer<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()) { if (predicate.matches(item)) return Continue; complete.set(true); } return receiver.next(item); }); } }; } }