blob: 4b8e10ddefc27dea8921a23d6d593d42d61c89d9 [file] [log] [blame]
class FindOp<T, O> {
public static<MT> FindOp<MT, Optional<MT>> makeRef() {
return new FindOp<>(Optional.empty(), Optional::isPresent, FindSink.OfRef::new);
}
static abstract class FindSink<FindSinkT, FindSinkO> implements TerminalSink<FindSinkT, FindSinkO> {
@Override
public void accept(FindSinkT value) {}
static class OfRef<OfRefT> extends FindSink<OfRefT, Optional<OfRefT>> {
@Override
public Optional<OfRefT> getAndClearState() {
return null;
}
}
}
private FindOp(O emptyValue,
Predicate<O> presentPredicate,
Supplier<TerminalSink<T, O>> sinkSupplier) {}
}
class FindOp1<T, O> {
public static <MT> FindOp1<MT, Optional<MT>> makeRef() {
return new FindOp1<>(Optional.empty(), Optional::isPresent);
}
public static <MT> FindOp1<MT, Optional<MT>> makeRef1() {
return new FindOp1<>(Optional.empty(), t -> t.isPresent());
}
private FindOp1(O emptyValue, Predicate<O> presentPredicate) {}
}
class FindOp2<T, O> {
public static <MT> FindOp2<MT, Optional<MT>> makeRef() {
return new FindOp2<>(Optional.empty());
}
private FindOp2(O emptyValue) {}
}
final class Optional<T> {
private Optional(T value) {
}
private Optional() {
}
@SuppressWarnings("unchecked")
public static<T> Optional<T> empty() {
return null;
}
public static <T> Optional<T> of(T value) {
return new Optional<>(value);
}
public T get() {
return null;
}
public boolean isPresent() {
return true;
}
}
interface Predicate<T> {
public boolean test(T t);
}
interface Supplier<T> {
public T get();
}
interface Consumer<T> {
public void accept(T t);
}
interface IntConsumer {
public void accept(int value);
}
interface Sink<T> extends Consumer<T> {
default void accept(int value) {
throw new IllegalStateException("called wrong accept method");
}
@FunctionalInterface
interface OfInt extends Sink<Integer>, IntConsumer {
@Override
void accept(int value);
@Override
default void accept(Integer i) {
accept(i.intValue());
}
}
}
interface TerminalSink<T, R> extends Sink<T> {
R getAndClearState();
}