package com.googlecode.totallylazy.transducers;
import com.googlecode.totallylazy.Option;
import com.googlecode.totallylazy.Sequence;
import com.googlecode.totallylazy.functions.Function1;
import com.googlecode.totallylazy.functions.Function2;
import com.googlecode.totallylazy.functions.Reducer;
import com.googlecode.totallylazy.predicates.Predicate;
import java.util.List;
public interface Transducer<A, B> {
Receiver<A> apply(Receiver<B> receiver);
default <C> Transducer<A, C> compose(Transducer<B, C> b) {
return Transducers.compose(this, b);
}
default Transducer<A, B> filter(Predicate<? super B> predicate) {
return compose(Transducers.filter(predicate));
}
default Transducer<A, B> find(Predicate<? super B> predicate) {
return compose(Transducers.find(predicate));
}
default <C> Transducer<A, C> map(Function1<? super B, ? extends C> mapper) {
return compose(Transducers.map(mapper));
}
default <C> Transducer<A, C> flatMap(Function1<? super B, ? extends Sender<C>> mapper) {
return compose(Transducers.flatMap(mapper));
}
default <C> Transducer<A, C> scan(C seed, Function2<? super C, ? super B, ? extends C> reducer) {
return compose(Transducers.scan(seed, reducer));
}
default <C> Transducer<A, C> scan(Reducer<? super B, C> reducer) {
return compose(Transducers.scan(reducer));
}
default <C> Transducer<A, C> reduce(C seed, Function2<? super C, ? super B, ? extends C> reducer) {
return compose(Transducers.reduce(seed, reducer));
}
default <C> Transducer<A, C> reduce(Reducer<? super B, C> reducer) {
return compose(Transducers.reduce(reducer));
}
default Transducer<A, B> first() {
return compose(Transducers.first());
}
default Transducer<A, Option<B>> firstOption() {
return compose(Transducers.firstOption());
}
default Transducer<A, B> last() {
return compose(Transducers.last());
}
default Transducer<A, Option<B>> lastOption() {
return compose(Transducers.lastOption());
}
default Transducer<A, B> take(int limit) {
return compose(Transducers.take(limit));
}
default Transducer<A, B> takeWhile(Predicate<? super B> predicate) {
return compose(Transducers.takeWhile(predicate));
}
default Transducer<A, B> drop(int limit) {
return compose(Transducers.drop(limit));
}
default Transducer<A, B> dropWhile(Predicate<? super B> predicate) {
return compose(Transducers.dropWhile(predicate));
}
default <K> Transducer<A, Group<K, B>> groupBy(Function1<? super B, ? extends K> keyExtractor) {
return compose(Transducers.groupBy(keyExtractor));
}
default Transducer<A, List<B>> toList() {
return compose(Transducers.toList());
}
default Transducer<A, Sequence<B>> toSequence() {
return compose(Transducers.toSequence());
}
}