Added New Iterable Feature

-Added: Repeating iterable/iterator/async feature which allows to repeate collections a desired amount of times.
-Added: Tests for it.
This commit is contained in:
Speiger 2022-07-16 05:00:22 +02:00
parent ca33c9eb9e
commit 03b23f0e3c
6 changed files with 160 additions and 0 deletions

View File

@ -149,6 +149,15 @@ public interface ITERABLE KEY_GENERIC_TYPE extends Iterable<CLASS_TYPE>
return ITERABLES.distinct(this);
}
/**
* A Helper function to reduce the usage of Streams and allows to repeat elements a desired amount of times
* @param repeats how many times the elements should be repeated
* @return a Iterable that is repeating multiple times
*/
default ITERABLE KEY_GENERIC_TYPE repeat(int repeats) {
return ITERABLES.repeat(this, repeats);
}
/**
* A Helper function to reduce the usage of Streams and allows to limit the amount of elements
* @param limit the amount of elements it should be limited to

View File

@ -173,6 +173,16 @@ public class ASYNC_BUILDER KEY_GENERIC_TYPE
return this;
}
/**
* Repeats the elements inside of the Iterable
* @param repeats the amount of times the elements should be repeated
* @return self with a repeater applied
*/
public ASYNC_BUILDER KEY_GENERIC_TYPE repeat(int repeats) {
iterable = ITERABLES.repeat(iterable, repeats);
return this;
}
/**
* Limits how many elements are inside of the Iterable
* @param limit how many elements should max be iterated through

View File

@ -147,6 +147,28 @@ public class ITERABLES
return new DistinctIterableBRACES(wrap(iterable));
}
/**
* A Helper function that repeats the Iterable a specific amount of times
* @param iterable that should be repeated
* @param repeats the amount of times the iterable should be repeated
* @Type(T)
* @return a repeating iterable
*/
public static GENERIC_KEY_BRACES ITERABLE KEY_GENERIC_TYPE repeat(ITERABLE KEY_GENERIC_TYPE iterable, int repeats) {
return new RepeatingIterableBRACES(iterable, repeats);
}
/**
* A Helper function that repeats the Iterable a specific amount of times from a Java Iterable
* @param iterable that should be repeated
* @param repeats the amount of times the iterable should be repeated
* @Type(T)
* @return a repeating iterable
*/
public static GENERIC_KEY_BRACES ITERABLE KEY_GENERIC_TYPE repeat(Iterable<? extends CLASS_TYPE> iterable, int repeats) {
return new RepeatingIterableBRACES(wrap(iterable), repeats);
}
/**
* A Helper function that hard limits the Iterable to a specific size
* @param iterable that should be limited
@ -320,6 +342,42 @@ public class ITERABLES
}
}
private static class RepeatingIterable KEY_GENERIC_TYPE implements ITERABLE KEY_GENERIC_TYPE
{
ITERABLE KEY_GENERIC_TYPE iterable;
int repeats;
public RepeatingIterable(ITERABLE KEY_GENERIC_TYPE iterable, int repeats) {
this.iterable = iterable;
this.repeats = repeats;
}
@Override
public ITERATOR KEY_GENERIC_TYPE iterator() {
return ITERATORS.repeat(iterable.iterator(), repeats);
}
#if !TYPE_OBJECT
@Override
public void forEach(CONSUMER action) {
Objects.requireNonNull(action);
LIST KEY_GENERIC_TYPE list = new ARRAY_LISTBRACES();
iterable.forEach(action.andThen(list::add));
for(int i = 0;i<repeats;i++)
list.forEach(action);
}
#else
@Override
public void forEach(Consumer<? super CLASS_TYPE> action) {
Objects.requireNonNull(action);
LIST KEY_GENERIC_TYPE list = new ARRAY_LISTBRACES();
iterable.forEach(T -> {action.accept(T); list.add(T);});
for(int i = 0;i<repeats;i++)
list.forEach(action);
}
#endif
}
private static class FilteredIterable KEY_GENERIC_TYPE implements ITERABLE KEY_GENERIC_TYPE
{
ITERABLE KEY_GENERIC_TYPE iterable;

View File

@ -215,6 +215,28 @@ public class ITERATORS
return new DistinctIteratorBRACES(wrap(iterator));
}
/**
* A Helper function that repeats the Iterator a specific amount of times
* @param iterator that should be repeated
* @param repeats the amount of times the iterator should be repeated
* @Type(T)
* @return a repeating iterator
*/
public static GENERIC_KEY_BRACES ITERATOR KEY_GENERIC_TYPE repeat(ITERATOR KEY_GENERIC_TYPE iterator, int repeats) {
return new RepeatingIteratorBRACES(iterator, repeats);
}
/**
* A Helper function that repeats the Iterator a specific amount of times from a Java Iterator
* @param iterator that should be repeated
* @param repeats the amount of times the iterator should be repeated
* @Type(T)
* @return a repeating iterator
*/
public static GENERIC_KEY_BRACES ITERATOR KEY_GENERIC_TYPE repeat(Iterator<? extends CLASS_TYPE> iterator, int repeats) {
return new RepeatingIteratorBRACES(wrap(iterator), repeats);
}
/**
* A Helper function that hard limits the Iterator to a specific size
* @param iterator that should be limited
@ -898,6 +920,38 @@ public class ITERATORS
}
}
private static class RepeatingIterator KEY_GENERIC_TYPE implements ITERATOR KEY_GENERIC_TYPE
{
final int repeats;
int index = 0;
ITERATOR KEY_GENERIC_TYPE iter;
LIST KEY_GENERIC_TYPE list = new ARRAY_LISTBRACES();
public RepeatingIterator(ITERATOR KEY_GENERIC_TYPE iter, int repeat) {
this.iter = iter;
this.repeats = repeat;
}
@Override
public boolean hasNext() {
if(iter.hasNext()) return true;
if(index < repeats) {
index++;
iter = list.iterator();
return iter.hasNext();
}
return false;
}
@Override
public KEY_TYPE NEXT() {
if(!hasNext()) throw new NoSuchElementException();
KEY_TYPE value = iter.NEXT();
if(index == 0) list.add(value);
return value;
}
}
private static class SortedIterator KEY_GENERIC_TYPE implements ITERATOR KEY_GENERIC_TYPE
{
ITERATOR KEY_GENERIC_TYPE iterator;

View File

@ -39,6 +39,7 @@ import speiger.src.testers.PACKAGE.tests.iterable.FILE_KEY_TYPEIterableMapTester
import speiger.src.testers.PACKAGE.tests.iterable.FILE_KEY_TYPEIterableMatchesTester;
import speiger.src.testers.PACKAGE.tests.iterable.FILE_KEY_TYPEIterablePeekTester;
import speiger.src.testers.PACKAGE.tests.iterable.FILE_KEY_TYPEIterableReduceTester;
import speiger.src.testers.PACKAGE.tests.iterable.FILE_KEY_TYPEIterableRepeatTester;
import speiger.src.testers.PACKAGE.tests.iterable.FILE_KEY_TYPEIterableSortedTester;
#endif
@ -63,6 +64,7 @@ public class COLLECTION_TEST_BUILDER KEY_GENERIC_TYPE extends CollectionTestSuit
testers.add(FILE_KEY_TYPEIterableMatchesTester.class);
testers.add(FILE_KEY_TYPEIterablePeekTester.class);
testers.add(FILE_KEY_TYPEIterableReduceTester.class);
testers.add(FILE_KEY_TYPEIterableRepeatTester.class);
testers.add(FILE_KEY_TYPEIterableCountTester.class);
testers.add(FILE_KEY_TYPEIterableFindFirstTester.class);
#endif

View File

@ -0,0 +1,27 @@
package speiger.src.testers.PACKAGE.tests.iterable;
import org.junit.Ignore;
import com.google.common.collect.testing.features.CollectionSize;
import speiger.src.collections.PACKAGE.lists.ARRAY_LIST;
import speiger.src.collections.PACKAGE.lists.LIST;
import speiger.src.testers.PACKAGE.tests.base.ABSTRACT_COLLECTION_TESTER;
@Ignore
@SuppressWarnings("javadoc")
public class FILE_KEY_TYPEIterableRepeatTester KEY_GENERIC_TYPE extends ABSTRACT_COLLECTION_TESTER KEY_GENERIC_TYPE
{
#ignore
@CollectionSize.Require(absent = CollectionSize.ZERO)
#endignore
public void testIterableRepeat() {
LIST KEY_GENERIC_TYPE expected = new ARRAY_LISTBRACES();
expected.addAll(collection);
expected.addAll(collection);
expected.addAll(collection);
LIST KEY_GENERIC_TYPE result = collection.repeat(2).pourAsList();
assertEquals(expected.size(), result.size());
assertEquals("Repeat does not retain the iteration order", expected, result);
}
}