OfListImpl.java
package io.github.jonloucks.variants.impl;
import java.util.LinkedList;
import java.util.List;
import java.util.Optional;
import java.util.function.Function;
import static io.github.jonloucks.contracts.api.Checks.nullCheck;
import static java.util.Optional.ofNullable;
final class OfListImpl<T> {
OfListImpl(Function<CharSequence, Optional<T>> of, Function<CharSequence, Iterable<CharSequence>> split) {
this.of = nullCheck(of, "Text conversion must be present.");
this.split = nullCheck(split, "Split conversion must be present.");
}
Function<CharSequence, Optional<List<T>>> compile() {
return text -> {
if (ofNullable(text).isPresent()) {
final List<T> list = toList(text);
return list.isEmpty() ? Optional.empty() : Optional.of(list);
} else {
return Optional.empty();
}
};
}
private List<T> toList(CharSequence text) {
final List<T> list = new LinkedList<>();
for (CharSequence part : split.apply(text)) {
of.apply(part).ifPresent(list::add);
}
return list;
}
private final Function<CharSequence, Optional<T>> of;
private final Function<CharSequence, Iterable<CharSequence>> split;
}