package xapi.fu;
/**
* A marker interface we apply to immutable types.
*
* @author James X. Nelson (james@wetheinter.net)
* Created on 07/11/15.
*/
public interface Do {
Do NOTHING = () -> {
};
void done();
default Runnable toRunnable() {
return this::done;
}
default Do doBefore(Do d) {
return ()->{
d.done();
done();
};
}
default Do doAfter(Do d) {
return ()->{
done();
d.done();
};
}
default <I> In1<I> requireBefore(In1<I> in1) {
return i->{
in1.in(i);
done();
};
}
default <I> In1<I> requireAfter(In1<I> in1) {
return i->{
done();
in1.in(i);
};
}
static Do of(Runnable r) {
return r::run;
}
static Do ofUnsafe(Runnable r) {
return r::run;
}
interface DoUnsafe extends Do, Rethrowable{
void doneUnsafe() throws Throwable;
default void in() {
try {
doneUnsafe();
} catch (Throwable e) {
throw rethrow(e);
}
}
}
static <V> void forEach(Iterable<V> values, In1<V> job) {
values.forEach(job.toConsumer());
}
static <V, To> void forEachMapped2(Iterable<V> values, In1Out1<V, To> mapper, In2<V, To> job) {
forEach(values, In1.mapped1(job, mapper));
}
static <V, To> void forEachMapped1(Iterable<V> values, In1Out1<V, To> mapper, In2<To, V> job) {
forEach(values, In1.mapped2(job, mapper));
}
}