Started Next larger patch.

- Changed: Iterable specific helper functions were moved out of
Iterators and moved into Iterables
- Added: New Stream replacing functions: findFirst, matchesAny/All/None
This commit is contained in:
Speiger 2021-09-15 05:09:14 +02:00
parent 854678fd3c
commit fc1a738625
5 changed files with 175 additions and 91 deletions

View File

@ -1,6 +1,10 @@
# Changelog of versions # Changelog of versions
### Version 0.3.7/0.4.0
- Changed: Iterable specific helper functions were moved out of Iterators and moved into Iterables
- Added: New Stream replacing functions: findFirst, matchesAny/All/None
### Version 0.3.6 ### Version 0.3.6
- Fixed: addAll non Type Specific Lists was causing crashes. - Fixed: addAll non Type Specific Lists was causing crashes.
- Fixed/Changed: clearAndTrim's implementation was all over the place. In some cases causing crash scenarios. - Fixed/Changed: clearAndTrim's implementation was all over the place. In some cases causing crash scenarios.

View File

@ -176,6 +176,7 @@ public class GlobalVariables
addClassMapper("PRIORITY_QUEUES", "PriorityQueues"); addClassMapper("PRIORITY_QUEUES", "PriorityQueues");
addClassMapper("SPLIT_ITERATORS", "Splititerators"); addClassMapper("SPLIT_ITERATORS", "Splititerators");
addClassMapper("ITERATORS", "Iterators"); addClassMapper("ITERATORS", "Iterators");
addClassMapper("ITERABLES", "Iterables");
addBiClassMapper("MAPS", "Maps", "2"); addBiClassMapper("MAPS", "Maps", "2");
//Interfaces //Interfaces
@ -195,6 +196,7 @@ public class GlobalVariables
addClassMapper("NAVIGABLE_SET", "NavigableSet"); addClassMapper("NAVIGABLE_SET", "NavigableSet");
addClassMapper("PRIORITY_QUEUE", "PriorityQueue"); addClassMapper("PRIORITY_QUEUE", "PriorityQueue");
addClassMapper("PRIORITY_DEQUEUE", "PriorityDequeue"); addClassMapper("PRIORITY_DEQUEUE", "PriorityDequeue");
addClassMapper("PREDICATE", "2BooleanFunction");
addClassMapper("SORTED_SET", "SortedSet"); addClassMapper("SORTED_SET", "SortedSet");
addClassMapper("SET", "Set"); addClassMapper("SET", "Set");
addClassMapper("STRATEGY", "Strategy"); addClassMapper("STRATEGY", "Strategy");

View File

@ -7,8 +7,9 @@ import java.util.function.Consumer;
import speiger.src.collections.PACKAGE.functions.CONSUMER; import speiger.src.collections.PACKAGE.functions.CONSUMER;
#else #else
import java.util.function.Function; import java.util.function.Function;
import speiger.src.collections.PACKAGE.utils.ITERATORS; import speiger.src.collections.PACKAGE.utils.ITERABLES;
#endif #endif
import speiger.src.collections.PACKAGE.functions.function.PREDICATE;
import speiger.src.collections.PACKAGE.collections.SPLIT_ITERATOR; import speiger.src.collections.PACKAGE.collections.SPLIT_ITERATOR;
import speiger.src.collections.PACKAGE.utils.SPLIT_ITERATORS; import speiger.src.collections.PACKAGE.utils.SPLIT_ITERATORS;
@ -72,7 +73,7 @@ public interface ITERABLE KEY_GENERIC_TYPE extends Iterable<CLASS_TYPE>
* @return a new Iterable that returns the desired result * @return a new Iterable that returns the desired result
*/ */
public default <E> ObjectIterable<E> map(Function<T, E> map) { public default <E> ObjectIterable<E> map(Function<T, E> map) {
return ObjectIterators.map(this, map); return ObjectIterables.map(this, map);
} }
/** /**
@ -83,7 +84,7 @@ public interface ITERABLE KEY_GENERIC_TYPE extends Iterable<CLASS_TYPE>
* @return a new Iterable that returns the desired result * @return a new Iterable that returns the desired result
*/ */
public default <E, V extends Iterable<E>> ObjectIterable<E> flatMap(Function<T, V> map) { public default <E, V extends Iterable<E>> ObjectIterable<E> flatMap(Function<T, V> map) {
return ObjectIterators.flatMap(this, map); return ObjectIterables.flatMap(this, map);
} }
/** /**
@ -93,8 +94,72 @@ public interface ITERABLE KEY_GENERIC_TYPE extends Iterable<CLASS_TYPE>
* @return a new Iterable that returns the desired result * @return a new Iterable that returns the desired result
*/ */
public default <E> ObjectIterable<E> arrayflatMap(Function<T, E[]> map) { public default <E> ObjectIterable<E> arrayflatMap(Function<T, E[]> map) {
return ObjectIterators.arrayFlatMap(this, map); return ObjectIterables.arrayFlatMap(this, map);
} }
#endif
/**
* Helper function to reduce stream usage that allows to filter for any matches.
* @param filter that should be applied
* @return true if any matches were found
*/
public default boolean matchesAny(PREDICATE KEY_GENERIC_TYPE filter) {
for(ITERATOR KEY_GENERIC_TYPE iter = iterator();iter.hasNext();) {
#if TYPE_OBJECT
if(filter.getBoolean(iter.NEXT())) return true;
#else
if(filter.GET_VALUE(iter.NEXT())) return true;
#endif #endif
} }
return false;
}
/**
* Helper function to reduce stream usage that allows to filter for no matches.
* @param filter that should be applied
* @return true if no matches were found
*/
public default boolean matchesNone(PREDICATE KEY_GENERIC_TYPE filter) {
for(ITERATOR KEY_GENERIC_TYPE iter = iterator();iter.hasNext();) {
#if TYPE_OBJECT
if(filter.getBoolean(iter.NEXT())) return false;
#else
if(filter.GET_VALUE(iter.NEXT())) return false;
#endif
}
return true;
}
/**
* Helper function to reduce stream usage that allows to filter for all matches.
* @param filter that should be applied
* @return true if all matches.
*/
public default boolean matchesAll(PREDICATE KEY_GENERIC_TYPE filter) {
for(ITERATOR KEY_GENERIC_TYPE iter = iterator();iter.hasNext();) {
#if TYPE_OBJECT
if(!filter.getBoolean(iter.NEXT())) return false;
#else
if(!filter.GET_VALUE(iter.NEXT())) return false;
#endif
}
return true;
}
/**
* Helper function to reduce stream usage that allows to filter for the first match.
* @param filter that should be applied
* @return the found value or the null equivalent variant.
*/
public default KEY_TYPE findFirst(PREDICATE KEY_GENERIC_TYPE filter) {
for(ITERATOR KEY_GENERIC_TYPE iter = iterator();iter.hasNext();) {
KEY_TYPE entry = iter.NEXT();
#if TYPE_OBJECT
if(filter.getBoolean(entry)) return entry;
#else
if(filter.GET_VALUE(entry)) return entry;
#endif
}
return EMPTY_VALUE;
}
}

