mirror of
https://github.com/Eaglercraft-TeaVM-Fork/eagler-teavm.git
synced 2024-12-22 08:14:09 -08:00
Add support of stream API
This commit is contained in:
parent
2fb6ca7001
commit
608e62ae3b
|
@ -15,13 +15,47 @@
|
||||||
*/
|
*/
|
||||||
package org.teavm.classlib.java.lang;
|
package org.teavm.classlib.java.lang;
|
||||||
|
|
||||||
|
import java.util.function.Consumer;
|
||||||
import org.teavm.classlib.java.util.TIterator;
|
import org.teavm.classlib.java.util.TIterator;
|
||||||
|
import org.teavm.classlib.java.util.TSpliterator;
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @author Alexey Andreev
|
|
||||||
* @param <T> type this collection returns.
|
|
||||||
*/
|
|
||||||
public interface TIterable<T> {
|
public interface TIterable<T> {
|
||||||
TIterator<T> iterator();
|
TIterator<T> iterator();
|
||||||
|
|
||||||
|
default TSpliterator<T> spliterator() {
|
||||||
|
TIterator<T> iterator = iterator();
|
||||||
|
return new TSpliterator<T>() {
|
||||||
|
@Override
|
||||||
|
public boolean tryAdvance(Consumer<? super T> action) {
|
||||||
|
if (iterator.hasNext()) {
|
||||||
|
action.accept(iterator.next());
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void forEachRemaining(Consumer<? super T> action) {
|
||||||
|
while (iterator.hasNext()) {
|
||||||
|
action.accept(iterator.next());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TSpliterator<T> trySplit() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long estimateSize() {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int characteristics() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,11 +19,6 @@ import java.lang.reflect.Array;
|
||||||
import org.teavm.classlib.java.lang.TObject;
|
import org.teavm.classlib.java.lang.TObject;
|
||||||
import org.teavm.classlib.java.lang.TUnsupportedOperationException;
|
import org.teavm.classlib.java.lang.TUnsupportedOperationException;
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @author Alexey Andreev
|
|
||||||
* @param <E>
|
|
||||||
*/
|
|
||||||
public abstract class TAbstractCollection<E> extends TObject implements TCollection<E> {
|
public abstract class TAbstractCollection<E> extends TObject implements TCollection<E> {
|
||||||
protected TAbstractCollection() {
|
protected TAbstractCollection() {
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,11 +15,8 @@
|
||||||
*/
|
*/
|
||||||
package org.teavm.classlib.java.util;
|
package org.teavm.classlib.java.util;
|
||||||
|
|
||||||
/**
|
import java.util.Arrays;
|
||||||
*
|
|
||||||
* @author Alexey Andreev
|
|
||||||
* @param <E>
|
|
||||||
*/
|
|
||||||
public abstract class TAbstractSet<E> extends TAbstractCollection<E> implements TSet<E> {
|
public abstract class TAbstractSet<E> extends TAbstractCollection<E> implements TSet<E> {
|
||||||
public TAbstractSet() {
|
public TAbstractSet() {
|
||||||
super();
|
super();
|
||||||
|
@ -45,4 +42,31 @@ public abstract class TAbstractSet<E> extends TAbstractCollection<E> implements
|
||||||
}
|
}
|
||||||
return modified;
|
return modified;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (this == obj) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (!(obj instanceof TSet)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
TSet<?> other = (TSet<?>) obj;
|
||||||
|
if (size() != other.size()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (TIterator<?> iter = other.iterator(); iter.hasNext();) {
|
||||||
|
if (!contains(iter.next())) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Arrays.hashCode(toArray());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,6 +29,14 @@ import org.teavm.classlib.java.lang.TObject;
|
||||||
import org.teavm.classlib.java.lang.TString;
|
import org.teavm.classlib.java.lang.TString;
|
||||||
import org.teavm.classlib.java.lang.TStringBuilder;
|
import org.teavm.classlib.java.lang.TStringBuilder;
|
||||||
import org.teavm.classlib.java.lang.reflect.TArray;
|
import org.teavm.classlib.java.lang.reflect.TArray;
|
||||||
|
import org.teavm.classlib.java.util.stream.TDoubleStream;
|
||||||
|
import org.teavm.classlib.java.util.stream.TIntStream;
|
||||||
|
import org.teavm.classlib.java.util.stream.TLongStream;
|
||||||
|
import org.teavm.classlib.java.util.stream.TStream;
|
||||||
|
import org.teavm.classlib.java.util.stream.doubleimpl.TArrayDoubleStreamImpl;
|
||||||
|
import org.teavm.classlib.java.util.stream.impl.TArrayStreamImpl;
|
||||||
|
import org.teavm.classlib.java.util.stream.intimpl.TArrayIntStreamImpl;
|
||||||
|
import org.teavm.classlib.java.util.stream.longimpl.TArrayLongStreamImpl;
|
||||||
|
|
||||||
public class TArrays extends TObject {
|
public class TArrays extends TObject {
|
||||||
public static char[] copyOf(char[] array, int length) {
|
public static char[] copyOf(char[] array, int length) {
|
||||||
|
@ -1519,7 +1527,7 @@ public class TArrays extends TObject {
|
||||||
|
|
||||||
public static TString deepToString(Object[] a) {
|
public static TString deepToString(Object[] a) {
|
||||||
TStringBuilder sb = new TStringBuilder();
|
TStringBuilder sb = new TStringBuilder();
|
||||||
deepToString(a, sb, new TArrayList<Object[]>());
|
deepToString(a, sb, new TArrayList<>());
|
||||||
return TString.wrap(sb.toString());
|
return TString.wrap(sb.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1548,4 +1556,48 @@ public class TArrays extends TObject {
|
||||||
out.append(TObject.wrap(a));
|
out.append(TObject.wrap(a));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static <T> TStream<T> stream(T[] array) {
|
||||||
|
return new TArrayStreamImpl<>(array, 0, array.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> TStream<T> stream(T[] array, int startInclusive, int endExclusive) {
|
||||||
|
if (startInclusive < 0 || endExclusive < startInclusive || endExclusive > array.length) {
|
||||||
|
throw new ArrayIndexOutOfBoundsException();
|
||||||
|
}
|
||||||
|
return new TArrayStreamImpl<>(array, startInclusive, endExclusive);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static TIntStream stream(int[] array) {
|
||||||
|
return new TArrayIntStreamImpl(array, 0, array.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static TIntStream stream(int[] array, int startInclusive, int endExclusive) {
|
||||||
|
if (startInclusive < 0 || endExclusive < startInclusive || endExclusive > array.length) {
|
||||||
|
throw new ArrayIndexOutOfBoundsException();
|
||||||
|
}
|
||||||
|
return new TArrayIntStreamImpl(array, startInclusive, endExclusive);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static TLongStream stream(long[] array) {
|
||||||
|
return new TArrayLongStreamImpl(array, 0, array.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static TLongStream stream(long[] array, int startInclusive, int endExclusive) {
|
||||||
|
if (startInclusive < 0 || endExclusive < startInclusive || endExclusive > array.length) {
|
||||||
|
throw new ArrayIndexOutOfBoundsException();
|
||||||
|
}
|
||||||
|
return new TArrayLongStreamImpl(array, startInclusive, endExclusive);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static TDoubleStream stream(double[] array) {
|
||||||
|
return new TArrayDoubleStreamImpl(array, 0, array.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static TDoubleStream stream(double[] array, int startInclusive, int endExclusive) {
|
||||||
|
if (startInclusive < 0 || endExclusive < startInclusive || endExclusive > array.length) {
|
||||||
|
throw new ArrayIndexOutOfBoundsException();
|
||||||
|
}
|
||||||
|
return new TArrayDoubleStreamImpl(array, startInclusive, endExclusive);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,13 +15,12 @@
|
||||||
*/
|
*/
|
||||||
package org.teavm.classlib.java.util;
|
package org.teavm.classlib.java.util;
|
||||||
|
|
||||||
|
import java.util.Spliterator;
|
||||||
import org.teavm.classlib.java.lang.TIterable;
|
import org.teavm.classlib.java.lang.TIterable;
|
||||||
|
import org.teavm.classlib.java.util.stream.TStream;
|
||||||
|
import org.teavm.classlib.java.util.stream.impl.TSpliteratorOverCollection;
|
||||||
|
import org.teavm.classlib.java.util.stream.impl.TStreamOverSpliterator;
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @author Alexey Andreev
|
|
||||||
* @param <E>
|
|
||||||
*/
|
|
||||||
public interface TCollection<E> extends TIterable<E> {
|
public interface TCollection<E> extends TIterable<E> {
|
||||||
int size();
|
int size();
|
||||||
|
|
||||||
|
@ -46,4 +45,14 @@ public interface TCollection<E> extends TIterable<E> {
|
||||||
boolean retainAll(TCollection<?> c);
|
boolean retainAll(TCollection<?> c);
|
||||||
|
|
||||||
void clear();
|
void clear();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
default TSpliterator<E> spliterator() {
|
||||||
|
return new TSpliteratorOverCollection<>(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
default TStream<E> stream() {
|
||||||
|
return new TStreamOverSpliterator<>((Spliterator<E>) spliterator());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,15 +15,18 @@
|
||||||
*/
|
*/
|
||||||
package org.teavm.classlib.java.util;
|
package org.teavm.classlib.java.util;
|
||||||
|
|
||||||
/**
|
import java.util.function.Consumer;
|
||||||
*
|
|
||||||
* @author Alexey Andreev
|
|
||||||
* @param <E>
|
|
||||||
*/
|
|
||||||
public interface TIterator<E> {
|
public interface TIterator<E> {
|
||||||
boolean hasNext();
|
boolean hasNext();
|
||||||
|
|
||||||
E next();
|
E next();
|
||||||
|
|
||||||
void remove();
|
void remove();
|
||||||
|
|
||||||
|
default void forEachRemaining(Consumer<? super E> action) {
|
||||||
|
while (hasNext()) {
|
||||||
|
action.accept(next());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,11 +15,6 @@
|
||||||
*/
|
*/
|
||||||
package org.teavm.classlib.java.util;
|
package org.teavm.classlib.java.util;
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @author Alexey Andreev
|
|
||||||
* @param <E>
|
|
||||||
*/
|
|
||||||
public interface TList<E> extends TCollection<E> {
|
public interface TList<E> extends TCollection<E> {
|
||||||
boolean addAll(int index, TCollection<? extends E> c);
|
boolean addAll(int index, TCollection<? extends E> c);
|
||||||
|
|
||||||
|
@ -40,4 +35,8 @@ public interface TList<E> extends TCollection<E> {
|
||||||
TListIterator<E> listIterator(int index);
|
TListIterator<E> listIterator(int index);
|
||||||
|
|
||||||
TList<E> subList(int fromIndex, int toIndex);
|
TList<E> subList(int fromIndex, int toIndex);
|
||||||
|
|
||||||
|
default void sort(TComparator<? super E> c) {
|
||||||
|
TCollections.sort(this, c);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,96 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util;
|
||||||
|
|
||||||
|
import java.util.NoSuchElementException;
|
||||||
|
import java.util.function.DoubleConsumer;
|
||||||
|
import java.util.function.DoubleSupplier;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
public class TOptionalDouble {
|
||||||
|
private static TOptionalDouble emptyInstance;
|
||||||
|
private final double value;
|
||||||
|
|
||||||
|
private TOptionalDouble(double value) {
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public static TOptionalDouble empty() {
|
||||||
|
if (emptyInstance == null) {
|
||||||
|
emptyInstance = new TOptionalDouble(0);
|
||||||
|
}
|
||||||
|
return emptyInstance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static TOptionalDouble of(double value) {
|
||||||
|
return new TOptionalDouble(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getAsDouble() {
|
||||||
|
if (this == emptyInstance) {
|
||||||
|
throw new NoSuchElementException();
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isPresent() {
|
||||||
|
return this != emptyInstance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ifPresent(DoubleConsumer consumer) {
|
||||||
|
if (this != emptyInstance) {
|
||||||
|
consumer.accept(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public double orElse(double other) {
|
||||||
|
return this != emptyInstance ? value : other;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double orElseGet(DoubleSupplier other) {
|
||||||
|
return this != emptyInstance ? value : other.getAsDouble();
|
||||||
|
}
|
||||||
|
|
||||||
|
public <X extends Throwable> double orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
|
||||||
|
if (!isPresent()) {
|
||||||
|
throw exceptionSupplier.get();
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (this == obj) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (!(obj instanceof TOptionalDouble)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ((TOptionalDouble) obj).value == value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Double.hashCode(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return isPresent() ? "OptionalDouble.of(" + value + ")" : "OptionalDouble.empty()";
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,96 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util;
|
||||||
|
|
||||||
|
import java.util.NoSuchElementException;
|
||||||
|
import java.util.function.IntConsumer;
|
||||||
|
import java.util.function.IntSupplier;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
public class TOptionalInt {
|
||||||
|
private static TOptionalInt emptyInstance;
|
||||||
|
private final int value;
|
||||||
|
|
||||||
|
private TOptionalInt(int value) {
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public static TOptionalInt empty() {
|
||||||
|
if (emptyInstance == null) {
|
||||||
|
emptyInstance = new TOptionalInt(0);
|
||||||
|
}
|
||||||
|
return emptyInstance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static TOptionalInt of(int value) {
|
||||||
|
return new TOptionalInt(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getAsInt() {
|
||||||
|
if (this == emptyInstance) {
|
||||||
|
throw new NoSuchElementException();
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isPresent() {
|
||||||
|
return this != emptyInstance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ifPresent(IntConsumer consumer) {
|
||||||
|
if (this != emptyInstance) {
|
||||||
|
consumer.accept(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public int orElse(int other) {
|
||||||
|
return this != emptyInstance ? value : other;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int orElseGet(IntSupplier other) {
|
||||||
|
return this != emptyInstance ? value : other.getAsInt();
|
||||||
|
}
|
||||||
|
|
||||||
|
public <X extends Throwable> int orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
|
||||||
|
if (!isPresent()) {
|
||||||
|
throw exceptionSupplier.get();
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (this == obj) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (!(obj instanceof TOptionalInt)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ((TOptionalInt) obj).value == value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return isPresent() ? "OptionalInt.of(" + value + ")" : "OptionalInt.empty()";
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,96 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util;
|
||||||
|
|
||||||
|
import java.util.NoSuchElementException;
|
||||||
|
import java.util.function.LongConsumer;
|
||||||
|
import java.util.function.LongSupplier;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
public class TOptionalLong {
|
||||||
|
private static TOptionalLong emptyInstance;
|
||||||
|
private final long value;
|
||||||
|
|
||||||
|
private TOptionalLong(long value) {
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public static TOptionalLong empty() {
|
||||||
|
if (emptyInstance == null) {
|
||||||
|
emptyInstance = new TOptionalLong(0);
|
||||||
|
}
|
||||||
|
return emptyInstance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static TOptionalLong of(long value) {
|
||||||
|
return new TOptionalLong(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getAsLong() {
|
||||||
|
if (this == emptyInstance) {
|
||||||
|
throw new NoSuchElementException();
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isPresent() {
|
||||||
|
return this != emptyInstance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ifPresent(LongConsumer consumer) {
|
||||||
|
if (this != emptyInstance) {
|
||||||
|
consumer.accept(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public long orElse(long other) {
|
||||||
|
return this != emptyInstance ? value : other;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long orElseGet(LongSupplier other) {
|
||||||
|
return this != emptyInstance ? value : other.getAsLong();
|
||||||
|
}
|
||||||
|
|
||||||
|
public <X extends Throwable> long orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
|
||||||
|
if (!isPresent()) {
|
||||||
|
throw exceptionSupplier.get();
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (this == obj) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (!(obj instanceof TOptionalLong)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ((TOptionalLong) obj).value == value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Long.hashCode(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return isPresent() ? "OptionalLong.of(" + value + ")" : "OptionalLong.empty()";
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,95 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
import java.util.function.DoubleConsumer;
|
||||||
|
import java.util.function.IntConsumer;
|
||||||
|
import java.util.function.LongConsumer;
|
||||||
|
|
||||||
|
public interface TPrimitiveIterator<T, S> extends Iterator<T> {
|
||||||
|
void forEachRemaining(S action);
|
||||||
|
|
||||||
|
interface OfInt extends TPrimitiveIterator<Integer, IntConsumer> {
|
||||||
|
@Override
|
||||||
|
default void forEachRemaining(Consumer<? super Integer> action) {
|
||||||
|
while (hasNext()) {
|
||||||
|
action.accept(nextInt());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
default void forEachRemaining(IntConsumer action) {
|
||||||
|
while (hasNext()) {
|
||||||
|
action.accept(nextInt());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int nextInt();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
default Integer next() {
|
||||||
|
return nextInt();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
interface OfLong extends TPrimitiveIterator<Long, LongConsumer> {
|
||||||
|
@Override
|
||||||
|
default void forEachRemaining(Consumer<? super Long> action) {
|
||||||
|
while (hasNext()) {
|
||||||
|
action.accept(nextLong());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
default void forEachRemaining(LongConsumer action) {
|
||||||
|
while (hasNext()) {
|
||||||
|
action.accept(nextLong());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
long nextLong();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
default Long next() {
|
||||||
|
return nextLong();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
interface OfDouble extends TPrimitiveIterator<Double, DoubleConsumer> {
|
||||||
|
@Override
|
||||||
|
default void forEachRemaining(Consumer<? super Double> action) {
|
||||||
|
while (hasNext()) {
|
||||||
|
action.accept(nextDouble());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
default void forEachRemaining(DoubleConsumer action) {
|
||||||
|
while (hasNext()) {
|
||||||
|
action.accept(nextDouble());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
double nextDouble();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
default Double next() {
|
||||||
|
return nextDouble();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,107 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util;
|
||||||
|
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
import java.util.function.DoubleConsumer;
|
||||||
|
import java.util.function.IntConsumer;
|
||||||
|
import java.util.function.LongConsumer;
|
||||||
|
|
||||||
|
public interface TSpliterator<T> {
|
||||||
|
int ORDERED = 16;
|
||||||
|
int DISTINCT = 1;
|
||||||
|
int SORTED = 4;
|
||||||
|
int SIZED = 64;
|
||||||
|
int NONNULL = 256;
|
||||||
|
int IMMUTABLE = 1024;
|
||||||
|
int CONCURRENT = 4096;
|
||||||
|
int SUBSIZED = 16384;
|
||||||
|
|
||||||
|
boolean tryAdvance(Consumer<? super T> action);
|
||||||
|
|
||||||
|
default void forEachRemaining(Consumer<? super T> action) {
|
||||||
|
while (tryAdvance(action)) {
|
||||||
|
// just repeat
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TSpliterator<T> trySplit();
|
||||||
|
|
||||||
|
long estimateSize();
|
||||||
|
|
||||||
|
default long getExactSizeIfKnown() {
|
||||||
|
return (characteristics() & SIZED) != 0 ? estimateSize() : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int characteristics();
|
||||||
|
|
||||||
|
default boolean hasCharacteristics(int characteristics) {
|
||||||
|
return (characteristics() & characteristics) == characteristics;
|
||||||
|
}
|
||||||
|
|
||||||
|
default Comparator<? super T> getComparator() {
|
||||||
|
throw new IllegalStateException();
|
||||||
|
}
|
||||||
|
|
||||||
|
interface OfPrimitive<T, C, S extends OfPrimitive<T, C, S>> {
|
||||||
|
S trySplit();
|
||||||
|
|
||||||
|
boolean tryAdvance(C action);
|
||||||
|
|
||||||
|
default void forEachRemaining(C action) {
|
||||||
|
while (tryAdvance(action)) {
|
||||||
|
// continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
interface OfInt extends OfPrimitive<Integer, IntConsumer, OfInt> {
|
||||||
|
default boolean tryAdvance(Consumer<? super Integer> action) {
|
||||||
|
return tryAdvance((IntConsumer) action::accept);
|
||||||
|
}
|
||||||
|
|
||||||
|
default void forEachRemaining(Consumer<? super Integer> action) {
|
||||||
|
while (tryAdvance(action)) {
|
||||||
|
// continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
interface OfLong extends OfPrimitive<Long, LongConsumer, OfLong> {
|
||||||
|
default boolean tryAdvance(Consumer<? super Long> action) {
|
||||||
|
return tryAdvance((LongConsumer) action::accept);
|
||||||
|
}
|
||||||
|
|
||||||
|
default void forEachRemaining(Consumer<? super Long> action) {
|
||||||
|
while (tryAdvance(action)) {
|
||||||
|
// continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
interface OfDouble extends OfPrimitive<Double, DoubleConsumer, OfDouble> {
|
||||||
|
default boolean tryAdvance(Consumer<? super Double> action) {
|
||||||
|
return tryAdvance((DoubleConsumer) action::accept);
|
||||||
|
}
|
||||||
|
|
||||||
|
default void forEachRemaining(Consumer<? super Double> action) {
|
||||||
|
while (tryAdvance(action)) {
|
||||||
|
// continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,21 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.function;
|
||||||
|
|
||||||
|
@FunctionalInterface
|
||||||
|
public interface TLongBinaryOperator {
|
||||||
|
long applyAsLong(long left, long right);
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.function;
|
||||||
|
|
||||||
|
@FunctionalInterface
|
||||||
|
public interface TLongConsumer {
|
||||||
|
void accept(long value);
|
||||||
|
|
||||||
|
default TLongConsumer andThen(TLongConsumer after) {
|
||||||
|
return v -> {
|
||||||
|
accept(v);
|
||||||
|
after.accept(v);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,21 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.function;
|
||||||
|
|
||||||
|
@FunctionalInterface
|
||||||
|
public interface TLongFunction<R> {
|
||||||
|
R apply(long value);
|
||||||
|
}
|
|
@ -0,0 +1,33 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.function;
|
||||||
|
|
||||||
|
@FunctionalInterface
|
||||||
|
public interface TLongPredicate {
|
||||||
|
boolean test(long value);
|
||||||
|
|
||||||
|
default TLongPredicate and(TLongPredicate other) {
|
||||||
|
return v -> test(v) && other.test(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
default TLongPredicate negate() {
|
||||||
|
return v -> !test(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
default TLongPredicate or(TLongPredicate other) {
|
||||||
|
return v -> test(v) || other.test(v);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,21 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.function;
|
||||||
|
|
||||||
|
@FunctionalInterface
|
||||||
|
public interface TLongSupplier {
|
||||||
|
long getAsLong();
|
||||||
|
}
|
|
@ -0,0 +1,21 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.function;
|
||||||
|
|
||||||
|
@FunctionalInterface
|
||||||
|
public interface TLongToDoubleFunction {
|
||||||
|
double applyAsDouble(long value);
|
||||||
|
}
|
|
@ -0,0 +1,21 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.function;
|
||||||
|
|
||||||
|
@FunctionalInterface
|
||||||
|
public interface TLongToIntFunction {
|
||||||
|
int applyAsInt(long value);
|
||||||
|
}
|
|
@ -0,0 +1,33 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.function;
|
||||||
|
|
||||||
|
@FunctionalInterface
|
||||||
|
public interface TLongUnaryOperator {
|
||||||
|
long applyAsLong(long operand);
|
||||||
|
|
||||||
|
default TLongUnaryOperator compose(TLongUnaryOperator before) {
|
||||||
|
return v -> applyAsLong(before.applyAsLong(v));
|
||||||
|
}
|
||||||
|
|
||||||
|
default TLongUnaryOperator andThen(TLongUnaryOperator after) {
|
||||||
|
return v -> after.applyAsLong(applyAsLong(v));
|
||||||
|
}
|
||||||
|
|
||||||
|
static TLongUnaryOperator identity() {
|
||||||
|
return v -> v;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Spliterator;
|
||||||
|
|
||||||
|
public interface TBaseStream<T, S extends TBaseStream<T, S>> extends AutoCloseable {
|
||||||
|
Iterator<T> iterator();
|
||||||
|
|
||||||
|
Spliterator<T> spliterator();
|
||||||
|
|
||||||
|
boolean isParallel();
|
||||||
|
|
||||||
|
S sequential();
|
||||||
|
|
||||||
|
S parallel();
|
||||||
|
|
||||||
|
S unordered();
|
||||||
|
|
||||||
|
S onClose(Runnable closeHandler);
|
||||||
|
}
|
|
@ -0,0 +1,54 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.EnumSet;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.function.BiConsumer;
|
||||||
|
import java.util.function.BinaryOperator;
|
||||||
|
import java.util.function.Function;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
public interface TCollector<T, A, R> {
|
||||||
|
enum Characteristics {
|
||||||
|
CONCURRENT,
|
||||||
|
UNORDERED,
|
||||||
|
IDENTITY_FINISH
|
||||||
|
}
|
||||||
|
|
||||||
|
Supplier<A> supplier();
|
||||||
|
|
||||||
|
BiConsumer<A, T> accumulator();
|
||||||
|
|
||||||
|
BinaryOperator<A> combiner();
|
||||||
|
|
||||||
|
Function<A, R> finisher();
|
||||||
|
|
||||||
|
Set<Characteristics> characteristics();
|
||||||
|
|
||||||
|
static <T, R> TCollector<T, R, R> of(Supplier<R> supplier, BiConsumer<R, T> accumulator, BinaryOperator<R> combiner,
|
||||||
|
Characteristics... characteristics) {
|
||||||
|
return of(supplier, accumulator, combiner, x -> x, characteristics);
|
||||||
|
}
|
||||||
|
|
||||||
|
static <T, A, R> TCollector<T, A, R> of(Supplier<A> supplier, BiConsumer<A, T> accumulator,
|
||||||
|
BinaryOperator<A> combiner, Function<A, R> finisher, Characteristics... characteristics) {
|
||||||
|
EnumSet<Characteristics> characteristicsSet = EnumSet.noneOf(Characteristics.class);
|
||||||
|
characteristicsSet.addAll(Arrays.asList(characteristics));
|
||||||
|
return new TCollectorImpl<>(supplier, accumulator, combiner, finisher, characteristicsSet);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,65 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream;
|
||||||
|
|
||||||
|
import java.util.EnumSet;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.function.BiConsumer;
|
||||||
|
import java.util.function.BinaryOperator;
|
||||||
|
import java.util.function.Function;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
class TCollectorImpl<T, A, R> implements TCollector<T, A, R> {
|
||||||
|
private Supplier<A> supplier;
|
||||||
|
private BiConsumer<A, T> accumulator;
|
||||||
|
private BinaryOperator<A> combiner;
|
||||||
|
private Function<A, R> finisher;
|
||||||
|
private EnumSet<Characteristics> characteristics;
|
||||||
|
|
||||||
|
TCollectorImpl(Supplier<A> supplier, BiConsumer<A, T> accumulator, BinaryOperator<A> combiner,
|
||||||
|
Function<A, R> finisher, EnumSet<Characteristics> characteristics) {
|
||||||
|
this.supplier = supplier;
|
||||||
|
this.accumulator = accumulator;
|
||||||
|
this.combiner = combiner;
|
||||||
|
this.finisher = finisher;
|
||||||
|
this.characteristics = characteristics;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Supplier<A> supplier() {
|
||||||
|
return supplier;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BiConsumer<A, T> accumulator() {
|
||||||
|
return accumulator;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BinaryOperator<A> combiner() {
|
||||||
|
return combiner;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Function<A, R> finisher() {
|
||||||
|
return finisher;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<Characteristics> characteristics() {
|
||||||
|
return characteristics;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,72 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.function.BiConsumer;
|
||||||
|
import java.util.function.BinaryOperator;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
public final class TCollectors {
|
||||||
|
private TCollectors() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T, C extends Collection<T>> TCollector<T, ?, C> toCollection(Supplier<C> collectionFactory) {
|
||||||
|
return TCollector.of(collectionFactory, Collection::add, (a, b) -> {
|
||||||
|
a.addAll(b);
|
||||||
|
return a;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> TCollector<T, ?, List<T>> toList() {
|
||||||
|
return toCollection(ArrayList::new);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> TCollector<T, ?, Set<T>> toSet() {
|
||||||
|
return toCollection(HashSet::new);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static TCollector<CharSequence, ?, String> joining() {
|
||||||
|
return TCollector.of(StringBuilder::new, StringBuilder::append, StringBuilder::append,
|
||||||
|
StringBuilder::toString);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static TCollector<CharSequence, ?, String> joining(CharSequence delimiter) {
|
||||||
|
return joining(delimiter, "", "");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static TCollector<CharSequence, ?, String> joining(CharSequence delimiter, CharSequence prefix,
|
||||||
|
CharSequence suffix) {
|
||||||
|
BiConsumer<StringBuilder, CharSequence> accumulator = (sb, item) -> {
|
||||||
|
if (sb.length() > 0) {
|
||||||
|
sb.append(delimiter);
|
||||||
|
}
|
||||||
|
sb.append(item);
|
||||||
|
};
|
||||||
|
BinaryOperator<StringBuilder> combiner = (a, b) -> {
|
||||||
|
if (a.length() > 0) {
|
||||||
|
a.append(delimiter);
|
||||||
|
}
|
||||||
|
return a.append(b);
|
||||||
|
};
|
||||||
|
return TCollector.of(StringBuilder::new, accumulator, combiner,
|
||||||
|
sb -> sb.insert(0, prefix).append(suffix).toString());
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,147 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream;
|
||||||
|
|
||||||
|
import java.util.OptionalDouble;
|
||||||
|
import java.util.PrimitiveIterator;
|
||||||
|
import java.util.Spliterator;
|
||||||
|
import java.util.function.BiConsumer;
|
||||||
|
import java.util.function.DoubleBinaryOperator;
|
||||||
|
import java.util.function.DoubleConsumer;
|
||||||
|
import java.util.function.DoubleFunction;
|
||||||
|
import java.util.function.DoublePredicate;
|
||||||
|
import java.util.function.DoubleSupplier;
|
||||||
|
import java.util.function.DoubleToIntFunction;
|
||||||
|
import java.util.function.DoubleToLongFunction;
|
||||||
|
import java.util.function.DoubleUnaryOperator;
|
||||||
|
import java.util.function.ObjDoubleConsumer;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
import org.teavm.classlib.java.util.stream.doubleimpl.TArrayDoubleStreamImpl;
|
||||||
|
import org.teavm.classlib.java.util.stream.doubleimpl.TDoubleStreamBuilder;
|
||||||
|
import org.teavm.classlib.java.util.stream.doubleimpl.TEmptyDoubleStreamImpl;
|
||||||
|
import org.teavm.classlib.java.util.stream.doubleimpl.TGenerateDoubleStream;
|
||||||
|
import org.teavm.classlib.java.util.stream.doubleimpl.TGenericConcatDoubleStream;
|
||||||
|
import org.teavm.classlib.java.util.stream.doubleimpl.TIterateDoubleStream;
|
||||||
|
import org.teavm.classlib.java.util.stream.doubleimpl.TSimpleDoubleStreamImpl;
|
||||||
|
import org.teavm.classlib.java.util.stream.doubleimpl.TSingleDoubleStreamImpl;
|
||||||
|
import org.teavm.classlib.java.util.stream.doubleimpl.TSpecializedConcatDoubleStream;
|
||||||
|
|
||||||
|
public interface TDoubleStream extends TBaseStream<Double, TDoubleStream> {
|
||||||
|
interface Builder {
|
||||||
|
void accept(double t);
|
||||||
|
|
||||||
|
default Builder add(double t) {
|
||||||
|
accept(t);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
TDoubleStream build();
|
||||||
|
}
|
||||||
|
|
||||||
|
TDoubleStream filter(DoublePredicate predicate);
|
||||||
|
|
||||||
|
TDoubleStream map(DoubleUnaryOperator mapper);
|
||||||
|
|
||||||
|
<U> TStream<U> mapToObj(DoubleFunction<? extends U> mapper);
|
||||||
|
|
||||||
|
TIntStream mapToInt(DoubleToIntFunction mapper);
|
||||||
|
|
||||||
|
TLongStream mapToLong(DoubleToLongFunction mapper);
|
||||||
|
|
||||||
|
TDoubleStream flatMap(DoubleFunction<? extends TDoubleStream> mapper);
|
||||||
|
|
||||||
|
TDoubleStream distinct();
|
||||||
|
|
||||||
|
TDoubleStream sorted();
|
||||||
|
|
||||||
|
TDoubleStream peek(DoubleConsumer action);
|
||||||
|
|
||||||
|
TDoubleStream limit(long maxSize);
|
||||||
|
|
||||||
|
TDoubleStream skip(long n);
|
||||||
|
|
||||||
|
void forEach(DoubleConsumer action);
|
||||||
|
|
||||||
|
void forEachOrdered(DoubleConsumer action);
|
||||||
|
|
||||||
|
double[] toArray();
|
||||||
|
|
||||||
|
double reduce(double identity, DoubleBinaryOperator accumulator);
|
||||||
|
|
||||||
|
OptionalDouble reduce(DoubleBinaryOperator op);
|
||||||
|
|
||||||
|
<R> R collect(Supplier<R> supplier, ObjDoubleConsumer<R> accumulator, BiConsumer<R, R> combiner);
|
||||||
|
|
||||||
|
double sum();
|
||||||
|
|
||||||
|
OptionalDouble min();
|
||||||
|
|
||||||
|
OptionalDouble max();
|
||||||
|
|
||||||
|
long count();
|
||||||
|
|
||||||
|
OptionalDouble average();
|
||||||
|
|
||||||
|
boolean anyMatch(DoublePredicate predicate);
|
||||||
|
|
||||||
|
boolean allMatch(DoublePredicate predicate);
|
||||||
|
|
||||||
|
boolean noneMatch(DoublePredicate predicate);
|
||||||
|
|
||||||
|
OptionalDouble findFirst();
|
||||||
|
|
||||||
|
OptionalDouble findAny();
|
||||||
|
|
||||||
|
TStream<Double> boxed();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
PrimitiveIterator.OfDouble iterator();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
Spliterator.OfDouble spliterator();
|
||||||
|
|
||||||
|
static TDoubleStream.Builder builder() {
|
||||||
|
return new TDoubleStreamBuilder();
|
||||||
|
}
|
||||||
|
|
||||||
|
static TDoubleStream empty() {
|
||||||
|
return new TEmptyDoubleStreamImpl();
|
||||||
|
}
|
||||||
|
|
||||||
|
static TDoubleStream of(double t) {
|
||||||
|
return new TSingleDoubleStreamImpl(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
static TDoubleStream of(double... values) {
|
||||||
|
return new TArrayDoubleStreamImpl(values, 0, values.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
static TDoubleStream iterate(double seed, DoubleUnaryOperator f) {
|
||||||
|
return new TIterateDoubleStream(seed, f);
|
||||||
|
}
|
||||||
|
|
||||||
|
static TDoubleStream generate(DoubleSupplier s) {
|
||||||
|
return new TGenerateDoubleStream(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
static TDoubleStream concat(TDoubleStream a, TDoubleStream b) {
|
||||||
|
if (a instanceof TSimpleDoubleStreamImpl && b instanceof TSimpleDoubleStreamImpl) {
|
||||||
|
return new TSpecializedConcatDoubleStream((TSimpleDoubleStreamImpl) a, (TSimpleDoubleStreamImpl) b);
|
||||||
|
} else {
|
||||||
|
return new TGenericConcatDoubleStream(a, b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,161 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream;
|
||||||
|
|
||||||
|
import java.util.OptionalDouble;
|
||||||
|
import java.util.OptionalInt;
|
||||||
|
import java.util.PrimitiveIterator;
|
||||||
|
import java.util.Spliterator;
|
||||||
|
import java.util.function.BiConsumer;
|
||||||
|
import java.util.function.IntBinaryOperator;
|
||||||
|
import java.util.function.IntConsumer;
|
||||||
|
import java.util.function.IntFunction;
|
||||||
|
import java.util.function.IntPredicate;
|
||||||
|
import java.util.function.IntSupplier;
|
||||||
|
import java.util.function.IntToDoubleFunction;
|
||||||
|
import java.util.function.IntToLongFunction;
|
||||||
|
import java.util.function.IntUnaryOperator;
|
||||||
|
import java.util.function.ObjIntConsumer;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
import org.teavm.classlib.java.util.stream.intimpl.TArrayIntStreamImpl;
|
||||||
|
import org.teavm.classlib.java.util.stream.intimpl.TEmptyIntStreamImpl;
|
||||||
|
import org.teavm.classlib.java.util.stream.intimpl.TGenerateIntStream;
|
||||||
|
import org.teavm.classlib.java.util.stream.intimpl.TGenericConcatIntStream;
|
||||||
|
import org.teavm.classlib.java.util.stream.intimpl.TIntStreamBuilder;
|
||||||
|
import org.teavm.classlib.java.util.stream.intimpl.TIterateIntStream;
|
||||||
|
import org.teavm.classlib.java.util.stream.intimpl.TRangeIntStream;
|
||||||
|
import org.teavm.classlib.java.util.stream.intimpl.TSimpleIntStreamImpl;
|
||||||
|
import org.teavm.classlib.java.util.stream.intimpl.TSingleIntStreamImpl;
|
||||||
|
import org.teavm.classlib.java.util.stream.intimpl.TSpecializedConcatIntStream;
|
||||||
|
|
||||||
|
public interface TIntStream extends TBaseStream<Integer, TIntStream> {
|
||||||
|
interface Builder {
|
||||||
|
void accept(int t);
|
||||||
|
|
||||||
|
default Builder add(int t) {
|
||||||
|
accept(t);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
TIntStream build();
|
||||||
|
}
|
||||||
|
|
||||||
|
TIntStream filter(IntPredicate predicate);
|
||||||
|
|
||||||
|
TIntStream map(IntUnaryOperator mapper);
|
||||||
|
|
||||||
|
<U> TStream<U> mapToObj(IntFunction<? extends U> mapper);
|
||||||
|
|
||||||
|
TLongStream mapToLong(IntToLongFunction mapper);
|
||||||
|
|
||||||
|
TDoubleStream mapToDouble(IntToDoubleFunction mapper);
|
||||||
|
|
||||||
|
TIntStream flatMap(IntFunction<? extends TIntStream> mapper);
|
||||||
|
|
||||||
|
TIntStream distinct();
|
||||||
|
|
||||||
|
TIntStream sorted();
|
||||||
|
|
||||||
|
TIntStream peek(IntConsumer action);
|
||||||
|
|
||||||
|
TIntStream limit(long maxSize);
|
||||||
|
|
||||||
|
TIntStream skip(long n);
|
||||||
|
|
||||||
|
void forEach(IntConsumer action);
|
||||||
|
|
||||||
|
void forEachOrdered(IntConsumer action);
|
||||||
|
|
||||||
|
int[] toArray();
|
||||||
|
|
||||||
|
int reduce(int identity, IntBinaryOperator accumulator);
|
||||||
|
|
||||||
|
OptionalInt reduce(IntBinaryOperator op);
|
||||||
|
|
||||||
|
<R> R collect(Supplier<R> supplier, ObjIntConsumer<R> accumulator, BiConsumer<R, R> combiner);
|
||||||
|
|
||||||
|
int sum();
|
||||||
|
|
||||||
|
OptionalInt min();
|
||||||
|
|
||||||
|
OptionalInt max();
|
||||||
|
|
||||||
|
long count();
|
||||||
|
|
||||||
|
OptionalDouble average();
|
||||||
|
|
||||||
|
boolean anyMatch(IntPredicate predicate);
|
||||||
|
|
||||||
|
boolean allMatch(IntPredicate predicate);
|
||||||
|
|
||||||
|
boolean noneMatch(IntPredicate predicate);
|
||||||
|
|
||||||
|
OptionalInt findFirst();
|
||||||
|
|
||||||
|
OptionalInt findAny();
|
||||||
|
|
||||||
|
TLongStream asLongStream();
|
||||||
|
|
||||||
|
TDoubleStream asDoubleStream();
|
||||||
|
|
||||||
|
TStream<Integer> boxed();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
PrimitiveIterator.OfInt iterator();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
Spliterator.OfInt spliterator();
|
||||||
|
|
||||||
|
static Builder builder() {
|
||||||
|
return new TIntStreamBuilder();
|
||||||
|
}
|
||||||
|
|
||||||
|
static TIntStream empty() {
|
||||||
|
return new TEmptyIntStreamImpl();
|
||||||
|
}
|
||||||
|
|
||||||
|
static TIntStream of(int t) {
|
||||||
|
return new TSingleIntStreamImpl(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
static TIntStream of(int... values) {
|
||||||
|
return new TArrayIntStreamImpl(values, 0, values.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
static TIntStream iterate(int seed, IntUnaryOperator f) {
|
||||||
|
return new TIterateIntStream(seed, f);
|
||||||
|
}
|
||||||
|
|
||||||
|
static TIntStream generate(IntSupplier s) {
|
||||||
|
return new TGenerateIntStream(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
static TIntStream range(int startInclusive, int endExclusive) {
|
||||||
|
return new TRangeIntStream(startInclusive, endExclusive);
|
||||||
|
}
|
||||||
|
|
||||||
|
static TIntStream rangeClosed(int startInclusive, int endInclusive) {
|
||||||
|
return new TRangeIntStream(startInclusive, endInclusive + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static TIntStream concat(TIntStream a, TIntStream b) {
|
||||||
|
if (a instanceof TSimpleIntStreamImpl && b instanceof TSimpleIntStreamImpl) {
|
||||||
|
return new TSpecializedConcatIntStream((TSimpleIntStreamImpl) a, (TSimpleIntStreamImpl) b);
|
||||||
|
} else {
|
||||||
|
return new TGenericConcatIntStream(a, b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,159 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream;
|
||||||
|
|
||||||
|
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.LongSupplier;
|
||||||
|
import java.util.function.LongToDoubleFunction;
|
||||||
|
import java.util.function.LongToIntFunction;
|
||||||
|
import java.util.function.LongUnaryOperator;
|
||||||
|
import java.util.function.ObjLongConsumer;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
import org.teavm.classlib.java.util.stream.longimpl.TArrayLongStreamImpl;
|
||||||
|
import org.teavm.classlib.java.util.stream.longimpl.TEmptyLongStreamImpl;
|
||||||
|
import org.teavm.classlib.java.util.stream.longimpl.TGenerateLongStream;
|
||||||
|
import org.teavm.classlib.java.util.stream.longimpl.TGenericConcatLongStream;
|
||||||
|
import org.teavm.classlib.java.util.stream.longimpl.TIterateLongStream;
|
||||||
|
import org.teavm.classlib.java.util.stream.longimpl.TLongStreamBuilder;
|
||||||
|
import org.teavm.classlib.java.util.stream.longimpl.TRangeLongStream;
|
||||||
|
import org.teavm.classlib.java.util.stream.longimpl.TSimpleLongStreamImpl;
|
||||||
|
import org.teavm.classlib.java.util.stream.longimpl.TSingleLongStreamImpl;
|
||||||
|
import org.teavm.classlib.java.util.stream.longimpl.TSpecializedConcatLongStream;
|
||||||
|
|
||||||
|
public interface TLongStream extends TBaseStream<Long, TLongStream> {
|
||||||
|
interface Builder {
|
||||||
|
void accept(long t);
|
||||||
|
|
||||||
|
default Builder add(long t) {
|
||||||
|
accept(t);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
TLongStream build();
|
||||||
|
}
|
||||||
|
|
||||||
|
TLongStream filter(LongPredicate predicate);
|
||||||
|
|
||||||
|
TLongStream map(LongUnaryOperator mapper);
|
||||||
|
|
||||||
|
<U> TStream<U> mapToObj(LongFunction<? extends U> mapper);
|
||||||
|
|
||||||
|
TIntStream mapToInt(LongToIntFunction mapper);
|
||||||
|
|
||||||
|
TDoubleStream mapToDouble(LongToDoubleFunction mapper);
|
||||||
|
|
||||||
|
TLongStream flatMap(LongFunction<? extends TLongStream> mapper);
|
||||||
|
|
||||||
|
TLongStream distinct();
|
||||||
|
|
||||||
|
TLongStream sorted();
|
||||||
|
|
||||||
|
TLongStream peek(LongConsumer action);
|
||||||
|
|
||||||
|
TLongStream limit(long maxSize);
|
||||||
|
|
||||||
|
TLongStream skip(long n);
|
||||||
|
|
||||||
|
void forEach(LongConsumer action);
|
||||||
|
|
||||||
|
void forEachOrdered(LongConsumer action);
|
||||||
|
|
||||||
|
long[] toArray();
|
||||||
|
|
||||||
|
long reduce(long identity, LongBinaryOperator accumulator);
|
||||||
|
|
||||||
|
OptionalLong reduce(LongBinaryOperator op);
|
||||||
|
|
||||||
|
<R> R collect(Supplier<R> supplier, ObjLongConsumer<R> accumulator, BiConsumer<R, R> combiner);
|
||||||
|
|
||||||
|
long sum();
|
||||||
|
|
||||||
|
OptionalLong min();
|
||||||
|
|
||||||
|
OptionalLong max();
|
||||||
|
|
||||||
|
long count();
|
||||||
|
|
||||||
|
OptionalDouble average();
|
||||||
|
|
||||||
|
boolean anyMatch(LongPredicate predicate);
|
||||||
|
|
||||||
|
boolean allMatch(LongPredicate predicate);
|
||||||
|
|
||||||
|
boolean noneMatch(LongPredicate predicate);
|
||||||
|
|
||||||
|
OptionalLong findFirst();
|
||||||
|
|
||||||
|
OptionalLong findAny();
|
||||||
|
|
||||||
|
TDoubleStream asDoubleStream();
|
||||||
|
|
||||||
|
TStream<Long> boxed();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
PrimitiveIterator.OfLong iterator();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
Spliterator.OfLong spliterator();
|
||||||
|
|
||||||
|
static Builder builder() {
|
||||||
|
return new TLongStreamBuilder();
|
||||||
|
}
|
||||||
|
|
||||||
|
static TLongStream empty() {
|
||||||
|
return new TEmptyLongStreamImpl();
|
||||||
|
}
|
||||||
|
|
||||||
|
static TLongStream of(long t) {
|
||||||
|
return new TSingleLongStreamImpl(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
static TLongStream of(long... values) {
|
||||||
|
return new TArrayLongStreamImpl(values, 0, values.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
static TLongStream iterate(long seed, LongUnaryOperator f) {
|
||||||
|
return new TIterateLongStream(seed, f);
|
||||||
|
}
|
||||||
|
|
||||||
|
static TLongStream generate(LongSupplier s) {
|
||||||
|
return new TGenerateLongStream(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
static TLongStream range(long startInclusive, long endExclusive) {
|
||||||
|
return new TRangeLongStream(startInclusive, endExclusive);
|
||||||
|
}
|
||||||
|
|
||||||
|
static TLongStream rangeClosed(long startInclusive, long endInclusive) {
|
||||||
|
return new TRangeLongStream(startInclusive, endInclusive + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static TLongStream concat(TLongStream a, TLongStream b) {
|
||||||
|
if (a instanceof TSimpleLongStreamImpl && b instanceof TSimpleLongStreamImpl) {
|
||||||
|
return new TSpecializedConcatLongStream((TSimpleLongStreamImpl) a, (TSimpleLongStreamImpl) b);
|
||||||
|
} else {
|
||||||
|
return new TGenericConcatLongStream(a, b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,151 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream;
|
||||||
|
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.function.BiConsumer;
|
||||||
|
import java.util.function.BiFunction;
|
||||||
|
import java.util.function.BinaryOperator;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
import java.util.function.Function;
|
||||||
|
import java.util.function.IntFunction;
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
import java.util.function.ToDoubleFunction;
|
||||||
|
import java.util.function.ToIntFunction;
|
||||||
|
import java.util.function.ToLongFunction;
|
||||||
|
import java.util.function.UnaryOperator;
|
||||||
|
import org.teavm.classlib.java.util.stream.impl.TArrayStreamImpl;
|
||||||
|
import org.teavm.classlib.java.util.stream.impl.TEmptyStreamImpl;
|
||||||
|
import org.teavm.classlib.java.util.stream.impl.TGenerateStream;
|
||||||
|
import org.teavm.classlib.java.util.stream.impl.TGenericConcatStream;
|
||||||
|
import org.teavm.classlib.java.util.stream.impl.TIterateStream;
|
||||||
|
import org.teavm.classlib.java.util.stream.impl.TSimpleStreamImpl;
|
||||||
|
import org.teavm.classlib.java.util.stream.impl.TSingleStreamImpl;
|
||||||
|
import org.teavm.classlib.java.util.stream.impl.TSpecializedConcatStream;
|
||||||
|
import org.teavm.classlib.java.util.stream.impl.TStreamBuilder;
|
||||||
|
|
||||||
|
public interface TStream<T> extends TBaseStream<T, TStream<T>> {
|
||||||
|
interface Builder<T> {
|
||||||
|
void accept(T t);
|
||||||
|
|
||||||
|
default Builder<T> add(T t) {
|
||||||
|
accept(t);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
TStream<T> build();
|
||||||
|
}
|
||||||
|
|
||||||
|
TStream<T> filter(Predicate<? super T> predicate);
|
||||||
|
|
||||||
|
<R> TStream<R> map(Function<? super T, ? extends R> mapper);
|
||||||
|
|
||||||
|
TIntStream mapToInt(ToIntFunction<? super T> mapper);
|
||||||
|
|
||||||
|
TLongStream mapToLong(ToLongFunction<? super T> mapper);
|
||||||
|
|
||||||
|
TDoubleStream mapToDouble(ToDoubleFunction<? super T> mapper);
|
||||||
|
|
||||||
|
<R> TStream<R> flatMap(Function<? super T, ? extends TStream<? extends R>> mapper);
|
||||||
|
|
||||||
|
TIntStream flatMapToInt(Function<? super T, ? extends TIntStream> mapper);
|
||||||
|
|
||||||
|
TLongStream flatMapToLong(Function<? super T, ? extends TLongStream> mapper);
|
||||||
|
|
||||||
|
TDoubleStream flatMapToDouble(Function<? super T, ? extends TDoubleStream> mapper);
|
||||||
|
|
||||||
|
TStream<T> distinct();
|
||||||
|
|
||||||
|
TStream<T> sorted();
|
||||||
|
|
||||||
|
TStream<T> sorted(Comparator<? super T> comparator);
|
||||||
|
|
||||||
|
TStream<T> peek(Consumer<? super T> action);
|
||||||
|
|
||||||
|
TStream<T> limit(long maxSize);
|
||||||
|
|
||||||
|
TStream<T> skip(long n);
|
||||||
|
|
||||||
|
void forEach(Consumer<? super T> action);
|
||||||
|
|
||||||
|
void forEachOrdered(Consumer<? super T> action);
|
||||||
|
|
||||||
|
Object[] toArray();
|
||||||
|
|
||||||
|
<A> A[] toArray(IntFunction<A[]> generator);
|
||||||
|
|
||||||
|
T reduce(T identity, BinaryOperator<T> accumulator);
|
||||||
|
|
||||||
|
Optional<T> reduce(BinaryOperator<T> accumulator);
|
||||||
|
|
||||||
|
<U> U reduce(U identity, BiFunction<U, ? super T, U> accumulator, BinaryOperator<U> combiner);
|
||||||
|
|
||||||
|
<R> R collect(Supplier<R> supplier, BiConsumer<R, ? super T> accumulator, BiConsumer<R, R> combiner);
|
||||||
|
|
||||||
|
<R, A> R collect(TCollector<? super T, A, R> collector);
|
||||||
|
|
||||||
|
Optional<T> min(Comparator<? super T> comparator);
|
||||||
|
|
||||||
|
Optional<T> max(Comparator<? super T> comparator);
|
||||||
|
|
||||||
|
long count();
|
||||||
|
|
||||||
|
boolean anyMatch(Predicate<? super T> predicate);
|
||||||
|
|
||||||
|
boolean allMatch(Predicate<? super T> predicate);
|
||||||
|
|
||||||
|
boolean noneMatch(Predicate<? super T> predicate);
|
||||||
|
|
||||||
|
Optional<T> findFirst();
|
||||||
|
|
||||||
|
Optional<T> findAny();
|
||||||
|
|
||||||
|
static <T> TStream.Builder<T> builder() {
|
||||||
|
return new TStreamBuilder<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
static <T> TStream<T> empty() {
|
||||||
|
return new TEmptyStreamImpl<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
static <T> TStream<T> of(T t) {
|
||||||
|
return new TSingleStreamImpl<>(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SafeVarargs
|
||||||
|
static <T> TStream<T> of(T... values) {
|
||||||
|
return new TArrayStreamImpl<>(values, 0, values.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
static <T> TStream<T> iterate(T seed, UnaryOperator<T> f) {
|
||||||
|
return new TIterateStream<>(seed, f);
|
||||||
|
}
|
||||||
|
|
||||||
|
static <T> TStream<T> generate(Supplier<T> s) {
|
||||||
|
return new TGenerateStream<>(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
static <T> TStream<T> concat(TStream<? extends T> a, TStream<? extends T> b) {
|
||||||
|
if (a instanceof TSimpleStreamImpl && b instanceof TSimpleStreamImpl) {
|
||||||
|
return new TSpecializedConcatStream<>((TSimpleStreamImpl<T>) a, (TSimpleStreamImpl<T>) b);
|
||||||
|
} else {
|
||||||
|
return new TGenericConcatStream<>(a, b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream;
|
||||||
|
|
||||||
|
import java.util.Spliterator;
|
||||||
|
import org.teavm.classlib.java.util.stream.impl.TStreamOverSpliterator;
|
||||||
|
|
||||||
|
public final class TStreamSupport {
|
||||||
|
private TStreamSupport() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> TStream<T> stream(Spliterator<T> spliterator, boolean parallel) {
|
||||||
|
return new TStreamOverSpliterator<>(spliterator);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.doubleimpl;
|
||||||
|
|
||||||
|
import java.util.function.DoublePredicate;
|
||||||
|
|
||||||
|
public class TArrayDoubleStreamImpl extends TSimpleDoubleStreamImpl {
|
||||||
|
private double[] array;
|
||||||
|
private int index;
|
||||||
|
private int end;
|
||||||
|
private int size;
|
||||||
|
|
||||||
|
public TArrayDoubleStreamImpl(double[] array, int start, int end) {
|
||||||
|
this.array = array;
|
||||||
|
index = start;
|
||||||
|
this.end = end;
|
||||||
|
size = end - start;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean next(DoublePredicate consumer) {
|
||||||
|
while (index < end) {
|
||||||
|
if (!consumer.test(array[index++])) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return index < end;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int estimateSize() {
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long count() {
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,30 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.doubleimpl;
|
||||||
|
|
||||||
|
import java.util.function.DoublePredicate;
|
||||||
|
|
||||||
|
public class TAverageDoubleConsumer implements DoublePredicate {
|
||||||
|
double sum;
|
||||||
|
int count;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean test(double t) {
|
||||||
|
sum += t;
|
||||||
|
count++;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.doubleimpl;
|
||||||
|
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
import org.teavm.classlib.java.util.stream.impl.TSimpleStreamImpl;
|
||||||
|
|
||||||
|
public class TBoxedDoubleStream extends TSimpleStreamImpl<Double> {
|
||||||
|
private TSimpleDoubleStreamImpl source;
|
||||||
|
|
||||||
|
public TBoxedDoubleStream(TSimpleDoubleStreamImpl source) {
|
||||||
|
this.source = source;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean next(Predicate<? super Double> consumer) {
|
||||||
|
return source.next(consumer::test);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.doubleimpl;
|
||||||
|
|
||||||
|
import java.util.function.DoublePredicate;
|
||||||
|
|
||||||
|
public class TCloseHandlingDoubleStream extends TSimpleDoubleStreamImpl {
|
||||||
|
private TSimpleDoubleStreamImpl innerStream;
|
||||||
|
private Runnable closeHandler;
|
||||||
|
|
||||||
|
public TCloseHandlingDoubleStream(TSimpleDoubleStreamImpl innerStream, Runnable closeHandler) {
|
||||||
|
this.innerStream = innerStream;
|
||||||
|
this.closeHandler = closeHandler;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean next(DoublePredicate consumer) {
|
||||||
|
return innerStream.next(consumer);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws Exception {
|
||||||
|
RuntimeException previousException = null;
|
||||||
|
try {
|
||||||
|
closeHandler.run();
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
previousException = e;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
innerStream.close();
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
if (previousException != null) {
|
||||||
|
e.addSuppressed(previousException);
|
||||||
|
}
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.doubleimpl;
|
||||||
|
|
||||||
|
import java.util.function.DoublePredicate;
|
||||||
|
|
||||||
|
public class TCountingDoubleConsumer implements DoublePredicate {
|
||||||
|
int count;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean test(double t) {
|
||||||
|
count++;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.doubleimpl;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.function.DoublePredicate;
|
||||||
|
|
||||||
|
public class TDistinctDoubleStreamImpl extends TWrappingDoubleStreamImpl {
|
||||||
|
public TDistinctDoubleStreamImpl(TSimpleDoubleStreamImpl innerStream) {
|
||||||
|
super(innerStream);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected DoublePredicate wrap(DoublePredicate consumer) {
|
||||||
|
Set<Double> visited = new HashSet<>();
|
||||||
|
return e -> {
|
||||||
|
if (!visited.add(e)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return consumer.test(e);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.doubleimpl;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import org.teavm.classlib.java.util.stream.TDoubleStream;
|
||||||
|
|
||||||
|
public class TDoubleStreamBuilder implements TDoubleStream.Builder {
|
||||||
|
private double[] elements = new double[4];
|
||||||
|
private int size;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void accept(double t) {
|
||||||
|
if (size == elements.length) {
|
||||||
|
elements = Arrays.copyOf(elements, elements.length * 2);
|
||||||
|
}
|
||||||
|
elements[size++] = t;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TDoubleStream build() {
|
||||||
|
return new TArrayDoubleStreamImpl(elements, 0, size);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.doubleimpl;
|
||||||
|
|
||||||
|
import java.util.function.DoublePredicate;
|
||||||
|
|
||||||
|
public class TEmptyDoubleStreamImpl extends TSimpleDoubleStreamImpl {
|
||||||
|
@Override
|
||||||
|
public boolean next(DoublePredicate consumer) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int estimateSize() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long count() {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.doubleimpl;
|
||||||
|
|
||||||
|
import java.util.function.DoublePredicate;
|
||||||
|
|
||||||
|
public class TFilteringDoubleStreamImpl extends TWrappingDoubleStreamImpl {
|
||||||
|
private DoublePredicate filter;
|
||||||
|
|
||||||
|
public TFilteringDoubleStreamImpl(TSimpleDoubleStreamImpl innerStream, DoublePredicate filter) {
|
||||||
|
super(innerStream);
|
||||||
|
this.filter = filter;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected DoublePredicate wrap(DoublePredicate consumer) {
|
||||||
|
return t -> {
|
||||||
|
if (!filter.test(t)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return consumer.test(t);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,30 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.doubleimpl;
|
||||||
|
|
||||||
|
import java.util.function.DoublePredicate;
|
||||||
|
|
||||||
|
public class TFindFirstDoubleConsumer implements DoublePredicate {
|
||||||
|
public double result;
|
||||||
|
boolean hasAny;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean test(double t) {
|
||||||
|
hasAny = true;
|
||||||
|
result = t;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,82 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.doubleimpl;
|
||||||
|
|
||||||
|
import java.util.PrimitiveIterator;
|
||||||
|
import java.util.function.DoubleFunction;
|
||||||
|
import java.util.function.DoublePredicate;
|
||||||
|
import org.teavm.classlib.java.util.stream.TDoubleStream;
|
||||||
|
|
||||||
|
public class TFlatMappingDoubleStreamImpl extends TSimpleDoubleStreamImpl {
|
||||||
|
private TSimpleDoubleStreamImpl sourceStream;
|
||||||
|
private TDoubleStream current;
|
||||||
|
private PrimitiveIterator.OfDouble iterator;
|
||||||
|
private DoubleFunction<? extends TDoubleStream> mapper;
|
||||||
|
private boolean done;
|
||||||
|
|
||||||
|
public TFlatMappingDoubleStreamImpl(TSimpleDoubleStreamImpl sourceStream,
|
||||||
|
DoubleFunction<? extends TDoubleStream> mapper) {
|
||||||
|
this.sourceStream = sourceStream;
|
||||||
|
this.mapper = mapper;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean next(DoublePredicate consumer) {
|
||||||
|
while (true) {
|
||||||
|
if (current == null) {
|
||||||
|
if (done) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
boolean hasMore = sourceStream.next(e -> {
|
||||||
|
current = mapper.apply(e);
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
if (!hasMore) {
|
||||||
|
done = true;
|
||||||
|
}
|
||||||
|
if (current == null) {
|
||||||
|
done = true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (current instanceof TSimpleDoubleStreamImpl) {
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
TSimpleDoubleStreamImpl castCurrent = (TSimpleDoubleStreamImpl) current;
|
||||||
|
if (castCurrent.next(consumer)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
current = null;
|
||||||
|
} else {
|
||||||
|
iterator = current.iterator();
|
||||||
|
while (iterator.hasNext()) {
|
||||||
|
double e = iterator.nextDouble();
|
||||||
|
if (!consumer.test(e)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
iterator = null;
|
||||||
|
current = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws Exception {
|
||||||
|
current = null;
|
||||||
|
iterator = null;
|
||||||
|
sourceStream.close();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.doubleimpl;
|
||||||
|
|
||||||
|
import java.util.function.DoublePredicate;
|
||||||
|
import java.util.function.DoubleSupplier;
|
||||||
|
|
||||||
|
public class TGenerateDoubleStream extends TSimpleDoubleStreamImpl {
|
||||||
|
private DoubleSupplier s;
|
||||||
|
|
||||||
|
public TGenerateDoubleStream(DoubleSupplier s) {
|
||||||
|
this.s = s;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean next(DoublePredicate consumer) {
|
||||||
|
while (consumer.test(s.getAsDouble())) {
|
||||||
|
// go on
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,75 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.doubleimpl;
|
||||||
|
|
||||||
|
import java.util.PrimitiveIterator;
|
||||||
|
import java.util.function.DoublePredicate;
|
||||||
|
import org.teavm.classlib.java.util.stream.TDoubleStream;
|
||||||
|
|
||||||
|
public class TGenericConcatDoubleStream extends TSimpleDoubleStreamImpl {
|
||||||
|
TDoubleStream first;
|
||||||
|
TDoubleStream second;
|
||||||
|
PrimitiveIterator.OfDouble iterator;
|
||||||
|
boolean isSecond;
|
||||||
|
|
||||||
|
public TGenericConcatDoubleStream(TDoubleStream first, TDoubleStream second) {
|
||||||
|
this.first = first;
|
||||||
|
this.second = second;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean next(DoublePredicate consumer) {
|
||||||
|
if (iterator == null) {
|
||||||
|
iterator = first.iterator();
|
||||||
|
}
|
||||||
|
while (true) {
|
||||||
|
while (iterator.hasNext()) {
|
||||||
|
if (!consumer.test(iterator.nextDouble())) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!isSecond) {
|
||||||
|
isSecond = true;
|
||||||
|
iterator = second.iterator();
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long count() {
|
||||||
|
return first.count() + second.count();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws Exception {
|
||||||
|
Exception suppressed = null;
|
||||||
|
try {
|
||||||
|
first.close();
|
||||||
|
} catch (Exception e) {
|
||||||
|
suppressed = e;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
second.close();
|
||||||
|
} catch (Exception e) {
|
||||||
|
if (suppressed != null) {
|
||||||
|
e.addSuppressed(suppressed);
|
||||||
|
}
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.doubleimpl;
|
||||||
|
|
||||||
|
import java.util.function.DoublePredicate;
|
||||||
|
import java.util.function.DoubleUnaryOperator;
|
||||||
|
|
||||||
|
public class TIterateDoubleStream extends TSimpleDoubleStreamImpl {
|
||||||
|
private double value;
|
||||||
|
private DoubleUnaryOperator f;
|
||||||
|
|
||||||
|
public TIterateDoubleStream(double value, DoubleUnaryOperator f) {
|
||||||
|
this.value = value;
|
||||||
|
this.f = f;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean next(DoublePredicate consumer) {
|
||||||
|
while (true) {
|
||||||
|
double valueToReport = value;
|
||||||
|
value = f.applyAsDouble(value);
|
||||||
|
if (!consumer.test(valueToReport)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,58 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.doubleimpl;
|
||||||
|
|
||||||
|
import java.util.function.DoublePredicate;
|
||||||
|
|
||||||
|
public class TLimitingDoubleStreamImpl extends TSimpleDoubleStreamImpl {
|
||||||
|
private TSimpleDoubleStreamImpl sourceStream;
|
||||||
|
private int limit;
|
||||||
|
private int remaining;
|
||||||
|
|
||||||
|
public TLimitingDoubleStreamImpl(TSimpleDoubleStreamImpl sourceStream, int limit) {
|
||||||
|
this.sourceStream = sourceStream;
|
||||||
|
this.limit = limit;
|
||||||
|
remaining = limit;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean next(DoublePredicate consumer) {
|
||||||
|
if (remaining == 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
boolean result = sourceStream.next(e -> {
|
||||||
|
if (remaining-- == 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return consumer.test(e);
|
||||||
|
});
|
||||||
|
if (!result) {
|
||||||
|
remaining = 0;
|
||||||
|
}
|
||||||
|
return remaining > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int estimateSize() {
|
||||||
|
int sourceEstimation = sourceStream.estimateSize();
|
||||||
|
return sourceEstimation < 0 ? limit : Math.min(limit, sourceEstimation);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws Exception {
|
||||||
|
sourceStream.close();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.doubleimpl;
|
||||||
|
|
||||||
|
import java.util.function.DoublePredicate;
|
||||||
|
import java.util.function.DoubleUnaryOperator;
|
||||||
|
|
||||||
|
public class TMappingDoubleStreamImpl extends TWrappingDoubleStreamImpl {
|
||||||
|
private DoubleUnaryOperator mapper;
|
||||||
|
|
||||||
|
public TMappingDoubleStreamImpl(TSimpleDoubleStreamImpl sourceStream, DoubleUnaryOperator mapper) {
|
||||||
|
super(sourceStream);
|
||||||
|
this.mapper = mapper;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected DoublePredicate wrap(DoublePredicate consumer) {
|
||||||
|
return t -> consumer.test(mapper.applyAsDouble(t));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long count() {
|
||||||
|
return sourceStream.count();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,50 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.doubleimpl;
|
||||||
|
|
||||||
|
import java.util.function.DoubleToIntFunction;
|
||||||
|
import java.util.function.IntPredicate;
|
||||||
|
import org.teavm.classlib.java.util.stream.intimpl.TSimpleIntStreamImpl;
|
||||||
|
|
||||||
|
public class TMappingToIntStreamImpl extends TSimpleIntStreamImpl {
|
||||||
|
private TSimpleDoubleStreamImpl source;
|
||||||
|
private DoubleToIntFunction mapper;
|
||||||
|
|
||||||
|
public TMappingToIntStreamImpl(TSimpleDoubleStreamImpl source, DoubleToIntFunction mapper) {
|
||||||
|
this.source = source;
|
||||||
|
this.mapper = mapper;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean next(IntPredicate consumer) {
|
||||||
|
return source.next(e -> consumer.test(mapper.applyAsInt(e)));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws Exception {
|
||||||
|
source.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int estimateSize() {
|
||||||
|
return source.estimateSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long count() {
|
||||||
|
return source.count();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,50 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.doubleimpl;
|
||||||
|
|
||||||
|
import java.util.function.DoubleToLongFunction;
|
||||||
|
import java.util.function.LongPredicate;
|
||||||
|
import org.teavm.classlib.java.util.stream.longimpl.TSimpleLongStreamImpl;
|
||||||
|
|
||||||
|
public class TMappingToLongStreamImpl extends TSimpleLongStreamImpl {
|
||||||
|
private TSimpleDoubleStreamImpl source;
|
||||||
|
private DoubleToLongFunction mapper;
|
||||||
|
|
||||||
|
public TMappingToLongStreamImpl(TSimpleDoubleStreamImpl source, DoubleToLongFunction mapper) {
|
||||||
|
this.source = source;
|
||||||
|
this.mapper = mapper;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean next(LongPredicate consumer) {
|
||||||
|
return source.next(e -> consumer.test(mapper.applyAsLong(e)));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws Exception {
|
||||||
|
source.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int estimateSize() {
|
||||||
|
return source.estimateSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long count() {
|
||||||
|
return source.count();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,50 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.doubleimpl;
|
||||||
|
|
||||||
|
import java.util.function.DoubleFunction;
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
import org.teavm.classlib.java.util.stream.impl.TSimpleStreamImpl;
|
||||||
|
|
||||||
|
public class TMappingToObjStreamImpl<T> extends TSimpleStreamImpl<T> {
|
||||||
|
private TSimpleDoubleStreamImpl source;
|
||||||
|
private DoubleFunction<? extends T> mapper;
|
||||||
|
|
||||||
|
public TMappingToObjStreamImpl(TSimpleDoubleStreamImpl source, DoubleFunction<? extends T> mapper) {
|
||||||
|
this.source = source;
|
||||||
|
this.mapper = mapper;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean next(Predicate<? super T> consumer) {
|
||||||
|
return source.next(e -> consumer.test(mapper.apply(e)));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws Exception {
|
||||||
|
source.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int estimateSize() {
|
||||||
|
return source.estimateSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long count() {
|
||||||
|
return source.count();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,36 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.doubleimpl;
|
||||||
|
|
||||||
|
import java.util.function.DoubleConsumer;
|
||||||
|
import java.util.function.DoublePredicate;
|
||||||
|
|
||||||
|
public class TPeekingDoubleStreamImpl extends TWrappingDoubleStreamImpl {
|
||||||
|
private DoubleConsumer elementConsumer;
|
||||||
|
|
||||||
|
public TPeekingDoubleStreamImpl(TSimpleDoubleStreamImpl sourceStream, DoubleConsumer elementConsumer) {
|
||||||
|
super(sourceStream);
|
||||||
|
this.elementConsumer = elementConsumer;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected DoublePredicate wrap(DoublePredicate consumer) {
|
||||||
|
return e -> {
|
||||||
|
elementConsumer.accept(e);
|
||||||
|
return consumer.test(e);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,42 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.doubleimpl;
|
||||||
|
|
||||||
|
import java.util.function.DoubleBinaryOperator;
|
||||||
|
import java.util.function.DoublePredicate;
|
||||||
|
|
||||||
|
class TReducingDoubleConsumer implements DoublePredicate {
|
||||||
|
private DoubleBinaryOperator accumulator;
|
||||||
|
double result;
|
||||||
|
boolean initialized;
|
||||||
|
|
||||||
|
TReducingDoubleConsumer(DoubleBinaryOperator accumulator, double result, boolean initialized) {
|
||||||
|
this.accumulator = accumulator;
|
||||||
|
this.result = result;
|
||||||
|
this.initialized = initialized;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean test(double t) {
|
||||||
|
if (!initialized) {
|
||||||
|
result = t;
|
||||||
|
initialized = true;
|
||||||
|
} else {
|
||||||
|
result = accumulator.applyAsDouble(result, t);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,281 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.doubleimpl;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.OptionalDouble;
|
||||||
|
import java.util.PrimitiveIterator;
|
||||||
|
import java.util.Spliterator;
|
||||||
|
import java.util.function.BiConsumer;
|
||||||
|
import java.util.function.DoubleBinaryOperator;
|
||||||
|
import java.util.function.DoubleConsumer;
|
||||||
|
import java.util.function.DoubleFunction;
|
||||||
|
import java.util.function.DoublePredicate;
|
||||||
|
import java.util.function.DoubleToIntFunction;
|
||||||
|
import java.util.function.DoubleToLongFunction;
|
||||||
|
import java.util.function.DoubleUnaryOperator;
|
||||||
|
import java.util.function.ObjDoubleConsumer;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
import org.teavm.classlib.java.util.stream.TDoubleStream;
|
||||||
|
import org.teavm.classlib.java.util.stream.TIntStream;
|
||||||
|
import org.teavm.classlib.java.util.stream.TLongStream;
|
||||||
|
import org.teavm.classlib.java.util.stream.TStream;
|
||||||
|
|
||||||
|
public abstract class TSimpleDoubleStreamImpl implements TDoubleStream {
|
||||||
|
@Override
|
||||||
|
public TDoubleStream filter(DoublePredicate predicate) {
|
||||||
|
return new TFilteringDoubleStreamImpl(this, predicate);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TDoubleStream map(DoubleUnaryOperator mapper) {
|
||||||
|
return new TMappingDoubleStreamImpl(this, mapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <U> TStream<U> mapToObj(DoubleFunction<? extends U> mapper) {
|
||||||
|
return new TMappingToObjStreamImpl<>(this, mapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TIntStream mapToInt(DoubleToIntFunction mapper) {
|
||||||
|
return new TMappingToIntStreamImpl(this, mapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TLongStream mapToLong(DoubleToLongFunction mapper) {
|
||||||
|
return new TMappingToLongStreamImpl(this, mapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TDoubleStream flatMap(DoubleFunction<? extends TDoubleStream> mapper) {
|
||||||
|
return new TFlatMappingDoubleStreamImpl(this, mapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TDoubleStream distinct() {
|
||||||
|
return new TDistinctDoubleStreamImpl(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TDoubleStream sorted() {
|
||||||
|
double[] array = toArray();
|
||||||
|
Arrays.sort(array);
|
||||||
|
return TDoubleStream.of(array);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TDoubleStream peek(DoubleConsumer action) {
|
||||||
|
return new TPeekingDoubleStreamImpl(this, action);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TDoubleStream limit(long maxSize) {
|
||||||
|
return new TLimitingDoubleStreamImpl(this, (int) maxSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TDoubleStream skip(long n) {
|
||||||
|
return new TSkippingDoubleStreamImpl(this, (int) n);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void forEach(DoubleConsumer action) {
|
||||||
|
forEachOrdered(action);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void forEachOrdered(DoubleConsumer action) {
|
||||||
|
next(e -> {
|
||||||
|
action.accept(e);
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double[] toArray() {
|
||||||
|
int estimatedSize = estimateSize();
|
||||||
|
if (estimatedSize < 0) {
|
||||||
|
List<Double> list = new ArrayList<>();
|
||||||
|
next(list::add);
|
||||||
|
double[] array = new double[list.size()];
|
||||||
|
for (int i = 0; i < array.length; ++i) {
|
||||||
|
array[i] = list.get(i);
|
||||||
|
}
|
||||||
|
return array;
|
||||||
|
} else {
|
||||||
|
double[] array = new double[estimatedSize];
|
||||||
|
ArrayFillingConsumer consumer = new ArrayFillingConsumer(array);
|
||||||
|
boolean wantsMore = next(consumer);
|
||||||
|
assert !wantsMore : "next() should have reported done status";
|
||||||
|
if (consumer.index < array.length) {
|
||||||
|
array = Arrays.copyOf(array, consumer.index);
|
||||||
|
}
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double reduce(double identity, DoubleBinaryOperator accumulator) {
|
||||||
|
TReducingDoubleConsumer consumer = new TReducingDoubleConsumer(accumulator, identity, true);
|
||||||
|
boolean wantsMore = next(consumer);
|
||||||
|
assert !wantsMore : "next() should have returned true";
|
||||||
|
return consumer.result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public OptionalDouble reduce(DoubleBinaryOperator accumulator) {
|
||||||
|
TReducingDoubleConsumer consumer = new TReducingDoubleConsumer(accumulator, 0, false);
|
||||||
|
boolean wantsMore = next(consumer);
|
||||||
|
assert !wantsMore : "next() should have returned true";
|
||||||
|
return consumer.initialized ? OptionalDouble.of(consumer.result) : OptionalDouble.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <R> R collect(Supplier<R> supplier, ObjDoubleConsumer<R> accumulator, BiConsumer<R, R> combiner) {
|
||||||
|
R collection = supplier.get();
|
||||||
|
next(e -> {
|
||||||
|
accumulator.accept(collection, e);
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
return collection;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public OptionalDouble min() {
|
||||||
|
return reduce(Math::min);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public OptionalDouble max() {
|
||||||
|
return reduce(Math::max);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long count() {
|
||||||
|
TCountingDoubleConsumer consumer = new TCountingDoubleConsumer();
|
||||||
|
next(consumer);
|
||||||
|
return consumer.count;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double sum() {
|
||||||
|
TSumDoubleConsumer consumer = new TSumDoubleConsumer();
|
||||||
|
next(consumer);
|
||||||
|
return consumer.sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public OptionalDouble average() {
|
||||||
|
TAverageDoubleConsumer consumer = new TAverageDoubleConsumer();
|
||||||
|
next(consumer);
|
||||||
|
return consumer.count > 0 ? OptionalDouble.of(consumer.sum / consumer.count) : OptionalDouble.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean anyMatch(DoublePredicate predicate) {
|
||||||
|
return next(predicate.negate());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean allMatch(DoublePredicate predicate) {
|
||||||
|
return !next(predicate);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean noneMatch(DoublePredicate predicate) {
|
||||||
|
return !anyMatch(predicate);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public OptionalDouble findFirst() {
|
||||||
|
TFindFirstDoubleConsumer consumer = new TFindFirstDoubleConsumer();
|
||||||
|
next(consumer);
|
||||||
|
return consumer.hasAny ? OptionalDouble.of(consumer.result) : OptionalDouble.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public OptionalDouble findAny() {
|
||||||
|
return findFirst();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PrimitiveIterator.OfDouble iterator() {
|
||||||
|
return new TSimpleDoubleStreamIterator(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Spliterator.OfDouble spliterator() {
|
||||||
|
return new TSimpleDoubleStreamSpliterator(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TStream<Double> boxed() {
|
||||||
|
return new TBoxedDoubleStream(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isParallel() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TDoubleStream sequential() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TDoubleStream parallel() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TDoubleStream unordered() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TDoubleStream onClose(Runnable closeHandler) {
|
||||||
|
return new TCloseHandlingDoubleStream(this, closeHandler);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws Exception {
|
||||||
|
}
|
||||||
|
|
||||||
|
protected int estimateSize() {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract boolean next(DoublePredicate consumer);
|
||||||
|
|
||||||
|
class ArrayFillingConsumer implements DoublePredicate {
|
||||||
|
double[] array;
|
||||||
|
int index;
|
||||||
|
|
||||||
|
ArrayFillingConsumer(double[] array) {
|
||||||
|
this.array = array;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean test(double t) {
|
||||||
|
array[index++] = t;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,65 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.doubleimpl;
|
||||||
|
|
||||||
|
import java.util.NoSuchElementException;
|
||||||
|
import java.util.PrimitiveIterator;
|
||||||
|
|
||||||
|
public class TSimpleDoubleStreamIterator implements PrimitiveIterator.OfDouble {
|
||||||
|
private static final byte NEEDS_MORE = 0;
|
||||||
|
private static final byte HAS_DATA = 1;
|
||||||
|
private static final byte LAST_ELEMENT = 2;
|
||||||
|
private static final byte DONE = 3;
|
||||||
|
|
||||||
|
private TSimpleDoubleStreamImpl stream;
|
||||||
|
private double lastElement;
|
||||||
|
private byte state;
|
||||||
|
|
||||||
|
public TSimpleDoubleStreamIterator(TSimpleDoubleStreamImpl stream) {
|
||||||
|
this.stream = stream;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasNext() {
|
||||||
|
fetchIfNeeded();
|
||||||
|
return state != DONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double nextDouble() {
|
||||||
|
fetchIfNeeded();
|
||||||
|
if (state == DONE) {
|
||||||
|
throw new NoSuchElementException();
|
||||||
|
}
|
||||||
|
double result = lastElement;
|
||||||
|
state = state == LAST_ELEMENT ? DONE : NEEDS_MORE;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void fetchIfNeeded() {
|
||||||
|
if (state != NEEDS_MORE) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
boolean hasMore = stream.next(e -> {
|
||||||
|
lastElement = e;
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
state = hasMore ? HAS_DATA : LAST_ELEMENT;
|
||||||
|
if (state == LAST_ELEMENT) {
|
||||||
|
stream = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,63 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.doubleimpl;
|
||||||
|
|
||||||
|
import java.util.Spliterator;
|
||||||
|
import java.util.function.DoubleConsumer;
|
||||||
|
|
||||||
|
public class TSimpleDoubleStreamSpliterator implements Spliterator.OfDouble {
|
||||||
|
private TSimpleDoubleStreamImpl stream;
|
||||||
|
private boolean done;
|
||||||
|
|
||||||
|
public TSimpleDoubleStreamSpliterator(TSimpleDoubleStreamImpl stream) {
|
||||||
|
this.stream = stream;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void forEachRemaining(DoubleConsumer action) {
|
||||||
|
stream.next(x -> {
|
||||||
|
action.accept(x);
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean tryAdvance(DoubleConsumer action) {
|
||||||
|
if (done) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
done = !stream.next(x -> {
|
||||||
|
action.accept(x);
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public OfDouble trySplit() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long estimateSize() {
|
||||||
|
return stream.estimateSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int characteristics() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,42 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.doubleimpl;
|
||||||
|
|
||||||
|
import java.util.function.DoublePredicate;
|
||||||
|
|
||||||
|
public class TSingleDoubleStreamImpl extends TSimpleDoubleStreamImpl {
|
||||||
|
private double element;
|
||||||
|
|
||||||
|
public TSingleDoubleStreamImpl(double element) {
|
||||||
|
this.element = element;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean next(DoublePredicate consumer) {
|
||||||
|
consumer.test(element);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int estimateSize() {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long count() {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,51 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.doubleimpl;
|
||||||
|
|
||||||
|
import java.util.function.DoublePredicate;
|
||||||
|
|
||||||
|
public class TSkippingDoubleStreamImpl extends TSimpleDoubleStreamImpl {
|
||||||
|
private TSimpleDoubleStreamImpl sourceStream;
|
||||||
|
private int skip;
|
||||||
|
private int remaining;
|
||||||
|
|
||||||
|
public TSkippingDoubleStreamImpl(TSimpleDoubleStreamImpl sourceStream, int skip) {
|
||||||
|
this.sourceStream = sourceStream;
|
||||||
|
this.skip = skip;
|
||||||
|
remaining = skip;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean next(DoublePredicate consumer) {
|
||||||
|
if (remaining > 0) {
|
||||||
|
if (!sourceStream.next(e -> --remaining > 0)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sourceStream.next(consumer);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int estimateSize() {
|
||||||
|
int sourceSize = sourceStream.estimateSize();
|
||||||
|
return sourceSize >= 0 ? Math.max(0, sourceSize - skip) : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws Exception {
|
||||||
|
sourceStream.close();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,78 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.doubleimpl;
|
||||||
|
|
||||||
|
import java.util.function.DoublePredicate;
|
||||||
|
|
||||||
|
public class TSpecializedConcatDoubleStream extends TSimpleDoubleStreamImpl {
|
||||||
|
TSimpleDoubleStreamImpl first;
|
||||||
|
TSimpleDoubleStreamImpl second;
|
||||||
|
TSimpleDoubleStreamImpl current;
|
||||||
|
|
||||||
|
public TSpecializedConcatDoubleStream(TSimpleDoubleStreamImpl first, TSimpleDoubleStreamImpl second) {
|
||||||
|
this.first = first;
|
||||||
|
this.second = second;
|
||||||
|
current = first;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean next(DoublePredicate consumer) {
|
||||||
|
if (current == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
while (true) {
|
||||||
|
if (current.next(consumer)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (current == first) {
|
||||||
|
current = second;
|
||||||
|
} else {
|
||||||
|
current = null;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int estimateSize() {
|
||||||
|
int firstSize = first.estimateSize();
|
||||||
|
int secondSize = second.estimateSize();
|
||||||
|
return firstSize >= 0 && secondSize >= 0 ? firstSize + secondSize : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long count() {
|
||||||
|
return first.count() + second.count();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws Exception {
|
||||||
|
RuntimeException suppressed = null;
|
||||||
|
try {
|
||||||
|
first.close();
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
suppressed = e;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
second.close();
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
if (suppressed != null) {
|
||||||
|
e.addSuppressed(suppressed);
|
||||||
|
}
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.doubleimpl;
|
||||||
|
|
||||||
|
import java.util.function.DoublePredicate;
|
||||||
|
|
||||||
|
public class TSumDoubleConsumer implements DoublePredicate {
|
||||||
|
double sum;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean test(double t) {
|
||||||
|
sum += t;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.doubleimpl;
|
||||||
|
|
||||||
|
import java.util.function.DoublePredicate;
|
||||||
|
|
||||||
|
public abstract class TWrappingDoubleStreamImpl extends TSimpleDoubleStreamImpl {
|
||||||
|
TSimpleDoubleStreamImpl sourceStream;
|
||||||
|
|
||||||
|
public TWrappingDoubleStreamImpl(TSimpleDoubleStreamImpl sourceStream) {
|
||||||
|
this.sourceStream = sourceStream;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean next(DoublePredicate consumer) {
|
||||||
|
return sourceStream.next(wrap(consumer));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract DoublePredicate wrap(DoublePredicate consumer);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int estimateSize() {
|
||||||
|
return sourceStream.estimateSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws Exception {
|
||||||
|
sourceStream.close();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.impl;
|
||||||
|
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
|
public class TArrayStreamImpl<T> extends TSimpleStreamImpl<T> {
|
||||||
|
private T[] array;
|
||||||
|
private int index;
|
||||||
|
private int end;
|
||||||
|
private int size;
|
||||||
|
|
||||||
|
public TArrayStreamImpl(T[] array, int start, int end) {
|
||||||
|
this.array = array;
|
||||||
|
index = start;
|
||||||
|
this.end = end;
|
||||||
|
size = end - start;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean next(Predicate<? super T> consumer) {
|
||||||
|
while (index < end) {
|
||||||
|
if (!consumer.test(array[index++])) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return index < end;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int estimateSize() {
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long count() {
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.impl;
|
||||||
|
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
|
public class TCloseHandlingStream<T> extends TSimpleStreamImpl<T> {
|
||||||
|
private TSimpleStreamImpl<T> innerStream;
|
||||||
|
private Runnable closeHandler;
|
||||||
|
|
||||||
|
public TCloseHandlingStream(TSimpleStreamImpl<T> innerStream, Runnable closeHandler) {
|
||||||
|
this.innerStream = innerStream;
|
||||||
|
this.closeHandler = closeHandler;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean next(Predicate<? super T> consumer) {
|
||||||
|
return innerStream.next(consumer);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws Exception {
|
||||||
|
RuntimeException previousException = null;
|
||||||
|
try {
|
||||||
|
closeHandler.run();
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
previousException = e;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
innerStream.close();
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
if (previousException != null) {
|
||||||
|
e.addSuppressed(previousException);
|
||||||
|
}
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.impl;
|
||||||
|
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
|
public class TCountingConsumer<T> implements Predicate<T> {
|
||||||
|
int count;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean test(T t) {
|
||||||
|
count++;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.impl;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
|
public class TDistinctStreamImpl<T> extends TWrappingStreamImpl<T, T> {
|
||||||
|
public TDistinctStreamImpl(TSimpleStreamImpl<T> innerStream) {
|
||||||
|
super(innerStream);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Predicate<T> wrap(Predicate<? super T> consumer) {
|
||||||
|
Set<T> visited = new HashSet<>();
|
||||||
|
return e -> {
|
||||||
|
if (!visited.add(e)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return consumer.test(e);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.impl;
|
||||||
|
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
|
public class TEmptyStreamImpl<T> extends TSimpleStreamImpl<T> {
|
||||||
|
@Override
|
||||||
|
public boolean next(Predicate<? super T> consumer) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int estimateSize() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long count() {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.impl;
|
||||||
|
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
|
public class TFilteringStreamImpl<T> extends TWrappingStreamImpl<T, T> {
|
||||||
|
private Predicate<? super T> filter;
|
||||||
|
|
||||||
|
public TFilteringStreamImpl(TSimpleStreamImpl<T> innerStream, Predicate<? super T> filter) {
|
||||||
|
super(innerStream);
|
||||||
|
this.filter = filter;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Predicate<T> wrap(Predicate<? super T> consumer) {
|
||||||
|
return t -> {
|
||||||
|
if (!filter.test(t)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return consumer.test(t);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.impl;
|
||||||
|
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
|
public class TFindFirstConsumer<T> implements Predicate<T> {
|
||||||
|
public T result;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean test(T t) {
|
||||||
|
result = t;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,82 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.impl;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.function.Function;
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
import org.teavm.classlib.java.util.stream.TStream;
|
||||||
|
|
||||||
|
public class TFlatMappingStreamImpl<T, S> extends TSimpleStreamImpl<T> {
|
||||||
|
private TSimpleStreamImpl<S> sourceStream;
|
||||||
|
private TStream<? extends T> current;
|
||||||
|
private Iterator<? extends T> iterator;
|
||||||
|
private Function<? super S, ? extends TStream<? extends T>> mapper;
|
||||||
|
private boolean done;
|
||||||
|
|
||||||
|
public TFlatMappingStreamImpl(TSimpleStreamImpl<S> sourceStream,
|
||||||
|
Function<? super S, ? extends TStream<? extends T>> mapper) {
|
||||||
|
this.sourceStream = sourceStream;
|
||||||
|
this.mapper = mapper;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean next(Predicate<? super T> consumer) {
|
||||||
|
while (true) {
|
||||||
|
if (current == null) {
|
||||||
|
if (done) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
boolean hasMore = sourceStream.next(e -> {
|
||||||
|
current = mapper.apply(e);
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
if (!hasMore) {
|
||||||
|
done = true;
|
||||||
|
}
|
||||||
|
if (current == null) {
|
||||||
|
done = true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (current instanceof TSimpleStreamImpl) {
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
TSimpleStreamImpl<? extends T> castCurrent = (TSimpleStreamImpl<? extends T>) current;
|
||||||
|
if (castCurrent.next(consumer)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
current = null;
|
||||||
|
} else {
|
||||||
|
iterator = current.iterator();
|
||||||
|
while (iterator.hasNext()) {
|
||||||
|
T e = iterator.next();
|
||||||
|
if (!consumer.test(e)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
iterator = null;
|
||||||
|
current = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws Exception {
|
||||||
|
current = null;
|
||||||
|
iterator = null;
|
||||||
|
sourceStream.close();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,83 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.impl;
|
||||||
|
|
||||||
|
import java.util.PrimitiveIterator;
|
||||||
|
import java.util.function.DoublePredicate;
|
||||||
|
import java.util.function.Function;
|
||||||
|
import org.teavm.classlib.java.util.stream.TDoubleStream;
|
||||||
|
import org.teavm.classlib.java.util.stream.doubleimpl.TSimpleDoubleStreamImpl;
|
||||||
|
|
||||||
|
public class TFlatMappingToDoubleStreamImpl<T> extends TSimpleDoubleStreamImpl {
|
||||||
|
private TSimpleStreamImpl<T> sourceStream;
|
||||||
|
private TDoubleStream current;
|
||||||
|
private PrimitiveIterator.OfDouble iterator;
|
||||||
|
private Function<? super T, ? extends TDoubleStream> mapper;
|
||||||
|
private boolean done;
|
||||||
|
|
||||||
|
public TFlatMappingToDoubleStreamImpl(TSimpleStreamImpl<T> sourceStream,
|
||||||
|
Function<? super T, ? extends TDoubleStream> mapper) {
|
||||||
|
this.sourceStream = sourceStream;
|
||||||
|
this.mapper = mapper;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean next(DoublePredicate consumer) {
|
||||||
|
while (true) {
|
||||||
|
if (current == null) {
|
||||||
|
if (done) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
boolean hasMore = sourceStream.next(e -> {
|
||||||
|
current = mapper.apply(e);
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
if (!hasMore) {
|
||||||
|
done = true;
|
||||||
|
}
|
||||||
|
if (current == null) {
|
||||||
|
done = true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (current instanceof TSimpleDoubleStreamImpl) {
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
TSimpleDoubleStreamImpl castCurrent = (TSimpleDoubleStreamImpl) current;
|
||||||
|
if (castCurrent.next(consumer)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
current = null;
|
||||||
|
} else {
|
||||||
|
iterator = current.iterator();
|
||||||
|
while (iterator.hasNext()) {
|
||||||
|
double e = iterator.nextDouble();
|
||||||
|
if (!consumer.test(e)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
iterator = null;
|
||||||
|
current = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws Exception {
|
||||||
|
current = null;
|
||||||
|
iterator = null;
|
||||||
|
sourceStream.close();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,83 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.impl;
|
||||||
|
|
||||||
|
import java.util.PrimitiveIterator;
|
||||||
|
import java.util.function.Function;
|
||||||
|
import java.util.function.IntPredicate;
|
||||||
|
import org.teavm.classlib.java.util.stream.TIntStream;
|
||||||
|
import org.teavm.classlib.java.util.stream.intimpl.TSimpleIntStreamImpl;
|
||||||
|
|
||||||
|
public class TFlatMappingToIntStreamImpl<T> extends TSimpleIntStreamImpl {
|
||||||
|
private TSimpleStreamImpl<T> sourceStream;
|
||||||
|
private TIntStream current;
|
||||||
|
private PrimitiveIterator.OfInt iterator;
|
||||||
|
private Function<? super T, ? extends TIntStream> mapper;
|
||||||
|
private boolean done;
|
||||||
|
|
||||||
|
public TFlatMappingToIntStreamImpl(TSimpleStreamImpl<T> sourceStream,
|
||||||
|
Function<? super T, ? extends TIntStream> mapper) {
|
||||||
|
this.sourceStream = sourceStream;
|
||||||
|
this.mapper = mapper;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean next(IntPredicate consumer) {
|
||||||
|
while (true) {
|
||||||
|
if (current == null) {
|
||||||
|
if (done) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
boolean hasMore = sourceStream.next(e -> {
|
||||||
|
current = mapper.apply(e);
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
if (!hasMore) {
|
||||||
|
done = true;
|
||||||
|
}
|
||||||
|
if (current == null) {
|
||||||
|
done = true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (current instanceof TSimpleIntStreamImpl) {
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
TSimpleIntStreamImpl castCurrent = (TSimpleIntStreamImpl) current;
|
||||||
|
if (castCurrent.next(consumer)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
current = null;
|
||||||
|
} else {
|
||||||
|
iterator = current.iterator();
|
||||||
|
while (iterator.hasNext()) {
|
||||||
|
int e = iterator.nextInt();
|
||||||
|
if (!consumer.test(e)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
iterator = null;
|
||||||
|
current = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws Exception {
|
||||||
|
current = null;
|
||||||
|
iterator = null;
|
||||||
|
sourceStream.close();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,83 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.impl;
|
||||||
|
|
||||||
|
import java.util.PrimitiveIterator;
|
||||||
|
import java.util.function.Function;
|
||||||
|
import java.util.function.LongPredicate;
|
||||||
|
import org.teavm.classlib.java.util.stream.TLongStream;
|
||||||
|
import org.teavm.classlib.java.util.stream.longimpl.TSimpleLongStreamImpl;
|
||||||
|
|
||||||
|
public class TFlatMappingToLongStreamImpl<T> extends TSimpleLongStreamImpl {
|
||||||
|
private TSimpleStreamImpl<T> sourceStream;
|
||||||
|
private TLongStream current;
|
||||||
|
private PrimitiveIterator.OfLong iterator;
|
||||||
|
private Function<? super T, ? extends TLongStream> mapper;
|
||||||
|
private boolean done;
|
||||||
|
|
||||||
|
public TFlatMappingToLongStreamImpl(TSimpleStreamImpl<T> sourceStream,
|
||||||
|
Function<? super T, ? extends TLongStream> mapper) {
|
||||||
|
this.sourceStream = sourceStream;
|
||||||
|
this.mapper = mapper;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean next(LongPredicate consumer) {
|
||||||
|
while (true) {
|
||||||
|
if (current == null) {
|
||||||
|
if (done) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
boolean hasMore = sourceStream.next(e -> {
|
||||||
|
current = mapper.apply(e);
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
if (!hasMore) {
|
||||||
|
done = true;
|
||||||
|
}
|
||||||
|
if (current == null) {
|
||||||
|
done = true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (current instanceof TSimpleLongStreamImpl) {
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
TSimpleLongStreamImpl castCurrent = (TSimpleLongStreamImpl) current;
|
||||||
|
if (castCurrent.next(consumer)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
current = null;
|
||||||
|
} else {
|
||||||
|
iterator = current.iterator();
|
||||||
|
while (iterator.hasNext()) {
|
||||||
|
long e = iterator.nextLong();
|
||||||
|
if (!consumer.test(e)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
iterator = null;
|
||||||
|
current = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws Exception {
|
||||||
|
current = null;
|
||||||
|
iterator = null;
|
||||||
|
sourceStream.close();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.impl;
|
||||||
|
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
public class TGenerateStream<T> extends TSimpleStreamImpl<T> {
|
||||||
|
private Supplier<T> s;
|
||||||
|
|
||||||
|
public TGenerateStream(Supplier<T> s) {
|
||||||
|
this.s = s;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean next(Predicate<? super T> consumer) {
|
||||||
|
while (consumer.test(s.get())) {
|
||||||
|
// go on
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,75 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.impl;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
import org.teavm.classlib.java.util.stream.TStream;
|
||||||
|
|
||||||
|
public class TGenericConcatStream<T> extends TSimpleStreamImpl<T> {
|
||||||
|
TStream<? extends T> first;
|
||||||
|
TStream<? extends T> second;
|
||||||
|
Iterator<? extends T> iterator;
|
||||||
|
boolean isSecond;
|
||||||
|
|
||||||
|
public TGenericConcatStream(TStream<? extends T> first, TStream<? extends T> second) {
|
||||||
|
this.first = first;
|
||||||
|
this.second = second;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean next(Predicate<? super T> consumer) {
|
||||||
|
if (iterator == null) {
|
||||||
|
iterator = first.iterator();
|
||||||
|
}
|
||||||
|
while (true) {
|
||||||
|
while (iterator.hasNext()) {
|
||||||
|
if (!consumer.test(iterator.next())) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!isSecond) {
|
||||||
|
isSecond = true;
|
||||||
|
iterator = second.iterator();
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long count() {
|
||||||
|
return first.count() + second.count();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws Exception {
|
||||||
|
Exception suppressed = null;
|
||||||
|
try {
|
||||||
|
first.close();
|
||||||
|
} catch (Exception e) {
|
||||||
|
suppressed = e;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
second.close();
|
||||||
|
} catch (Exception e) {
|
||||||
|
if (suppressed != null) {
|
||||||
|
e.addSuppressed(suppressed);
|
||||||
|
}
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.impl;
|
||||||
|
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
import java.util.function.UnaryOperator;
|
||||||
|
|
||||||
|
public class TIterateStream<T> extends TSimpleStreamImpl<T> {
|
||||||
|
private T value;
|
||||||
|
private UnaryOperator<T> f;
|
||||||
|
|
||||||
|
public TIterateStream(T value, UnaryOperator<T> f) {
|
||||||
|
this.value = value;
|
||||||
|
this.f = f;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean next(Predicate<? super T> consumer) {
|
||||||
|
while (true) {
|
||||||
|
T valueToReport = value;
|
||||||
|
value = f.apply(value);
|
||||||
|
if (!consumer.test(valueToReport)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,58 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.impl;
|
||||||
|
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
|
public class TLimitingStreamImpl<T> extends TSimpleStreamImpl<T> {
|
||||||
|
private TSimpleStreamImpl<T> sourceStream;
|
||||||
|
private int limit;
|
||||||
|
private int remaining;
|
||||||
|
|
||||||
|
public TLimitingStreamImpl(TSimpleStreamImpl<T> sourceStream, int limit) {
|
||||||
|
this.sourceStream = sourceStream;
|
||||||
|
this.limit = limit;
|
||||||
|
remaining = limit;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean next(Predicate<? super T> consumer) {
|
||||||
|
if (remaining == 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
boolean result = sourceStream.next(e -> {
|
||||||
|
if (remaining-- == 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return consumer.test(e);
|
||||||
|
});
|
||||||
|
if (!result) {
|
||||||
|
remaining = 0;
|
||||||
|
}
|
||||||
|
return remaining > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int estimateSize() {
|
||||||
|
int sourceEstimation = sourceStream.estimateSize();
|
||||||
|
return sourceEstimation < 0 ? limit : Math.min(limit, sourceEstimation);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws Exception {
|
||||||
|
sourceStream.close();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.impl;
|
||||||
|
|
||||||
|
import java.util.function.Function;
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
|
public class TMappingStreamImpl<T, S> extends TWrappingStreamImpl<T, S> {
|
||||||
|
private Function<? super S, ? extends T> mapper;
|
||||||
|
|
||||||
|
public TMappingStreamImpl(TSimpleStreamImpl<S> sourceStream, Function<? super S, ? extends T> mapper) {
|
||||||
|
super(sourceStream);
|
||||||
|
this.mapper = mapper;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Predicate<S> wrap(Predicate<? super T> consumer) {
|
||||||
|
return t -> consumer.test(mapper.apply(t));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long count() {
|
||||||
|
return sourceStream.count();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,50 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.impl;
|
||||||
|
|
||||||
|
import java.util.function.DoublePredicate;
|
||||||
|
import java.util.function.ToDoubleFunction;
|
||||||
|
import org.teavm.classlib.java.util.stream.doubleimpl.TSimpleDoubleStreamImpl;
|
||||||
|
|
||||||
|
public class TMappingToDoubleStreamImpl<T> extends TSimpleDoubleStreamImpl {
|
||||||
|
private TSimpleStreamImpl<T> source;
|
||||||
|
private ToDoubleFunction<? super T> mapper;
|
||||||
|
|
||||||
|
public TMappingToDoubleStreamImpl(TSimpleStreamImpl<T> source, ToDoubleFunction<? super T> mapper) {
|
||||||
|
this.source = source;
|
||||||
|
this.mapper = mapper;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean next(DoublePredicate consumer) {
|
||||||
|
return source.next(e -> consumer.test(mapper.applyAsDouble(e)));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws Exception {
|
||||||
|
source.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int estimateSize() {
|
||||||
|
return source.estimateSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long count() {
|
||||||
|
return source.count();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,50 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.impl;
|
||||||
|
|
||||||
|
import java.util.function.IntPredicate;
|
||||||
|
import java.util.function.ToIntFunction;
|
||||||
|
import org.teavm.classlib.java.util.stream.intimpl.TSimpleIntStreamImpl;
|
||||||
|
|
||||||
|
public class TMappingToIntStreamImpl<T> extends TSimpleIntStreamImpl {
|
||||||
|
private TSimpleStreamImpl<T> source;
|
||||||
|
private ToIntFunction<? super T> mapper;
|
||||||
|
|
||||||
|
public TMappingToIntStreamImpl(TSimpleStreamImpl<T> source, ToIntFunction<? super T> mapper) {
|
||||||
|
this.source = source;
|
||||||
|
this.mapper = mapper;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean next(IntPredicate consumer) {
|
||||||
|
return source.next(e -> consumer.test(mapper.applyAsInt(e)));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws Exception {
|
||||||
|
source.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int estimateSize() {
|
||||||
|
return source.estimateSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long count() {
|
||||||
|
return source.count();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,50 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.impl;
|
||||||
|
|
||||||
|
import java.util.function.LongPredicate;
|
||||||
|
import java.util.function.ToLongFunction;
|
||||||
|
import org.teavm.classlib.java.util.stream.longimpl.TSimpleLongStreamImpl;
|
||||||
|
|
||||||
|
public class TMappingToLongStreamImpl<T> extends TSimpleLongStreamImpl {
|
||||||
|
private TSimpleStreamImpl<T> source;
|
||||||
|
private ToLongFunction<? super T> mapper;
|
||||||
|
|
||||||
|
public TMappingToLongStreamImpl(TSimpleStreamImpl<T> source, ToLongFunction<? super T> mapper) {
|
||||||
|
this.source = source;
|
||||||
|
this.mapper = mapper;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean next(LongPredicate consumer) {
|
||||||
|
return source.next(e -> consumer.test(mapper.applyAsLong(e)));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws Exception {
|
||||||
|
source.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int estimateSize() {
|
||||||
|
return source.estimateSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long count() {
|
||||||
|
return source.count();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,36 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.impl;
|
||||||
|
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
|
public class TPeekingStreamImpl<T> extends TWrappingStreamImpl<T, T> {
|
||||||
|
private Consumer<? super T> elementConsumer;
|
||||||
|
|
||||||
|
public TPeekingStreamImpl(TSimpleStreamImpl<T> sourceStream, Consumer<? super T> elementConsumer) {
|
||||||
|
super(sourceStream);
|
||||||
|
this.elementConsumer = elementConsumer;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Predicate<T> wrap(Predicate<? super T> consumer) {
|
||||||
|
return e -> {
|
||||||
|
elementConsumer.accept(e);
|
||||||
|
return consumer.test(e);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,42 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.impl;
|
||||||
|
|
||||||
|
import java.util.function.BinaryOperator;
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
|
class TReducingConsumer<T> implements Predicate<T> {
|
||||||
|
private BinaryOperator<T> accumulator;
|
||||||
|
T result;
|
||||||
|
boolean initialized;
|
||||||
|
|
||||||
|
TReducingConsumer(BinaryOperator<T> accumulator, T result, boolean initialized) {
|
||||||
|
this.accumulator = accumulator;
|
||||||
|
this.result = result;
|
||||||
|
this.initialized = initialized;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean test(T t) {
|
||||||
|
if (!initialized) {
|
||||||
|
result = t;
|
||||||
|
initialized = true;
|
||||||
|
} else {
|
||||||
|
result = accumulator.apply(result, t);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.impl;
|
||||||
|
|
||||||
|
import java.util.function.BiFunction;
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
|
class TReducingConsumer2<T, U> implements Predicate<T> {
|
||||||
|
private BiFunction<U, ? super T, U> accumulator;
|
||||||
|
U result;
|
||||||
|
|
||||||
|
TReducingConsumer2(BiFunction<U, ? super T, U> accumulator, U result) {
|
||||||
|
this.accumulator = accumulator;
|
||||||
|
this.result = result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean test(T t) {
|
||||||
|
result = accumulator.apply(result, t);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,310 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.impl;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.Spliterator;
|
||||||
|
import java.util.function.BiConsumer;
|
||||||
|
import java.util.function.BiFunction;
|
||||||
|
import java.util.function.BinaryOperator;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
import java.util.function.Function;
|
||||||
|
import java.util.function.IntFunction;
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
import java.util.function.ToDoubleFunction;
|
||||||
|
import java.util.function.ToIntFunction;
|
||||||
|
import java.util.function.ToLongFunction;
|
||||||
|
import org.teavm.classlib.java.util.stream.TCollector;
|
||||||
|
import org.teavm.classlib.java.util.stream.TDoubleStream;
|
||||||
|
import org.teavm.classlib.java.util.stream.TIntStream;
|
||||||
|
import org.teavm.classlib.java.util.stream.TLongStream;
|
||||||
|
import org.teavm.classlib.java.util.stream.TStream;
|
||||||
|
|
||||||
|
public abstract class TSimpleStreamImpl<T> implements TStream<T> {
|
||||||
|
@Override
|
||||||
|
public TStream<T> filter(Predicate<? super T> predicate) {
|
||||||
|
return new TFilteringStreamImpl<>(this, predicate);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <R> TStream<R> map(Function<? super T, ? extends R> mapper) {
|
||||||
|
return new TMappingStreamImpl<>(this, mapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TIntStream mapToInt(ToIntFunction<? super T> mapper) {
|
||||||
|
return new TMappingToIntStreamImpl<>(this, mapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TLongStream mapToLong(ToLongFunction<? super T> mapper) {
|
||||||
|
return new TMappingToLongStreamImpl<>(this, mapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TDoubleStream mapToDouble(ToDoubleFunction<? super T> mapper) {
|
||||||
|
return new TMappingToDoubleStreamImpl<>(this, mapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <R> TStream<R> flatMap(Function<? super T, ? extends TStream<? extends R>> mapper) {
|
||||||
|
return new TFlatMappingStreamImpl<>(this, mapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TIntStream flatMapToInt(Function<? super T, ? extends TIntStream> mapper) {
|
||||||
|
return new TFlatMappingToIntStreamImpl<>(this, mapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TLongStream flatMapToLong(Function<? super T, ? extends TLongStream> mapper) {
|
||||||
|
return new TFlatMappingToLongStreamImpl<>(this, mapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TDoubleStream flatMapToDouble(Function<? super T, ? extends TDoubleStream> mapper) {
|
||||||
|
return new TFlatMappingToDoubleStreamImpl<>(this, mapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TStream<T> distinct() {
|
||||||
|
return new TDistinctStreamImpl<>(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public TStream<T> sorted() {
|
||||||
|
return new TSortedStreamImpl<>(this, (a, b) -> ((Comparable<Object>) a).compareTo(b));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TStream<T> sorted(Comparator<? super T> comparator) {
|
||||||
|
return new TSortedStreamImpl<>(this, comparator);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TStream<T> peek(Consumer<? super T> action) {
|
||||||
|
return new TPeekingStreamImpl<>(this, action);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TStream<T> limit(long maxSize) {
|
||||||
|
return new TLimitingStreamImpl<>(this, (int) maxSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TStream<T> skip(long n) {
|
||||||
|
return new TSkippingStreamImpl<>(this, (int) n);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void forEach(Consumer<? super T> action) {
|
||||||
|
forEachOrdered(action);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void forEachOrdered(Consumer<? super T> action) {
|
||||||
|
next(e -> {
|
||||||
|
action.accept(e);
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object[] toArray() {
|
||||||
|
return toArray(Object[]::new);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public <A> A[] toArray(IntFunction<A[]> generator) {
|
||||||
|
int estimatedSize = estimateSize();
|
||||||
|
if (estimatedSize < 0) {
|
||||||
|
List<T> list = new ArrayList<>();
|
||||||
|
next(list::add);
|
||||||
|
A[] array = generator.apply(list.size());
|
||||||
|
for (int i = 0; i < array.length; ++i) {
|
||||||
|
array[i] = (A) list.get(i);
|
||||||
|
}
|
||||||
|
return array;
|
||||||
|
} else {
|
||||||
|
A[] array = generator.apply(estimatedSize);
|
||||||
|
ArrayFillingConsumer<A> consumer = new ArrayFillingConsumer<>(array);
|
||||||
|
boolean wantsMore = next(consumer);
|
||||||
|
assert !wantsMore : "next() should have reported done status";
|
||||||
|
if (consumer.index < array.length) {
|
||||||
|
array = Arrays.copyOf(array, consumer.index);
|
||||||
|
}
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public T reduce(T identity, BinaryOperator<T> accumulator) {
|
||||||
|
TReducingConsumer<T> consumer = new TReducingConsumer<>(accumulator, identity, true);
|
||||||
|
boolean wantsMore = next(consumer);
|
||||||
|
assert !wantsMore : "next() should have returned true";
|
||||||
|
return consumer.result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Optional<T> reduce(BinaryOperator<T> accumulator) {
|
||||||
|
TReducingConsumer<T> consumer = new TReducingConsumer<>(accumulator, null, false);
|
||||||
|
boolean wantsMore = next(consumer);
|
||||||
|
assert !wantsMore : "next() should have returned true";
|
||||||
|
return Optional.ofNullable(consumer.result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <U> U reduce(U identity, BiFunction<U, ? super T, U> accumulator, BinaryOperator<U> combiner) {
|
||||||
|
TReducingConsumer2<T, U> consumer = new TReducingConsumer2<>(accumulator, identity);
|
||||||
|
boolean wantsMore = next(consumer);
|
||||||
|
assert !wantsMore : "next() should have returned true";
|
||||||
|
return consumer.result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <R> R collect(Supplier<R> supplier, BiConsumer<R, ? super T> accumulator, BiConsumer<R, R> combiner) {
|
||||||
|
R collection = supplier.get();
|
||||||
|
next(e -> {
|
||||||
|
accumulator.accept(collection, e);
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
return collection;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <R, A> R collect(TCollector<? super T, A, R> collector) {
|
||||||
|
A collection = collector.supplier().get();
|
||||||
|
BiConsumer<A, ? super T> accumulator = collector.accumulator();
|
||||||
|
next(e -> {
|
||||||
|
accumulator.accept(collection, e);
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
return collector.finisher().apply(collection);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Optional<T> min(Comparator<? super T> comparator) {
|
||||||
|
return reduce((a, b) -> comparator.compare(a, b) < 0 ? a : b);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Optional<T> max(Comparator<? super T> comparator) {
|
||||||
|
return reduce((a, b) -> comparator.compare(a, b) > 0 ? a : b);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long count() {
|
||||||
|
TCountingConsumer<T> consumer = new TCountingConsumer<>();
|
||||||
|
next(consumer);
|
||||||
|
return consumer.count;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean anyMatch(Predicate<? super T> predicate) {
|
||||||
|
return next(predicate.negate());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean allMatch(Predicate<? super T> predicate) {
|
||||||
|
return !next(predicate);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean noneMatch(Predicate<? super T> predicate) {
|
||||||
|
return !anyMatch(predicate);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Optional<T> findFirst() {
|
||||||
|
TFindFirstConsumer<T> consumer = new TFindFirstConsumer<>();
|
||||||
|
next(consumer);
|
||||||
|
return Optional.ofNullable(consumer.result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Optional<T> findAny() {
|
||||||
|
return findFirst();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterator<T> iterator() {
|
||||||
|
return new TSimpleStreamIterator<>(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Spliterator<T> spliterator() {
|
||||||
|
return new TSimpleStreamSpliterator<>(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isParallel() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TStream<T> sequential() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TStream<T> parallel() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TStream<T> unordered() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TStream<T> onClose(Runnable closeHandler) {
|
||||||
|
return new TCloseHandlingStream<>(this, closeHandler);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws Exception {
|
||||||
|
}
|
||||||
|
|
||||||
|
protected int estimateSize() {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract boolean next(Predicate<? super T> consumer);
|
||||||
|
|
||||||
|
class ArrayFillingConsumer<A> implements Predicate<T> {
|
||||||
|
A[] array;
|
||||||
|
int index;
|
||||||
|
|
||||||
|
ArrayFillingConsumer(A[] array) {
|
||||||
|
this.array = array;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public boolean test(T t) {
|
||||||
|
array[index++] = (A) t;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,75 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.impl;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.NoSuchElementException;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
public class TSimpleStreamIterator<T> implements Iterator<T> {
|
||||||
|
private static final byte NEEDS_MORE = 0;
|
||||||
|
private static final byte HAS_DATA = 1;
|
||||||
|
private static final byte LAST_ELEMENT = 2;
|
||||||
|
private static final byte DONE = 3;
|
||||||
|
|
||||||
|
private TSimpleStreamImpl<T> stream;
|
||||||
|
private T lastElement;
|
||||||
|
private byte state;
|
||||||
|
|
||||||
|
public TSimpleStreamIterator(TSimpleStreamImpl<T> stream) {
|
||||||
|
this.stream = stream;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void forEachRemaining(Consumer<? super T> action) {
|
||||||
|
stream.next(x -> {
|
||||||
|
action.accept(x);
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasNext() {
|
||||||
|
fetchIfNeeded();
|
||||||
|
return state != DONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public T next() {
|
||||||
|
fetchIfNeeded();
|
||||||
|
if (state == DONE) {
|
||||||
|
throw new NoSuchElementException();
|
||||||
|
}
|
||||||
|
T result = lastElement;
|
||||||
|
lastElement = null;
|
||||||
|
state = state == LAST_ELEMENT ? DONE : NEEDS_MORE;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void fetchIfNeeded() {
|
||||||
|
if (state != NEEDS_MORE) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
boolean hasMore = stream.next(e -> {
|
||||||
|
lastElement = e;
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
state = hasMore ? HAS_DATA : LAST_ELEMENT;
|
||||||
|
if (state == LAST_ELEMENT) {
|
||||||
|
stream = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,63 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.impl;
|
||||||
|
|
||||||
|
import java.util.Spliterator;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
public class TSimpleStreamSpliterator<T> implements Spliterator<T> {
|
||||||
|
private TSimpleStreamImpl<T> stream;
|
||||||
|
private boolean done;
|
||||||
|
|
||||||
|
public TSimpleStreamSpliterator(TSimpleStreamImpl<T> stream) {
|
||||||
|
this.stream = stream;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void forEachRemaining(Consumer<? super T> action) {
|
||||||
|
stream.next(x -> {
|
||||||
|
action.accept(x);
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean tryAdvance(Consumer<? super T> action) {
|
||||||
|
if (done) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
done = !stream.next(x -> {
|
||||||
|
action.accept(x);
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Spliterator<T> trySplit() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long estimateSize() {
|
||||||
|
return stream.estimateSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int characteristics() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,42 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.impl;
|
||||||
|
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
|
public class TSingleStreamImpl<T> extends TSimpleStreamImpl<T> {
|
||||||
|
private T element;
|
||||||
|
|
||||||
|
public TSingleStreamImpl(T element) {
|
||||||
|
this.element = element;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean next(Predicate<? super T> consumer) {
|
||||||
|
consumer.test(element);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int estimateSize() {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long count() {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,51 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.impl;
|
||||||
|
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
|
public class TSkippingStreamImpl<T> extends TSimpleStreamImpl<T> {
|
||||||
|
private TSimpleStreamImpl<T> sourceStream;
|
||||||
|
private int skip;
|
||||||
|
private int remaining;
|
||||||
|
|
||||||
|
public TSkippingStreamImpl(TSimpleStreamImpl<T> sourceStream, int skip) {
|
||||||
|
this.sourceStream = sourceStream;
|
||||||
|
this.skip = skip;
|
||||||
|
remaining = skip;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean next(Predicate<? super T> consumer) {
|
||||||
|
if (remaining > 0) {
|
||||||
|
if (!sourceStream.next(e -> --remaining > 0)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sourceStream.next(consumer);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int estimateSize() {
|
||||||
|
int sourceSize = sourceStream.estimateSize();
|
||||||
|
return sourceSize >= 0 ? Math.max(0, sourceSize - skip) : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws Exception {
|
||||||
|
sourceStream.close();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,53 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.impl;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
|
public class TSortedStreamImpl<T> extends TSimpleStreamImpl<T> {
|
||||||
|
private TSimpleStreamImpl<T> sourceStream;
|
||||||
|
private T[] array;
|
||||||
|
private int index;
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public TSortedStreamImpl(TSimpleStreamImpl<T> sourceStream, Comparator<? super T> comparator) {
|
||||||
|
this.sourceStream = sourceStream;
|
||||||
|
array = (T[]) sourceStream.toArray(Object[]::new);
|
||||||
|
Arrays.sort(array, comparator);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean next(Predicate<? super T> consumer) {
|
||||||
|
while (index < array.length) {
|
||||||
|
if (!consumer.test(array[index++])) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return index < array.length;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int estimateSize() {
|
||||||
|
return sourceStream.estimateSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws Exception {
|
||||||
|
sourceStream.close();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,78 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.impl;
|
||||||
|
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
|
public class TSpecializedConcatStream<T> extends TSimpleStreamImpl<T> {
|
||||||
|
TSimpleStreamImpl<T> first;
|
||||||
|
TSimpleStreamImpl<T> second;
|
||||||
|
TSimpleStreamImpl<T> current;
|
||||||
|
|
||||||
|
public TSpecializedConcatStream(TSimpleStreamImpl<T> first, TSimpleStreamImpl<T> second) {
|
||||||
|
this.first = first;
|
||||||
|
this.second = second;
|
||||||
|
current = first;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean next(Predicate<? super T> consumer) {
|
||||||
|
if (current == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
while (true) {
|
||||||
|
if (current.next(consumer)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (current == first) {
|
||||||
|
current = second;
|
||||||
|
} else {
|
||||||
|
current = null;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int estimateSize() {
|
||||||
|
int firstSize = first.estimateSize();
|
||||||
|
int secondSize = second.estimateSize();
|
||||||
|
return firstSize >= 0 && secondSize >= 0 ? firstSize + secondSize : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long count() {
|
||||||
|
return first.count() + second.count();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws Exception {
|
||||||
|
RuntimeException suppressed = null;
|
||||||
|
try {
|
||||||
|
first.close();
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
suppressed = e;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
second.close();
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
if (suppressed != null) {
|
||||||
|
e.addSuppressed(suppressed);
|
||||||
|
}
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,70 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.impl;
|
||||||
|
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
import org.teavm.classlib.java.util.TCollection;
|
||||||
|
import org.teavm.classlib.java.util.TIterator;
|
||||||
|
import org.teavm.classlib.java.util.TSpliterator;
|
||||||
|
|
||||||
|
public class TSpliteratorOverCollection<T> implements TSpliterator<T> {
|
||||||
|
private TCollection<T> collection;
|
||||||
|
private TIterator<T> iterator;
|
||||||
|
|
||||||
|
public TSpliteratorOverCollection(TCollection<T> collection) {
|
||||||
|
this.collection = collection;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean tryAdvance(Consumer<? super T> action) {
|
||||||
|
ensureIterator();
|
||||||
|
if (iterator.hasNext()) {
|
||||||
|
action.accept(iterator.next());
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void forEachRemaining(Consumer<? super T> action) {
|
||||||
|
ensureIterator();
|
||||||
|
while (iterator.hasNext()) {
|
||||||
|
action.accept(iterator.next());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ensureIterator() {
|
||||||
|
if (iterator == null) {
|
||||||
|
iterator = collection.iterator();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TSpliterator<T> trySplit() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long estimateSize() {
|
||||||
|
return collection.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int characteristics() {
|
||||||
|
return TSpliterator.SIZED;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.impl;
|
||||||
|
|
||||||
|
import org.teavm.classlib.java.util.TArrayList;
|
||||||
|
import org.teavm.classlib.java.util.TList;
|
||||||
|
import org.teavm.classlib.java.util.stream.TStream;
|
||||||
|
|
||||||
|
public class TStreamBuilder<T> implements TStream.Builder<T> {
|
||||||
|
private TList<T> elements = new TArrayList<>();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void accept(T t) {
|
||||||
|
elements.add(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TStream<T> build() {
|
||||||
|
return elements.stream();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,63 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.impl;
|
||||||
|
|
||||||
|
import java.util.Spliterator;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
|
public class TStreamOverSpliterator<T> extends TSimpleStreamImpl<T> {
|
||||||
|
private Spliterator<T> spliterator;
|
||||||
|
|
||||||
|
public TStreamOverSpliterator(Spliterator<T> spliterator) {
|
||||||
|
this.spliterator = spliterator;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean next(Predicate<? super T> consumer) {
|
||||||
|
AdapterAction<T> action = new AdapterAction<>(consumer);
|
||||||
|
while (spliterator.tryAdvance(action)) {
|
||||||
|
if (!action.wantsMore) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static class AdapterAction<T> implements Consumer<T> {
|
||||||
|
private Predicate<? super T> consumer;
|
||||||
|
boolean wantsMore;
|
||||||
|
|
||||||
|
AdapterAction(Predicate<? super T> consumer) {
|
||||||
|
this.consumer = consumer;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void accept(T t) {
|
||||||
|
wantsMore = consumer.test(t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int estimateSize() {
|
||||||
|
return (int) spliterator.estimateSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long count() {
|
||||||
|
return spliterator.hasCharacteristics(Spliterator.SIZED) ? (int) spliterator.estimateSize() : super.count();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.impl;
|
||||||
|
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
|
public abstract class TWrappingStreamImpl<T, S> extends TSimpleStreamImpl<T> {
|
||||||
|
TSimpleStreamImpl<S> sourceStream;
|
||||||
|
|
||||||
|
public TWrappingStreamImpl(TSimpleStreamImpl<S> sourceStream) {
|
||||||
|
this.sourceStream = sourceStream;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean next(Predicate<? super T> consumer) {
|
||||||
|
return sourceStream.next(wrap(consumer));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract Predicate<S> wrap(Predicate<? super T> consumer);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int estimateSize() {
|
||||||
|
return sourceStream.estimateSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws Exception {
|
||||||
|
sourceStream.close();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.intimpl;
|
||||||
|
|
||||||
|
import java.util.function.IntPredicate;
|
||||||
|
|
||||||
|
public class TArrayIntStreamImpl extends TSimpleIntStreamImpl {
|
||||||
|
private int[] array;
|
||||||
|
private int index;
|
||||||
|
private int end;
|
||||||
|
private int size;
|
||||||
|
|
||||||
|
public TArrayIntStreamImpl(int[] array, int start, int end) {
|
||||||
|
this.array = array;
|
||||||
|
index = start;
|
||||||
|
this.end = end;
|
||||||
|
size = end - start;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean next(IntPredicate consumer) {
|
||||||
|
while (index < end) {
|
||||||
|
if (!consumer.test(array[index++])) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return index < end;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int estimateSize() {
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long count() {
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.intimpl;
|
||||||
|
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
import org.teavm.classlib.java.util.stream.impl.TSimpleStreamImpl;
|
||||||
|
|
||||||
|
public class TBoxedIntStream extends TSimpleStreamImpl<Integer> {
|
||||||
|
private TSimpleIntStreamImpl source;
|
||||||
|
|
||||||
|
public TBoxedIntStream(TSimpleIntStreamImpl source) {
|
||||||
|
this.source = source;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean next(Predicate<? super Integer> consumer) {
|
||||||
|
return source.next(consumer::test);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.intimpl;
|
||||||
|
|
||||||
|
import java.util.function.IntPredicate;
|
||||||
|
|
||||||
|
public class TCloseHandlingIntStream extends TSimpleIntStreamImpl {
|
||||||
|
private TSimpleIntStreamImpl innerStream;
|
||||||
|
private Runnable closeHandler;
|
||||||
|
|
||||||
|
public TCloseHandlingIntStream(TSimpleIntStreamImpl innerStream, Runnable closeHandler) {
|
||||||
|
this.innerStream = innerStream;
|
||||||
|
this.closeHandler = closeHandler;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean next(IntPredicate consumer) {
|
||||||
|
return innerStream.next(consumer);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws Exception {
|
||||||
|
RuntimeException previousException = null;
|
||||||
|
try {
|
||||||
|
closeHandler.run();
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
previousException = e;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
innerStream.close();
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
if (previousException != null) {
|
||||||
|
e.addSuppressed(previousException);
|
||||||
|
}
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.intimpl;
|
||||||
|
|
||||||
|
import java.util.function.IntPredicate;
|
||||||
|
|
||||||
|
public class TCountingIntConsumer implements IntPredicate {
|
||||||
|
int count;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean test(int t) {
|
||||||
|
count++;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.intimpl;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.function.IntPredicate;
|
||||||
|
|
||||||
|
public class TDistinctIntStreamImpl extends TWrappingIntStreamImpl {
|
||||||
|
public TDistinctIntStreamImpl(TSimpleIntStreamImpl innerStream) {
|
||||||
|
super(innerStream);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected IntPredicate wrap(IntPredicate consumer) {
|
||||||
|
Set<Integer> visited = new HashSet<>();
|
||||||
|
return e -> {
|
||||||
|
if (!visited.add(e)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return consumer.test(e);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.intimpl;
|
||||||
|
|
||||||
|
import java.util.function.IntPredicate;
|
||||||
|
|
||||||
|
public class TEmptyIntStreamImpl extends TSimpleIntStreamImpl {
|
||||||
|
@Override
|
||||||
|
public boolean next(IntPredicate consumer) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int estimateSize() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long count() {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.intimpl;
|
||||||
|
|
||||||
|
import java.util.function.IntPredicate;
|
||||||
|
|
||||||
|
public class TFilteringIntStreamImpl extends TWrappingIntStreamImpl {
|
||||||
|
private IntPredicate filter;
|
||||||
|
|
||||||
|
public TFilteringIntStreamImpl(TSimpleIntStreamImpl innerStream, IntPredicate filter) {
|
||||||
|
super(innerStream);
|
||||||
|
this.filter = filter;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected IntPredicate wrap(IntPredicate consumer) {
|
||||||
|
return t -> {
|
||||||
|
if (!filter.test(t)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return consumer.test(t);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,30 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.intimpl;
|
||||||
|
|
||||||
|
import java.util.function.IntPredicate;
|
||||||
|
|
||||||
|
public class TFindFirstIntConsumer implements IntPredicate {
|
||||||
|
public int result;
|
||||||
|
boolean hasAny;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean test(int t) {
|
||||||
|
hasAny = true;
|
||||||
|
result = t;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,81 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.util.stream.intimpl;
|
||||||
|
|
||||||
|
import java.util.PrimitiveIterator;
|
||||||
|
import java.util.function.IntFunction;
|
||||||
|
import java.util.function.IntPredicate;
|
||||||
|
import org.teavm.classlib.java.util.stream.TIntStream;
|
||||||
|
|
||||||
|
public class TFlatMappingIntStreamImpl extends TSimpleIntStreamImpl {
|
||||||
|
private TSimpleIntStreamImpl sourceStream;
|
||||||
|
private TIntStream current;
|
||||||
|
private PrimitiveIterator.OfInt iterator;
|
||||||
|
private IntFunction<? extends TIntStream> mapper;
|
||||||
|
private boolean done;
|
||||||
|
|
||||||
|
public TFlatMappingIntStreamImpl(TSimpleIntStreamImpl sourceStream, IntFunction<? extends TIntStream> mapper) {
|
||||||
|
this.sourceStream = sourceStream;
|
||||||
|
this.mapper = mapper;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean next(IntPredicate consumer) {
|
||||||
|
while (true) {
|
||||||
|
if (current == null) {
|
||||||
|
if (done) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
boolean hasMore = sourceStream.next(e -> {
|
||||||
|
current = mapper.apply(e);
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
if (!hasMore) {
|
||||||
|
done = true;
|
||||||
|
}
|
||||||
|
if (current == null) {
|
||||||
|
done = true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (current instanceof TSimpleIntStreamImpl) {
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
TSimpleIntStreamImpl castCurrent = (TSimpleIntStreamImpl) current;
|
||||||
|
if (castCurrent.next(consumer)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
current = null;
|
||||||
|
} else {
|
||||||
|
iterator = current.iterator();
|
||||||
|
while (iterator.hasNext()) {
|
||||||
|
int e = iterator.nextInt();
|
||||||
|
if (!consumer.test(e)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
iterator = null;
|
||||||
|
current = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws Exception {
|
||||||
|
current = null;
|
||||||
|
iterator = null;
|
||||||
|
sourceStream.close();
|
||||||
|
}
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user