Skip to content

Commit

Permalink
Implemented lightweight primitive iterators/streams type adapters
Browse files Browse the repository at this point in the history
  • Loading branch information
lyubomyr-shaydariv committed Sep 23, 2024
1 parent e1e3a7c commit 80e8460
Show file tree
Hide file tree
Showing 10 changed files with 95 additions and 195 deletions.
39 changes: 0 additions & 39 deletions src/main/java/lsh/ext/gson/AbstractCursorTypeAdapter.java

This file was deleted.

44 changes: 44 additions & 0 deletions src/main/java/lsh/ext/gson/StreamedTypeAdapter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package lsh.ext.gson;

import java.util.function.BiConsumer;
import java.util.function.Function;
import java.util.function.Predicate;

import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor(access = AccessLevel.PROTECTED)
public final class StreamedTypeAdapter<S, I>
extends TypeAdapter<S> {

private final Function<? super JsonReader, ? extends S> toStream;
private final Function<? super S, ? extends I> toIterator;
private final Predicate<? super I> hasNext;
private final BiConsumer<? super JsonWriter, ? super I> writeNext;

public static <S, I> TypeAdapter<S> getInstance(
final Function<? super JsonReader, ? extends S> toStream,
final Function<? super S, ? extends I> toIterator,
final Predicate<? super I> hasNext,
final BiConsumer<? super JsonWriter, ? super I> writeNext
) {
return new StreamedTypeAdapter<>(toStream, toIterator, hasNext, writeNext);
}

@Override
public void write(final JsonWriter out, final S cursor) {
final I iterator = toIterator.apply(cursor);
while ( hasNext.test(iterator) ) {
writeNext.accept(out, iterator);
}
}

@Override
public S read(final JsonReader in) {
return toStream.apply(in);
}

}

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,15 +1,21 @@
package lsh.ext.gson.ext.java.util.stream;

import java.io.IOException;
import java.util.PrimitiveIterator;
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.stream.BaseStream;
import java.util.stream.DoubleStream;
import java.util.stream.IntStream;
import java.util.stream.LongStream;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;

import com.google.gson.TypeAdapter;
import lombok.experimental.UtilityClass;
import lsh.ext.gson.JsonArrayStreamTypeAdapter;
import lsh.ext.gson.JsonReaders;
import lsh.ext.gson.StreamedTypeAdapter;

@UtilityClass
public final class StreamTypeAdapter {
Expand All @@ -31,4 +37,43 @@ public static <E> TypeAdapter<Stream<E>> forStream(final TypeAdapter<E> elementT
}, BaseStream::iterator);
}

public static final TypeAdapter<DoubleStream> forDoubleStream = StreamedTypeAdapter.getInstance(
in -> StreamSupport.doubleStream(Spliterators.spliteratorUnknownSize(JsonReaders.asDoubleIterator(in), Spliterator.IMMUTABLE), false),
DoubleStream::iterator,
PrimitiveIterator.OfDouble::hasNext,
(out, iterator) -> {
try {
out.value(iterator.next());
} catch ( final IOException ex ) {
throw new RuntimeException(ex);
}
}
);

public static final TypeAdapter<IntStream> forIntStream = StreamedTypeAdapter.getInstance(
in -> StreamSupport.intStream(Spliterators.spliteratorUnknownSize(JsonReaders.asIntIterator(in), Spliterator.IMMUTABLE), false),
IntStream::iterator,
PrimitiveIterator.OfInt::hasNext,
(out, iterator) -> {
try {
out.value(iterator.next());
} catch ( final IOException ex ) {
throw new RuntimeException(ex);
}
}
);

public static final TypeAdapter<LongStream> forLongStream = StreamedTypeAdapter.getInstance(
in -> StreamSupport.longStream(Spliterators.spliteratorUnknownSize(JsonReaders.asLongIterator(in), Spliterator.IMMUTABLE), false),
LongStream::iterator,
PrimitiveIterator.OfLong::hasNext,
(out, iterator) -> {
try {
out.value(iterator.next());
} catch ( final IOException ex ) {
throw new RuntimeException(ex);
}
}
);

}
Original file line number Diff line number Diff line change
Expand Up @@ -16,19 +16,19 @@ public static <E> ITypeAdapterFactory<Stream<E>> forStream(final boolean useBegi
return ITypeAdapterFactory.forClass(Stream.class, typeResolver -> StreamTypeAdapter.forStream(typeResolver.getTypeAdapter(0), useBeginEnd, autoClose));
}

public static ITypeAdapterFactory<DoubleStream> defaultForDoubleStream = forDoubleStream(DoubleStreamTypeAdapter.getInstance());
public static ITypeAdapterFactory<DoubleStream> defaultForDoubleStream = forDoubleStream(StreamTypeAdapter.forDoubleStream);

public static ITypeAdapterFactory<DoubleStream> forDoubleStream(final TypeAdapter<DoubleStream> typeAdapter) {
return ITypeAdapterFactory.forClass(DoubleStream.class, typeResolver -> typeAdapter);
}

public static ITypeAdapterFactory<IntStream> defaultForIntStream = forIntStream(IntStreamTypeAdapter.getInstance());
public static ITypeAdapterFactory<IntStream> defaultForIntStream = forIntStream(StreamTypeAdapter.forIntStream);

public static ITypeAdapterFactory<IntStream> forIntStream(final TypeAdapter<IntStream> typeAdapter) {
return ITypeAdapterFactory.forClass(IntStream.class, typeResolver -> typeAdapter);
}

public static ITypeAdapterFactory<LongStream> defaultForLongStream = forLongStream(LongStreamTypeAdapter.getInstance());
public static ITypeAdapterFactory<LongStream> defaultForLongStream = forLongStream(StreamTypeAdapter.forLongStream);

public static ITypeAdapterFactory<LongStream> forLongStream(final TypeAdapter<LongStream> typeAdapter) {
return ITypeAdapterFactory.forClass(LongStream.class, typeResolver -> typeAdapter);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ protected List<?> normalize(@Nullable final DoubleStream value) {
protected List<Arguments> makeTestCases() {
return List.of(
makeTestCase(
DoubleStreamTypeAdapter.getInstance(),
StreamTypeAdapter.forDoubleStream,
"[1,2,4,8]",
"[1.0,2.0,4.0,8.0]",
Stream.of(1.0D, 2.0D, 4.0D, 8.0D).mapToDouble(value -> value)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ protected List<?> normalize(@Nullable final IntStream value) {
protected List<Arguments> makeTestCases() {
return List.of(
makeTestCase(
IntStreamTypeAdapter.getInstance(),
StreamTypeAdapter.forIntStream,
"[1,2,4,8]",
Stream.of(1, 2, 4, 8).mapToInt(value -> value)
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ protected List<?> normalize(@Nullable final LongStream value) {
protected List<Arguments> makeTestCases() {
return List.of(
makeTestCase(
LongStreamTypeAdapter.getInstance(),
StreamTypeAdapter.forLongStream,
"[1,2,4,8]",
Stream.of(1L, 2L, 4L, 8L).mapToLong(value -> value)
)
Expand Down

0 comments on commit 80e8460

Please sign in to comment.