package com.googlecode.totallylazy.transducers;
import com.googlecode.totallylazy.functions.Function2;
import com.googlecode.totallylazy.functions.Reducer;
import java.util.concurrent.atomic.AtomicReference;
public interface ScanTransducer<A, B> extends Transducer<A, B> {
Function2<? super B, ? super A, ? extends B> reducer();
static <A, B> ScanTransducer<A, B> scanTransducer(B seed, Function2<? super B, ? super A, ? extends B> reducer) {
final AtomicReference<B> reference = new AtomicReference<>(seed);
return new ScanTransducer<A, B>() {
@Override
public Receiver<A> apply(Receiver<B> receiver) {
return Receiver.receiver(receiver, item ->
receiver.next(reference.updateAndGet(s -> reducer().apply(s, item))));
}
@Override
public Function2<? super B, ? super A, ? extends B> reducer() {
return reducer;
}
};
}
static <A, B> ScanTransducer<A, B> scanTransducer(Reducer<? super A, B> reducer) {
return scanTransducer(reducer.identity(), reducer);
}
}