View File

@ -0,0 +1,100 @@
package speiger.src.collections.PACKAGE.utils;
#if TYPE_OBJECT
import java.util.function.Function;
import speiger.src.collections.PACKAGE.collections.ITERABLE;
import speiger.src.collections.PACKAGE.collections.ITERATOR;
#endif
/**
* A Helper class for Iterables
*/
public class ITERABLES
{
#if TYPE_OBJECT
/**
* A Helper function that maps a Iterable into a new Type.
* @param iterable the iterable that should be mapped
* @param mapper the function that decides what the result turns into.
* @Type(T)
* @Type(E)
* @return a iterable that is mapped to a new result
*/
public static <T, E> ITERABLE<T> map(ITERABLE<E> iterable, Function<E, T> mapper) {
return new MappedIterableBRACES(iterable, mapper);
}
/**
* A Helper function that flatMaps a Iterable into a new Type.
* @param iterable the iterable that should be flatMapped
* @param mapper the function that decides what the result turns into.
* @Type(T)
* @Type(V)
* @Type(E)
* @return a iterable that is flatMapped to a new result
*/
public static <T, E, V extends Iterable<T>> ITERABLE<T> flatMap(ITERABLE<E> iterable, Function<E, V> mapper) {
return new FlatMappedIterableBRACES(iterable, mapper);
}
/**
* A Helper function that flatMaps a Iterable into a new Type.
* @param iterable the iterable that should be flatMapped
* @param mapper the function that decides what the result turns into.
* @Type(T)
* @Type(E)
* @return a iterable that is flatMapped to a new result
*/
public static <T, E> ITERABLE<T> arrayFlatMap(ITERABLE<E> iterable, Function<E, T[]> mapper) {
return new FlatMappedArrayIterableBRACES(iterable, mapper);
}
private static class MappedIterable<E, T> implements ITERABLE<T>
{
ITERABLE<E> iterable;
Function<E, T> mapper;
MappedIterable(ITERABLE<E> iterable, Function<E, T> mapper) {
this.iterable = iterable;
this.mapper = mapper;
}
public ITERATOR<T> iterator() {
return ITERATORS.map(iterable.iterator(), mapper);
}
}
private static class FlatMappedIterable<E, T, V extends Iterable<T>> implements ITERABLE<T>
{
ITERABLE<E> iterable;
Function<E, V> mapper;
FlatMappedIterable(ITERABLE<E> iterable, Function<E, V> mapper) {
this.iterable = iterable;
this.mapper = mapper;
}
@Override
public ITERATOR<T> iterator() {
return ITERATORS.flatMap(iterable.iterator(), mapper);
}
}
private static class FlatMappedArrayIterable<E, T> implements ITERABLE<T>
{
ITERABLE<E> iterable;
Function<E, T[]> mapper;
FlatMappedArrayIterable(ITERABLE<E> iterable, Function<E, T[]> mapper) {
this.iterable = iterable;
this.mapper = mapper;
}
@Override
public ITERATOR<T> iterator() {
return ITERATORS.arrayFlatMap(iterable.iterator(), mapper);
}
}
#endif
}

