package com.codepoetics.octarine.functional.functions; import java.util.Optional; import java.util.function.Function; public interface Partial<I, O> extends F1<I, Optional<O>> { static <I, O> Partial<I, O> of(Function<I, Optional<O>> f) { return f::apply; } default <O2> Partial<I, O2> bind(Function<? super O, ? extends O2> next) { return i -> apply(i).map(next); } default <O2> Partial<I, O2> bind(Partial<? super O, O2> next) { return i -> apply(i).flatMap(next); } }