package com.googlecode.totallylazy.transducers;
import com.googlecode.totallylazy.functions.Function0;
import com.googlecode.totallylazy.functions.Function1;
public interface Receiver<T> {
State start();
State next(T item);
State error(Throwable throwable);
void finish();
static <T> Receiver<T> receiver(Receiver<?> delegate, Function1<T, State> function) {
return receiver(delegate, delegate::start, function);
}
static <T> Receiver<T> receiver(Receiver<?> delegate, Function0<State> start, Function1<T, State> function) {
return receiver(delegate, start, function, delegate::finish);
}
static <T> Receiver<T> receiver(Receiver<?> delegate, Function1<T, State> function, Runnable finished) {
return receiver(delegate, delegate::start, function, finished);
}
static <T> Receiver<T> receiver(Receiver<?> delegate, Function0<State> start, Function1<T, State> function, Runnable finished) {
return new Delegate<T>() {
@Override
public Receiver<?> delegate() {
return delegate;
}
@Override
public State start() {
return start.apply();
}
@Override
public State next(T item) {
return function.apply(item);
}
@Override
public void finish() {
finished.run();
}
};
}
interface Delegate<T> extends Receiver<T> {
Receiver<?> delegate();
@Override
default State start() {
return delegate().start();
}
@Override
default State error(Throwable throwable) {
return delegate().error(throwable);
}
@Override
default void finish() {
delegate().finish();
}
}
}