package com.googlecode.totallylazy.transducers; import java.util.concurrent.atomic.AtomicInteger; import static com.googlecode.totallylazy.transducers.State.Continue; import static com.googlecode.totallylazy.transducers.State.Stop; public interface TakeTransducer<A> extends Transducer<A, A> { int limit(); static <A> TakeTransducer<A> takeTransducer(int limit) { AtomicInteger count = new AtomicInteger(); return new TakeTransducer<A>() { @Override public int limit() { return limit; } @Override public Receiver<A> apply(Receiver<A> receiver) { return Receiver.receiver(receiver, () -> { receiver.start(); if (limit == 0) { receiver.finish(); return Stop; } else return Continue; }, item -> { int position = count.incrementAndGet(); if (position == limit) { receiver.next(item); receiver.finish(); return Stop; } if (position > limit) return Stop; return receiver.next(item); }); } }; } }