View File

@ -12,9 +12,6 @@ import speiger.src.collections.PACKAGE.lists.LIST;
import speiger.src.collections.PACKAGE.lists.LIST_ITERATOR; import speiger.src.collections.PACKAGE.lists.LIST_ITERATOR;
import speiger.src.collections.PACKAGE.collections.BI_ITERATOR; import speiger.src.collections.PACKAGE.collections.BI_ITERATOR;
import speiger.src.collections.PACKAGE.collections.COLLECTION; import speiger.src.collections.PACKAGE.collections.COLLECTION;
#if TYPE_OBJECT
import speiger.src.collections.PACKAGE.collections.ITERABLE;
#endif
/** /**
* A Helper class for Iterators * A Helper class for Iterators
@ -90,18 +87,6 @@ public class ITERATORS
} }
#if TYPE_OBJECT #if TYPE_OBJECT
/**
* A Helper function that maps a Iterable into a new Type.
* @param iterable the iterable that should be mapped
* @param mapper the function that decides what the result turns into.
* @Type(T)
* @Type(E)
* @return a iterable that is mapped to a new result
*/
public static <T, E> ITERABLE<T> map(ITERABLE<E> iterable, Function<E, T> mapper) {
return new MappedIterableBRACES(iterable, mapper);
}
/** /**
* A Helper function that maps a Iterator into a new Type. * A Helper function that maps a Iterator into a new Type.
* @param iterator that should be mapped * @param iterator that should be mapped
@ -114,31 +99,6 @@ public class ITERATORS
return new MappedIteratorBRACES(iterator, mapper); return new MappedIteratorBRACES(iterator, mapper);
} }
/**
* A Helper function that flatMaps a Iterable into a new Type.
* @param iterable the iterable that should be flatMapped
* @param mapper the function that decides what the result turns into.
* @Type(T)
* @Type(V)
* @Type(E)
* @return a iterable that is flatMapped to a new result
*/
public static <T, E, V extends Iterable<T>> ITERABLE<T> flatMap(ITERABLE<E> iterable, Function<E, V> mapper) {
return new FlatMappedIterableBRACES(iterable, mapper);
}
/**
* A Helper function that flatMaps a Iterable into a new Type.
* @param iterable the iterable that should be flatMapped
* @param mapper the function that decides what the result turns into.
* @Type(T)
* @Type(E)
* @return a iterable that is flatMapped to a new result
*/
public static <T, E> ITERABLE<T> arrayFlatMap(ITERABLE<E> iterable, Function<E, T[]> mapper) {
return new FlatMappedArrayIterableBRACES(iterable, mapper);
}
/** /**
* A Helper function that flatMaps a Iterator into a new Type. * A Helper function that flatMaps a Iterator into a new Type.
* @param iterator that should be flatMapped * @param iterator that should be flatMapped
@ -682,21 +642,6 @@ public class ITERATORS
} }
#if TYPE_OBJECT #if TYPE_OBJECT
private static class MappedIterable<E, T> implements ITERABLE<T>
{
ITERABLE<E> iterable;
Function<E, T> mapper;
MappedIterable(ITERABLE<E> iterable, Function<E, T> mapper) {
this.iterable = iterable;
this.mapper = mapper;
}
public ITERATOR<T> iterator() {
return new MappedIterator<>(iterable.iterator(), mapper);
}
}
private static class MappedIterator<E, T> implements ITERATOR<T> private static class MappedIterator<E, T> implements ITERATOR<T>
{ {
ITERATOR<E> iterator; ITERATOR<E> iterator;
@ -723,38 +668,6 @@ public class ITERATORS
} }
} }
private static class FlatMappedIterable<E, T, V extends Iterable<T>> implements ITERABLE<T>
{
ITERABLE<E> iterable;
Function<E, V> mapper;
FlatMappedIterable(ITERABLE<E> iterable, Function<E, V> mapper) {
this.iterable = iterable;
this.mapper = mapper;
}
@Override
public ITERATOR<T> iterator() {
return new FlatMappedIterator<>(iterable.iterator(), mapper);
}
}
private static class FlatMappedArrayIterable<E, T> implements ITERABLE<T>
{
ITERABLE<E> iterable;
Function<E, T[]> mapper;
FlatMappedArrayIterable(ITERABLE<E> iterable, Function<E, T[]> mapper) {
this.iterable = iterable;
this.mapper = mapper;
}
@Override
public ITERATOR<T> iterator() {
return new FlatMappedArrayIterator<>(iterable.iterator(), mapper);
}
}
private static class FlatMappedIterator<E, T, V extends Iterable<T>> implements ITERATOR<T> private static class FlatMappedIterator<E, T, V extends Iterable<T>> implements ITERATOR<T>
{ {
ITERATOR<E> iterator; ITERATOR<E> iterator;