package org.infinispan.counter.impl.function;
import java.io.IOException;
import java.io.ObjectInput;
import java.util.Collections;
import java.util.Set;
import java.util.function.Function;
import org.infinispan.commons.api.functional.EntryView;
import org.infinispan.commons.marshall.AdvancedExternalizer;
import org.infinispan.commons.marshall.exts.NoStateExternalizer;
import org.infinispan.counter.impl.entries.CounterValue;
import org.infinispan.counter.impl.externalizers.ExternalizerIds;
/**
* Read function that returns the current counter's delta.
* <p>
* Singleton class. Use {@link ReadFunction#getInstance()} to retrieve it.
*
* @author Pedro Ruivo
* @since 9.0
*/
public class ReadFunction<K> implements Function<EntryView.ReadEntryView<K, CounterValue>, Long> {
public static final AdvancedExternalizer<ReadFunction> EXTERNALIZER = new Externalizer();
private static final ReadFunction INSTANCE = new ReadFunction();
private ReadFunction() {
}
public static <K> ReadFunction<K> getInstance() {
//noinspection unchecked
return INSTANCE;
}
@Override
public String toString() {
return "ReadFunction{}";
}
@Override
public Long apply(EntryView.ReadEntryView<K, CounterValue> view) {
return view.find().map(CounterValue::getValue).orElse(null);
}
private static class Externalizer extends NoStateExternalizer<ReadFunction> {
private Externalizer() {
}
@Override
public Set<Class<? extends ReadFunction>> getTypeClasses() {
return Collections.singleton(ReadFunction.class);
}
@Override
public Integer getId() {
return ExternalizerIds.READ_FUNCTION;
}
@Override
public ReadFunction readObject(ObjectInput input) throws IOException, ClassNotFoundException {
return INSTANCE;
}
}
}