Browse Source
some more helpers for iterators / predicates [with Steffen Maercker]
some more helpers for iterators / predicates [with Steffen Maercker]
git-svn-id: https://www.prismmodelchecker.org/svn/prism/prism/trunk@12120 bbc10eb1-c90d-0410-af57-cb519fbb1720master
4 changed files with 732 additions and 0 deletions
-
35prism/src/common/functions/primitive/PairPredicateInt.java
-
164prism/src/common/iterable/FilteringIterable.java
-
463prism/src/common/iterable/MappingIterator.java
-
70prism/src/common/iterable/SingletonIterable.java
@ -0,0 +1,35 @@ |
|||||
|
//============================================================================== |
||||
|
// |
||||
|
// Copyright (c) 2016- |
||||
|
// Authors: |
||||
|
// * Steffen Maercker <maercker@tcs.inf.tu-dresden.de> (TU Dresden) |
||||
|
// * Joachim Klein <klein@tcs.inf.tu-dresden.de> (TU Dresden) |
||||
|
// |
||||
|
//------------------------------------------------------------------------------ |
||||
|
// |
||||
|
// This file is part of PRISM. |
||||
|
// |
||||
|
// PRISM is free software; you can redistribute it and/or modify |
||||
|
// it under the terms of the GNU General Public License as published by |
||||
|
// the Free Software Foundation; either version 2 of the License, or |
||||
|
// (at your option) any later version. |
||||
|
// |
||||
|
// PRISM is distributed in the hope that it will be useful, |
||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
// GNU General Public License for more details. |
||||
|
// |
||||
|
// You should have received a copy of the GNU General Public License |
||||
|
// along with PRISM; if not, write to the Free Software Foundation, |
||||
|
// Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||||
|
// |
||||
|
//============================================================================== |
||||
|
|
||||
|
package common.functions.primitive; |
||||
|
|
||||
|
/** Functional interface for a predicate (int, int) -> boolean */ |
||||
|
@FunctionalInterface |
||||
|
public interface PairPredicateInt |
||||
|
{ |
||||
|
public abstract boolean test(int element1, int element2); |
||||
|
} |
||||
@ -0,0 +1,164 @@ |
|||||
|
//============================================================================== |
||||
|
// |
||||
|
// Copyright (c) 2016- |
||||
|
// Authors: |
||||
|
// * Steffen Maercker <maercker@tcs.inf.tu-dresden.de> (TU Dresden) |
||||
|
// * Joachim Klein <klein@tcs.inf.tu-dresden.de> (TU Dresden) |
||||
|
// |
||||
|
//------------------------------------------------------------------------------ |
||||
|
// |
||||
|
// This file is part of PRISM. |
||||
|
// |
||||
|
// PRISM is free software; you can redistribute it and/or modify |
||||
|
// it under the terms of the GNU General Public License as published by |
||||
|
// the Free Software Foundation; either version 2 of the License, or |
||||
|
// (at your option) any later version. |
||||
|
// |
||||
|
// PRISM is distributed in the hope that it will be useful, |
||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
// GNU General Public License for more details. |
||||
|
// |
||||
|
// You should have received a copy of the GNU General Public License |
||||
|
// along with PRISM; if not, write to the Free Software Foundation, |
||||
|
// Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||||
|
// |
||||
|
//============================================================================== |
||||
|
|
||||
|
package common.iterable; |
||||
|
|
||||
|
import java.util.Iterator; |
||||
|
import java.util.PrimitiveIterator; |
||||
|
import java.util.function.DoublePredicate; |
||||
|
import java.util.function.IntPredicate; |
||||
|
import java.util.function.LongPredicate; |
||||
|
import java.util.function.Predicate; |
||||
|
|
||||
|
/** |
||||
|
* Base class for Iterables around FilteringIterators, |
||||
|
* static constructors for deduplicating entries. */ |
||||
|
public abstract class FilteringIterable<T> implements Iterable<T> |
||||
|
{ |
||||
|
protected final Iterable<T> iterable; |
||||
|
|
||||
|
public FilteringIterable(final Iterable<T> iterable) |
||||
|
{ |
||||
|
this.iterable = iterable; |
||||
|
} |
||||
|
|
||||
|
public static class Of<T> extends FilteringIterable<T> |
||||
|
{ |
||||
|
private Predicate<? super T> predicate; |
||||
|
|
||||
|
public Of(Iterable<T> iterable, Predicate<? super T> predicate) |
||||
|
{ |
||||
|
super(iterable); |
||||
|
this.predicate = predicate; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public Iterator<T> iterator() |
||||
|
{ |
||||
|
return new FilteringIterator.Of<>(iterable, predicate); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public static class OfInt extends FilteringIterable<Integer> implements IterableInt |
||||
|
{ |
||||
|
private IntPredicate predicate; |
||||
|
|
||||
|
public OfInt(IterableInt iterable, IntPredicate predicate) |
||||
|
{ |
||||
|
super(iterable); |
||||
|
this.predicate = predicate; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public PrimitiveIterator.OfInt iterator() |
||||
|
{ |
||||
|
return new FilteringIterator.OfInt((IterableInt) iterable, predicate); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public static class OfLong extends FilteringIterable<Long> implements IterableLong |
||||
|
{ |
||||
|
private LongPredicate predicate; |
||||
|
|
||||
|
public OfLong(IterableLong iterable, LongPredicate predicate) |
||||
|
{ |
||||
|
super(iterable); |
||||
|
this.predicate = predicate; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public PrimitiveIterator.OfLong iterator() |
||||
|
{ |
||||
|
return new FilteringIterator.OfLong((IterableLong) iterable, predicate); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public static class OfDouble extends FilteringIterable<Double> implements IterableDouble |
||||
|
{ |
||||
|
private DoublePredicate predicate; |
||||
|
|
||||
|
public OfDouble(IterableDouble iterable, DoublePredicate predicate) |
||||
|
{ |
||||
|
super(iterable); |
||||
|
this.predicate = predicate; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public PrimitiveIterator.OfDouble iterator() |
||||
|
{ |
||||
|
return new FilteringIterator.OfDouble((IterableDouble) iterable, predicate); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public static IterableInt dedupe(IterableInt iterable) |
||||
|
{ |
||||
|
return new IterableInt() |
||||
|
{ |
||||
|
@Override |
||||
|
public PrimitiveIterator.OfInt iterator() |
||||
|
{ |
||||
|
return FilteringIterator.dedupe(iterable.iterator()); |
||||
|
} |
||||
|
}; |
||||
|
} |
||||
|
|
||||
|
public static IterableLong dedupe(IterableLong iterable) |
||||
|
{ |
||||
|
return new IterableLong() |
||||
|
{ |
||||
|
@Override |
||||
|
public PrimitiveIterator.OfLong iterator() |
||||
|
{ |
||||
|
return FilteringIterator.dedupe(iterable.iterator()); |
||||
|
} |
||||
|
}; |
||||
|
} |
||||
|
|
||||
|
public static IterableDouble dedupe(IterableDouble iterable) |
||||
|
{ |
||||
|
return new IterableDouble() |
||||
|
{ |
||||
|
@Override |
||||
|
public PrimitiveIterator.OfDouble iterator() |
||||
|
{ |
||||
|
return FilteringIterator.dedupe(iterable.iterator()); |
||||
|
} |
||||
|
}; |
||||
|
} |
||||
|
|
||||
|
public static <T> Iterable<T> dedupe(Iterable<T> iterable) |
||||
|
{ |
||||
|
return new Iterable<T>() |
||||
|
{ |
||||
|
@Override |
||||
|
public Iterator<T> iterator() |
||||
|
{ |
||||
|
return FilteringIterator.dedupe(iterable.iterator()); |
||||
|
} |
||||
|
}; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,463 @@ |
|||||
|
package common.iterable; |
||||
|
|
||||
|
import java.util.Iterator; |
||||
|
import java.util.PrimitiveIterator.OfDouble; |
||||
|
import java.util.PrimitiveIterator.OfInt; |
||||
|
import java.util.PrimitiveIterator.OfLong; |
||||
|
import java.util.function.DoubleFunction; |
||||
|
import java.util.function.DoubleToIntFunction; |
||||
|
import java.util.function.DoubleToLongFunction; |
||||
|
import java.util.function.DoubleUnaryOperator; |
||||
|
import java.util.function.Function; |
||||
|
import java.util.function.IntFunction; |
||||
|
import java.util.function.IntToDoubleFunction; |
||||
|
import java.util.function.IntToLongFunction; |
||||
|
import java.util.function.IntUnaryOperator; |
||||
|
import java.util.function.LongFunction; |
||||
|
import java.util.function.LongToDoubleFunction; |
||||
|
import java.util.function.LongToIntFunction; |
||||
|
import java.util.function.LongUnaryOperator; |
||||
|
import java.util.function.ToDoubleFunction; |
||||
|
import java.util.function.ToIntFunction; |
||||
|
import java.util.function.ToLongFunction; |
||||
|
|
||||
|
/** Helpers for mapping Iterators to another Iterator, performing some mapping on the elements */ |
||||
|
public abstract class MappingIterator<S, T> implements Iterator<T> |
||||
|
{ |
||||
|
protected final Iterator<S> iterator; |
||||
|
|
||||
|
public MappingIterator(Iterable<S> iterable) |
||||
|
{ |
||||
|
this(iterable.iterator()); |
||||
|
} |
||||
|
|
||||
|
public MappingIterator(Iterator<S> iterator) |
||||
|
{ |
||||
|
this.iterator = iterator; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public boolean hasNext() |
||||
|
{ |
||||
|
return iterator.hasNext(); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void remove() |
||||
|
{ |
||||
|
iterator.remove(); |
||||
|
} |
||||
|
|
||||
|
/** Map an Iterator<S> to an Iterator<T> using the given mapping function */ |
||||
|
public static class From<S, T> extends MappingIterator<S, T> |
||||
|
{ |
||||
|
protected final Function<? super S, T> function; |
||||
|
|
||||
|
public From(Iterable<S> iterable, Function<? super S, T> function) |
||||
|
{ |
||||
|
this(iterable.iterator(), function); |
||||
|
} |
||||
|
|
||||
|
public From(Iterator<S> iterator, Function<? super S, T> function) |
||||
|
{ |
||||
|
super(iterator); |
||||
|
this.function = function; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public T next() |
||||
|
{ |
||||
|
return function.apply(iterator.next()); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** Map an Iterable<Integer> to a PrimitiveIterator.OfInt */ |
||||
|
public static OfInt toInt(Iterable<Integer> iterable) |
||||
|
{ |
||||
|
return toInt(iterable.iterator()); |
||||
|
} |
||||
|
|
||||
|
/** Map an Iterator<Integer> to a PrimitiveIterator.OfInt */ |
||||
|
public static OfInt toInt(Iterator<Integer> iterator) |
||||
|
{ |
||||
|
if (iterator instanceof OfInt) { |
||||
|
return (OfInt) iterator; |
||||
|
} |
||||
|
return new ToInt<>(iterator, Integer::intValue); |
||||
|
} |
||||
|
|
||||
|
/** Map an Iterator<S> to a PrimitiveIterator.OfInt using the given mapping function */ |
||||
|
public static class ToInt<S> extends MappingIterator<S, Integer> implements OfInt |
||||
|
{ |
||||
|
protected ToIntFunction<? super S> function; |
||||
|
|
||||
|
public ToInt(Iterable<S> iterable, ToIntFunction<? super S> function) |
||||
|
{ |
||||
|
this(iterable.iterator(), function); |
||||
|
} |
||||
|
|
||||
|
public ToInt(Iterator<S> iterator, ToIntFunction<? super S> function) |
||||
|
{ |
||||
|
super(iterator); |
||||
|
this.function = function; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public int nextInt() |
||||
|
{ |
||||
|
return function.applyAsInt(iterator.next()); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** Map an Iterable<Double> to a PrimitiveIterator.OfDouble */ |
||||
|
public static OfDouble toDouble(Iterable<Double> iterable) |
||||
|
{ |
||||
|
return toDouble(iterable.iterator()); |
||||
|
} |
||||
|
|
||||
|
/** Map an Iterator<Double> to a PrimitiveIterator.OfDouble */ |
||||
|
public static OfDouble toDouble(Iterator<Double> iterator) |
||||
|
{ |
||||
|
if (iterator instanceof OfDouble) { |
||||
|
return (OfDouble) iterator; |
||||
|
} |
||||
|
return new ToDouble<>(iterator, Double::doubleValue); |
||||
|
} |
||||
|
|
||||
|
/** Map an Iterator<S> to a PrimitiveIterator.OfDouble using the given mapping function */ |
||||
|
public static class ToDouble<S> extends MappingIterator<S, Double> implements OfDouble |
||||
|
{ |
||||
|
protected ToDoubleFunction<? super S> function; |
||||
|
|
||||
|
public ToDouble(Iterable<S> iterable, ToDoubleFunction<? super S> function) |
||||
|
{ |
||||
|
this(iterable.iterator(), function); |
||||
|
} |
||||
|
|
||||
|
public ToDouble(Iterator<S> iterator, ToDoubleFunction<? super S> function) |
||||
|
{ |
||||
|
super(iterator); |
||||
|
this.function = function; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public double nextDouble() |
||||
|
{ |
||||
|
return function.applyAsDouble(iterator.next()); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** Map an Iterable<Long> to a PrimitiveIterator.OfLong */ |
||||
|
public static OfLong toLong(Iterable<Long> iterable) |
||||
|
{ |
||||
|
return toLong(iterable.iterator()); |
||||
|
} |
||||
|
|
||||
|
/** Map an Iterator<Long> to a PrimitiveIterator.OfLong */ |
||||
|
public static OfLong toLong(Iterator<Long> iterator) |
||||
|
{ |
||||
|
if (iterator instanceof OfLong) { |
||||
|
return (OfLong) iterator; |
||||
|
} |
||||
|
return new ToLong<>(iterator, Long::longValue); |
||||
|
} |
||||
|
|
||||
|
/** Map an Iterator<S> to a PrimitiveIterator.OfLong using the given mapping function */ |
||||
|
public static class ToLong<S> extends MappingIterator<S, Long> implements OfLong |
||||
|
{ |
||||
|
protected ToLongFunction<? super S> function; |
||||
|
|
||||
|
public ToLong(Iterable<S> iterable, ToLongFunction<? super S> function) |
||||
|
{ |
||||
|
this(iterable.iterator(), function); |
||||
|
} |
||||
|
|
||||
|
public ToLong(Iterator<S> iterator, ToLongFunction<? super S> function) |
||||
|
{ |
||||
|
super(iterator); |
||||
|
this.function = function; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public long nextLong() |
||||
|
{ |
||||
|
return function.applyAsLong(iterator.next()); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** Map an iterator over integers to an iterator over T */ |
||||
|
public static class FromInt<T> extends MappingIterator<Integer, T> |
||||
|
{ |
||||
|
protected IntFunction<T> function; |
||||
|
|
||||
|
public FromInt(IterableInt iterable, IntFunction<T> function) |
||||
|
{ |
||||
|
this(iterable.iterator(), function); |
||||
|
} |
||||
|
|
||||
|
public FromInt(OfInt iterator, IntFunction<T> function) |
||||
|
{ |
||||
|
super(iterator); |
||||
|
this.function = function; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public T next() |
||||
|
{ |
||||
|
return function.apply(((OfInt) iterator).nextInt()); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** Map an iterator over integers to another iterator over integers */ |
||||
|
public static class FromIntToInt extends MappingIterator<Integer, Integer> implements OfInt |
||||
|
{ |
||||
|
protected IntUnaryOperator function; |
||||
|
|
||||
|
public FromIntToInt(IterableInt iterable, IntUnaryOperator function) |
||||
|
{ |
||||
|
this(iterable.iterator(), function); |
||||
|
} |
||||
|
|
||||
|
public FromIntToInt(OfInt iterator, IntUnaryOperator function) |
||||
|
{ |
||||
|
super(iterator); |
||||
|
this.function = function; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public int nextInt() |
||||
|
{ |
||||
|
return function.applyAsInt(((OfInt) iterator).nextInt()); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** Map an iterator over integers to iterator over doubles */ |
||||
|
public static class FromIntToDouble extends MappingIterator<Integer, Double> implements OfDouble |
||||
|
{ |
||||
|
protected IntToDoubleFunction function; |
||||
|
|
||||
|
public FromIntToDouble(IterableInt iterable, IntToDoubleFunction function) |
||||
|
{ |
||||
|
this(iterable.iterator(), function); |
||||
|
} |
||||
|
|
||||
|
public FromIntToDouble(OfInt iterator, IntToDoubleFunction function) |
||||
|
{ |
||||
|
super(iterator); |
||||
|
this.function = function; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public double nextDouble() |
||||
|
{ |
||||
|
return function.applyAsDouble(((OfInt) iterator).nextInt()); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** Map an iterator over integers to iterator over longs */ |
||||
|
public static class FromIntToLong extends MappingIterator<Integer, Long> implements OfLong |
||||
|
{ |
||||
|
protected IntToLongFunction function; |
||||
|
|
||||
|
public FromIntToLong(IterableInt iterable, IntToLongFunction function) |
||||
|
{ |
||||
|
this(iterable.iterator(), function); |
||||
|
} |
||||
|
|
||||
|
public FromIntToLong(OfInt iterator, IntToLongFunction function) |
||||
|
{ |
||||
|
super(iterator); |
||||
|
this.function = function; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public long nextLong() |
||||
|
{ |
||||
|
return function.applyAsLong(((OfInt) iterator).nextInt()); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** Map an iterator over doubles to an iterator over T */ |
||||
|
public static class FromDouble<T> extends MappingIterator<Double, T> |
||||
|
{ |
||||
|
protected DoubleFunction<T> function; |
||||
|
|
||||
|
public FromDouble(IterableDouble iterable, DoubleFunction<T> function) |
||||
|
{ |
||||
|
this(iterable.iterator(), function); |
||||
|
} |
||||
|
|
||||
|
public FromDouble(OfDouble iterator, DoubleFunction<T> function) |
||||
|
{ |
||||
|
super(iterator); |
||||
|
this.function = function; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public T next() |
||||
|
{ |
||||
|
return function.apply(((OfDouble) iterator).nextDouble()); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** Map an iterator over doubles to an iterator over integers */ |
||||
|
public static class FromDoubleToInt extends MappingIterator<Double, Integer> implements OfInt |
||||
|
{ |
||||
|
protected DoubleToIntFunction function; |
||||
|
|
||||
|
public FromDoubleToInt(IterableDouble iterable, DoubleToIntFunction function) |
||||
|
{ |
||||
|
this(iterable.iterator(), function); |
||||
|
} |
||||
|
|
||||
|
public FromDoubleToInt(OfDouble iterator, DoubleToIntFunction function) |
||||
|
{ |
||||
|
super(iterator); |
||||
|
this.function = function; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public int nextInt() |
||||
|
{ |
||||
|
return function.applyAsInt(((OfDouble) iterator).nextDouble()); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** Map an iterator over doubles to another iterator over doubles */ |
||||
|
public static class FromDoubleToDouble extends MappingIterator<Double, Double> implements OfDouble |
||||
|
{ |
||||
|
protected DoubleUnaryOperator function; |
||||
|
|
||||
|
public FromDoubleToDouble(IterableDouble iterable, DoubleUnaryOperator function) |
||||
|
{ |
||||
|
this(iterable.iterator(), function); |
||||
|
} |
||||
|
|
||||
|
public FromDoubleToDouble(OfDouble iterator, DoubleUnaryOperator function) |
||||
|
{ |
||||
|
super(iterator); |
||||
|
this.function = function; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public double nextDouble() |
||||
|
{ |
||||
|
return function.applyAsDouble(((OfDouble) iterator).nextDouble()); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** Map an iterator over doubles to an iterator over longs */ |
||||
|
public static class FromDoubleToLong extends MappingIterator<Double, Long> implements OfLong |
||||
|
{ |
||||
|
protected DoubleToLongFunction function; |
||||
|
|
||||
|
public FromDoubleToLong(IterableDouble iterable, DoubleToLongFunction function) |
||||
|
{ |
||||
|
this(iterable.iterator(), function); |
||||
|
} |
||||
|
|
||||
|
public FromDoubleToLong(OfDouble iterator, DoubleToLongFunction function) |
||||
|
{ |
||||
|
super(iterator); |
||||
|
this.function = function; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public long nextLong() |
||||
|
{ |
||||
|
return function.applyAsLong(((OfDouble) iterator).nextDouble()); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** Map an iterator over longs to an iterator over T */ |
||||
|
public static class FromLong<T> extends MappingIterator<Long, T> |
||||
|
{ |
||||
|
protected LongFunction<T> function; |
||||
|
|
||||
|
public FromLong(IterableLong iterable, LongFunction<T> function) |
||||
|
{ |
||||
|
this(iterable.iterator(), function); |
||||
|
} |
||||
|
|
||||
|
public FromLong(OfLong iterator, LongFunction<T> function) |
||||
|
{ |
||||
|
super(iterator); |
||||
|
this.function = function; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public T next() |
||||
|
{ |
||||
|
return function.apply(((OfLong) iterator).nextLong()); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** Map an iterator over longs to an iterator over integers */ |
||||
|
public static class FromLongToInt extends MappingIterator<Long, Integer> implements OfInt |
||||
|
{ |
||||
|
protected LongToIntFunction function; |
||||
|
|
||||
|
public FromLongToInt(IterableLong iterable, LongToIntFunction function) |
||||
|
{ |
||||
|
this(iterable.iterator(), function); |
||||
|
} |
||||
|
|
||||
|
public FromLongToInt(OfLong iterator, LongToIntFunction function) |
||||
|
{ |
||||
|
super(iterator); |
||||
|
this.function = function; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public int nextInt() |
||||
|
{ |
||||
|
return function.applyAsInt(((OfLong) iterator).nextLong()); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** Map an iterator over longs to an iterator over doubles */ |
||||
|
public static class FromLongToDouble extends MappingIterator<Long, Double> implements OfDouble |
||||
|
{ |
||||
|
protected LongToDoubleFunction function; |
||||
|
|
||||
|
public FromLongToDouble(IterableLong iterable, LongToDoubleFunction function) |
||||
|
{ |
||||
|
this(iterable.iterator(), function); |
||||
|
} |
||||
|
|
||||
|
public FromLongToDouble(OfLong iterator, LongToDoubleFunction function) |
||||
|
{ |
||||
|
super(iterator); |
||||
|
this.function = function; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public double nextDouble() |
||||
|
{ |
||||
|
return function.applyAsDouble(((OfLong) iterator).nextLong()); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** Map an iterator over longs to another iterator over longs */ |
||||
|
public static class FromLongToLong extends MappingIterator<Long, Long> implements OfLong |
||||
|
{ |
||||
|
protected LongUnaryOperator function; |
||||
|
|
||||
|
public FromLongToLong(IterableLong iterable, LongUnaryOperator function) |
||||
|
{ |
||||
|
this(iterable.iterator(), function); |
||||
|
} |
||||
|
|
||||
|
public FromLongToLong(OfLong iterator, LongUnaryOperator function) |
||||
|
{ |
||||
|
super(iterator); |
||||
|
this.function = function; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public long nextLong() |
||||
|
{ |
||||
|
return function.applyAsLong(((OfLong) iterator).nextLong()); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,70 @@ |
|||||
|
package common.iterable; |
||||
|
|
||||
|
import java.util.Iterator; |
||||
|
|
||||
|
public abstract class SingletonIterable<T> implements Iterable<T> |
||||
|
{ |
||||
|
public static class Of<T> extends SingletonIterable<T> |
||||
|
{ |
||||
|
final T element; |
||||
|
|
||||
|
public Of(T theElement) |
||||
|
{ |
||||
|
element = theElement; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public Iterator<T> iterator() |
||||
|
{ |
||||
|
return new SingletonIterator.Of<>(element); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public static class OfInt extends SingletonIterable<Integer> implements IterableInt |
||||
|
{ |
||||
|
final int element; |
||||
|
|
||||
|
public OfInt(int theElement) |
||||
|
{ |
||||
|
element = theElement; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public SingletonIterator.OfInt iterator() |
||||
|
{ |
||||
|
return new SingletonIterator.OfInt(element); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public static class OfLong extends SingletonIterable<Long> implements IterableLong |
||||
|
{ |
||||
|
final long element; |
||||
|
|
||||
|
public OfLong(long theElement) |
||||
|
{ |
||||
|
element = theElement; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public SingletonIterator.OfLong iterator() |
||||
|
{ |
||||
|
return new SingletonIterator.OfLong(element); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public static class OfDouble extends SingletonIterable<Double> implements IterableDouble |
||||
|
{ |
||||
|
final double element; |
||||
|
|
||||
|
public OfDouble(double theElement) |
||||
|
{ |
||||
|
element = theElement; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public SingletonIterator.OfDouble iterator() |
||||
|
{ |
||||
|
return new SingletonIterator.OfDouble(element); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue