/** * * Copyright (c) 2006-2017, Speedment, Inc. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); You may not * use this file except in compliance with the License. You may obtain a copy of * the License at: * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.speedment.common.mutablestream; import com.speedment.common.mutablestream.action.DistinctAction; import com.speedment.common.mutablestream.action.FlatMapLongAction; import com.speedment.common.mutablestream.action.LongFilterAction; import com.speedment.common.mutablestream.action.LimitAction; import com.speedment.common.mutablestream.action.MapLongAction; import com.speedment.common.mutablestream.action.MapLongToDoubleAction; import com.speedment.common.mutablestream.action.MapLongToIntAction; import com.speedment.common.mutablestream.action.MapLongToLongAction; import com.speedment.common.mutablestream.action.SkipAction; import com.speedment.common.mutablestream.action.SortedAction; import com.speedment.common.mutablestream.terminate.AllMatchLongTerminator; import com.speedment.common.mutablestream.terminate.AnyMatchLongTerminator; import com.speedment.common.mutablestream.terminate.AverageTerminator; import com.speedment.common.mutablestream.terminate.CollectLongTerminator; import com.speedment.common.mutablestream.terminate.CountTerminator; import com.speedment.common.mutablestream.terminate.FindAnyLongTerminator; import com.speedment.common.mutablestream.terminate.FindFirstLongTerminator; import com.speedment.common.mutablestream.terminate.ForEachLongOrderedTerminator; import com.speedment.common.mutablestream.terminate.ForEachLongTerminator; import com.speedment.common.mutablestream.terminate.LongIteratorTerminator; import com.speedment.common.mutablestream.terminate.LongSpliteratorTerminator; import com.speedment.common.mutablestream.terminate.LongSummaryStatisticsTerminator; import com.speedment.common.mutablestream.terminate.MaxLongTerminator; import com.speedment.common.mutablestream.terminate.MinLongTerminator; import com.speedment.common.mutablestream.terminate.NoneMatchLongTerminator; import com.speedment.common.mutablestream.terminate.ReduceLongTerminator; import com.speedment.common.mutablestream.terminate.ToLongArrayTerminator; import java.util.LongSummaryStatistics; import java.util.OptionalDouble; import java.util.OptionalLong; import java.util.PrimitiveIterator; import java.util.Spliterator; import java.util.function.BiConsumer; import java.util.function.LongBinaryOperator; import java.util.function.LongConsumer; import java.util.function.LongFunction; import java.util.function.LongPredicate; import java.util.function.LongToDoubleFunction; import java.util.function.LongUnaryOperator; import java.util.function.ObjLongConsumer; import java.util.function.Supplier; import java.util.stream.DoubleStream; import java.util.stream.LongStream; import java.util.stream.Stream; import com.speedment.common.mutablestream.terminate.SumLongTerminator; import java.util.function.LongToIntFunction; import java.util.stream.IntStream; import static java.util.Objects.requireNonNull; /** * * @author Emil Forslund * @since 1.0.0 */ public final class MutableLongStream implements LongStream { public static LongStream wrap(HasNext<Long, LongStream> pipeline) { return internalWrap(pipeline, false); } static LongStream internalWrap(HasNext<Long, LongStream> pipeline, boolean parallel) { return new MutableLongStream(pipeline, parallel); } /**************************************************************************/ /* Intermediate Actions */ /**************************************************************************/ @Override public LongStream filter(LongPredicate filter) { return internalWrap(pipeline.append(LongFilterAction.create(pipeline, filter)), parallel); } @Override public LongStream map(LongUnaryOperator mapper) { return internalWrap(pipeline.append(MapLongToLongAction.create(pipeline, mapper)), parallel); } @Override @SuppressWarnings("unchecked") public <U> Stream<U> mapToObj(LongFunction<? extends U> mapper) { return MutableStream.internalWrap(pipeline.append(MapLongAction.create(pipeline, (LongFunction<U>) mapper)), parallel); } @Override public IntStream mapToInt(LongToIntFunction mapper) { return MutableIntStream.internalWrap(pipeline.append(MapLongToIntAction.create(pipeline, mapper)), parallel); } @Override public DoubleStream mapToDouble(LongToDoubleFunction mapper) { return MutableDoubleStream.internalWrap(pipeline.append(MapLongToDoubleAction.create(pipeline, mapper)), parallel); } @Override @SuppressWarnings("unchecked") public LongStream flatMap(LongFunction<? extends LongStream> mapper) { return internalWrap(pipeline.append(FlatMapLongAction.create(pipeline, (LongFunction<LongStream>) mapper)), parallel); } @Override public LongStream distinct() { return internalWrap(pipeline.append(DistinctAction.create(pipeline)), parallel); } @Override public LongStream sorted() { return internalWrap(pipeline.append(SortedAction.create(pipeline)), parallel); } @Override public LongStream peek(LongConsumer ic) { // Mutable Streams can not be peeked inside since they might not be // resolved as a stream at all. return this; } @Override public LongStream limit(long limit) { return internalWrap(pipeline.append(LimitAction.create(pipeline, limit)), parallel); } @Override public LongStream skip(long skip) { return internalWrap(pipeline.append(SkipAction.create(pipeline, skip)), parallel); } @Override public DoubleStream asDoubleStream() { return mapToDouble(i -> i); } @Override public Stream<Long> boxed() { return mapToObj(i -> i); } /**************************************************************************/ /* Terminating Actions */ /**************************************************************************/ @Override public void forEach(LongConsumer action) { pipeline.execute(ForEachLongTerminator.create(pipeline, parallel, action)); } @Override public void forEachOrdered(LongConsumer action) { pipeline.execute(ForEachLongOrderedTerminator.create(pipeline, parallel, action)); } @Override public long[] toArray() { return pipeline.execute(ToLongArrayTerminator.create(pipeline, parallel)); } @Override public long reduce(long initialValue, LongBinaryOperator combiner) { return pipeline.execute(ReduceLongTerminator.create(pipeline, parallel, initialValue, combiner)).getAsLong(); } @Override public OptionalLong reduce(LongBinaryOperator combiner) { return pipeline.execute(ReduceLongTerminator.create(pipeline, parallel, combiner)); } @Override public <R> R collect(Supplier<R> supplier, ObjLongConsumer<R> accumulator, BiConsumer<R, R> merger) { return pipeline.execute(CollectLongTerminator.create(pipeline, parallel, supplier, accumulator, merger)); } @Override public long sum() { return pipeline.execute(SumLongTerminator.create(pipeline, parallel)); } @Override public OptionalLong min() { return pipeline.execute(MinLongTerminator.create(pipeline, parallel)); } @Override public OptionalLong max() { return pipeline.execute(MaxLongTerminator.create(pipeline, parallel)); } @Override public long count() { return pipeline.execute(CountTerminator.create(pipeline, parallel)); } @Override public OptionalDouble average() { return pipeline.execute(AverageTerminator.create(pipeline, parallel)); } @Override public LongSummaryStatistics summaryStatistics() { return pipeline.execute(LongSummaryStatisticsTerminator.create(pipeline, parallel)); } @Override public boolean anyMatch(LongPredicate predicate) { return pipeline.execute(AnyMatchLongTerminator.create(pipeline, parallel, predicate)); } @Override public boolean allMatch(LongPredicate predicate) { return pipeline.execute(AllMatchLongTerminator.create(pipeline, parallel, predicate)); } @Override public boolean noneMatch(LongPredicate predicate) { return pipeline.execute(NoneMatchLongTerminator.create(pipeline, parallel, predicate)); } @Override public OptionalLong findFirst() { return pipeline.execute(FindFirstLongTerminator.create(pipeline, parallel)); } @Override public OptionalLong findAny() { return pipeline.execute(FindAnyLongTerminator.create(pipeline, parallel)); } @Override public PrimitiveIterator.OfLong iterator() { return pipeline.execute(LongIteratorTerminator.create(pipeline, parallel)); } @Override public Spliterator.OfLong spliterator() { return pipeline.execute(LongSpliteratorTerminator.create(pipeline, parallel)); } /**************************************************************************/ /* Inherited Methods from Base Stream */ /**************************************************************************/ @Override public boolean isParallel() { return parallel; } @Override public LongStream sequential() { return parallel ? internalWrap(pipeline, false) : this; } @Override public LongStream parallel() { return parallel ? this : internalWrap(pipeline, true); } @Override public LongStream unordered() { return this; } @Override public LongStream onClose(Runnable r) { throw new UnsupportedOperationException( "Close listeners are not supported by this stream implementation." ); } @Override public void close() { // Do nothing since close listeners are not supported by this // implementation of the stream API. } /**************************************************************************/ /* Constructor */ /**************************************************************************/ private MutableLongStream(HasNext<Long, LongStream> pipeline, boolean parallel) { this.pipeline = requireNonNull(pipeline); this.parallel = parallel; } private final HasNext<Long, LongStream> pipeline; private final boolean parallel; }