package org.infinispan.stream.impl; import java.util.Spliterator; import java.util.stream.BaseStream; import java.util.stream.StreamSupport; import org.infinispan.BaseCacheStream; import org.infinispan.CacheStream; import org.infinispan.DoubleCacheStream; import org.infinispan.IntCacheStream; import org.infinispan.LongCacheStream; /** * The various intermediate types. Note that the local intermediate operation can be a type other than the * resulting stream, so we have to keep track of what it was to avoid {@link ClassCastException} issues. */ public enum IntermediateType { REF { @Override public <T, S extends BaseStream<T, S>> S handleStream(BaseCacheStream streamable) { CacheStream<?> stream = (CacheStream<?>) streamable; Spliterator<?> spliterator = stream.spliterator(); return (S) StreamSupport.stream(spliterator, streamable.isParallel()); } }, INT { @Override public <T, S extends BaseStream<T, S>> S handleStream(BaseCacheStream streamable) { IntCacheStream stream = (IntCacheStream) streamable; Spliterator.OfInt spliterator = stream.spliterator(); return (S) StreamSupport.intStream(spliterator, streamable.isParallel()); } }, LONG { @Override public <T, S extends BaseStream<T, S>> S handleStream(BaseCacheStream streamable) { LongCacheStream stream = (LongCacheStream) streamable; Spliterator.OfLong spliterator = stream.spliterator(); return (S) StreamSupport.longStream(spliterator, streamable.isParallel()); } }, DOUBLE { @Override public <T, S extends BaseStream<T, S>> S handleStream(BaseCacheStream streamable) { DoubleCacheStream stream = (DoubleCacheStream) streamable; Spliterator.OfDouble spliterator = stream.spliterator(); return (S) StreamSupport.doubleStream(spliterator, streamable.isParallel()); } }; public abstract <T, S extends BaseStream<T, S>> S handleStream(BaseCacheStream streamable); }