package com.codepoetics.octarine.json.deserialisation;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import org.pcollections.PVector;
import org.pcollections.TreePVector;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import java.util.function.Function;
public final class ListDeserialiser<V> implements SafeDeserialiser<PVector<V>> {
public static <V> ListDeserialiser<V> readingItemsWith(Function<JsonParser, ? extends V> itemDeserialiser) {
return new ListDeserialiser<>(itemDeserialiser);
}
public static ListDeserialiser<String> readingStrings() {
return readingItemsWith(Deserialisers.ofString);
}
public static ListDeserialiser<Integer> readingIntegers() {
return readingItemsWith(Deserialisers.ofInteger);
}
public static ListDeserialiser<Long> readingLongs() {
return readingItemsWith(Deserialisers.ofLong);
}
public static ListDeserialiser<Double> readingDoubles() {
return readingItemsWith(Deserialisers.ofDouble);
}
public static ListDeserialiser<Boolean> readingBooleans() {
return readingItemsWith(Deserialisers.ofBoolean);
}
private final Function<JsonParser, ? extends V> itemDeserialiser;
private ListDeserialiser(Function<JsonParser, ? extends V> itemDeserialiser) {
this.itemDeserialiser = itemDeserialiser;
}
@Override
public PVector<V> applyUnsafe(JsonParser p) throws IOException {
List<V> values = new LinkedList<>();
while (p.nextToken() != JsonToken.END_ARRAY) {
values.add(itemDeserialiser.apply(p));
}
return TreePVector.from(values);
}
}