summaryrefslogtreecommitdiff
path: root/src/main/java/sevenUnits/utils/ConditionalExistenceCollections.java
diff options
context:
space:
mode:
authorAdrien Hopkins <adrien.p.hopkins@gmail.com>2025-06-15 19:42:01 -0500
committerAdrien Hopkins <adrien.p.hopkins@gmail.com>2025-06-15 19:42:01 -0500
commit2fdbc084fd1d78f0b7633db34460b1195de264f3 (patch)
tree4c908950d9b049394f8160b8159b498aec586ecc /src/main/java/sevenUnits/utils/ConditionalExistenceCollections.java
parented53492243ecad8d975401a97f5b634328ad2c71 (diff)
parentbccb5b5e3452421c81c1fb58f83391ba6584807c (diff)
Merge release 1.0.0 into stable branchHEADstable
See the tag 'v1.0.0' or the changelog for more information about this release.
Diffstat (limited to 'src/main/java/sevenUnits/utils/ConditionalExistenceCollections.java')
-rw-r--r--src/main/java/sevenUnits/utils/ConditionalExistenceCollections.java80
1 files changed, 46 insertions, 34 deletions
diff --git a/src/main/java/sevenUnits/utils/ConditionalExistenceCollections.java b/src/main/java/sevenUnits/utils/ConditionalExistenceCollections.java
index b71a4e0..6244ee6 100644
--- a/src/main/java/sevenUnits/utils/ConditionalExistenceCollections.java
+++ b/src/main/java/sevenUnits/utils/ConditionalExistenceCollections.java
@@ -1,5 +1,5 @@
/**
- * Copyright (C) 2019 Adrien Hopkins
+ * Copyright (C) 2019, 2021, 2024, 2025 Adrien Hopkins
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
@@ -49,18 +49,19 @@ import java.util.function.Predicate;
* Other than that, <i>the only difference between the provided collections and
* the returned collections are that elements don't exist if they don't pass the
* provided condition</i>.
- *
- *
+ *
+ *
* @author Adrien Hopkins
* @since 2019-10-17
+ * @since v0.3.0
*/
-// TODO add conditional existence Lists and Sorted/Navigable Sets/Maps
public final class ConditionalExistenceCollections {
/**
* Elements in this collection only exist if they meet a condition.
- *
+ *
* @author Adrien Hopkins
* @since 2019-10-17
+ * @since v0.3.0
* @param <E> type of element in collection
*/
static final class ConditionalExistenceCollection<E>
@@ -70,10 +71,11 @@ public final class ConditionalExistenceCollections {
/**
* Creates the {@code ConditionalExistenceCollection}.
- *
+ *
* @param collection
* @param existenceCondition
* @since 2019-10-17
+ * @since v0.3.0
*/
private ConditionalExistenceCollection(final Collection<E> collection,
final Predicate<E> existenceCondition) {
@@ -101,7 +103,7 @@ public final class ConditionalExistenceCollections {
// instance of E
// therefore this cast will always work
@SuppressWarnings("unchecked")
- final E e = (E) o;
+ final var e = (E) o;
return this.existenceCondition.test(e);
}
@@ -116,7 +118,7 @@ public final class ConditionalExistenceCollections {
public boolean remove(final Object o) {
// remove() must be first in the && statement, otherwise it may not
// execute
- final boolean containedObject = this.contains(o);
+ final var containedObject = this.contains(o);
return this.collection.remove(o) && containedObject;
}
@@ -147,9 +149,10 @@ public final class ConditionalExistenceCollections {
/**
* Elements in this wrapper iterator only exist if they pass a condition.
- *
+ *
* @author Adrien Hopkins
* @since 2019-10-17
+ * @since v0.3.0
* @param <E> type of elements in iterator
*/
static final class ConditionalExistenceIterator<E> implements Iterator<E> {
@@ -160,10 +163,11 @@ public final class ConditionalExistenceCollections {
/**
* Creates the {@code ConditionalExistenceIterator}.
- *
+ *
* @param iterator
* @param condition
* @since 2019-10-17
+ * @since v0.3.0
*/
private ConditionalExistenceIterator(final Iterator<E> iterator,
final Predicate<E> condition) {
@@ -174,8 +178,9 @@ public final class ConditionalExistenceCollections {
/**
* Gets the next element, and sets nextElement and hasNext accordingly.
- *
+ *
* @since 2019-10-17
+ * @since v0.3.0
*/
private void getAndSetNextElement() {
do {
@@ -197,11 +202,11 @@ public final class ConditionalExistenceCollections {
@Override
public E next() {
if (this.hasNext()) {
- final E next = this.nextElement;
+ final var next = this.nextElement;
this.getAndSetNextElement();
return next;
- } else
- throw new NoSuchElementException();
+ }
+ throw new NoSuchElementException();
}
@Override
@@ -212,9 +217,10 @@ public final class ConditionalExistenceCollections {
/**
* Mappings in this map only exist if the entry passes some condition.
- *
+ *
* @author Adrien Hopkins
* @since 2019-10-17
+ * @since v0.3.0
* @param <K> key type
* @param <V> value type
*/
@@ -224,10 +230,11 @@ public final class ConditionalExistenceCollections {
/**
* Creates the {@code ConditionalExistenceMap}.
- *
+ *
* @param map
* @param entryExistenceCondition
* @since 2019-10-17
+ * @since v0.3.0
*/
private ConditionalExistenceMap(final Map<K, V> map,
final Predicate<Entry<K, V>> entryExistenceCondition) {
@@ -243,10 +250,10 @@ public final class ConditionalExistenceCollections {
// only instances of K have mappings in the backing map
// since we know that key is a valid key, it must be an instance of K
@SuppressWarnings("unchecked")
- final K keyAsK = (K) key;
+ final var keyAsK = (K) key;
// get and test entry
- final V value = this.map.get(key);
+ final var value = this.map.get(key);
final Entry<K, V> entry = new SimpleEntry<>(keyAsK, value);
return this.entryExistenceCondition.test(entry);
}
@@ -262,7 +269,7 @@ public final class ConditionalExistenceCollections {
return this.containsKey(key) ? this.map.get(key) : null;
}
- private final Entry<K, V> getEntry(K key) {
+ private Entry<K, V> getEntry(K key) {
return new Entry<>() {
@Override
public K getKey() {
@@ -289,7 +296,7 @@ public final class ConditionalExistenceCollections {
@Override
public V put(final K key, final V value) {
- final V oldValue = this.map.put(key, value);
+ final var oldValue = this.map.put(key, value);
// get and test entry
final Entry<K, V> entry = new SimpleEntry<>(key, oldValue);
@@ -298,7 +305,7 @@ public final class ConditionalExistenceCollections {
@Override
public V remove(final Object key) {
- final V oldValue = this.map.remove(key);
+ final var oldValue = this.map.remove(key);
return this.containsKey(key) ? oldValue : null;
}
@@ -311,9 +318,10 @@ public final class ConditionalExistenceCollections {
/**
* Elements in this set only exist if a certain condition is true.
- *
+ *
* @author Adrien Hopkins
* @since 2019-10-17
+ * @since v0.3.0
* @param <E> type of element in set
*/
static final class ConditionalExistenceSet<E> extends AbstractSet<E> {
@@ -322,10 +330,11 @@ public final class ConditionalExistenceCollections {
/**
* Creates the {@code ConditionalNonexistenceSet}.
- *
+ *
* @param set set to use
* @param existenceCondition condition where element exists
* @since 2019-10-17
+ * @since v0.3.0
*/
private ConditionalExistenceSet(final Set<E> set,
final Predicate<E> existenceCondition) {
@@ -359,7 +368,7 @@ public final class ConditionalExistenceCollections {
// of E
// therefore this cast will always work
@SuppressWarnings("unchecked")
- final E e = (E) o;
+ final var e = (E) o;
return this.existenceCondition.test(e);
}
@@ -374,7 +383,7 @@ public final class ConditionalExistenceCollections {
public boolean remove(final Object o) {
// remove() must be first in the && statement, otherwise it may not
// execute
- final boolean containedObject = this.contains(o);
+ final var containedObject = this.contains(o);
return this.set.remove(o) && containedObject;
}
@@ -405,14 +414,15 @@ public final class ConditionalExistenceCollections {
/**
* Elements in the returned wrapper collection are ignored if they don't pass
* a condition.
- *
+ *
* @param <E> type of elements in collection
* @param collection collection to wrap
* @param existenceCondition elements only exist if this returns true
* @return wrapper collection
* @since 2019-10-17
+ * @since v0.3.0
*/
- public static final <E> Collection<E> conditionalExistenceCollection(
+ public static <E> Collection<E> conditionalExistenceCollection(
final Collection<E> collection,
final Predicate<E> existenceCondition) {
return new ConditionalExistenceCollection<>(collection,
@@ -422,14 +432,15 @@ public final class ConditionalExistenceCollections {
/**
* Elements in the returned wrapper iterator are ignored if they don't pass a
* condition.
- *
+ *
* @param <E> type of elements in iterator
* @param iterator iterator to wrap
* @param existenceCondition elements only exist if this returns true
* @return wrapper iterator
* @since 2019-10-17
+ * @since v0.3.0
*/
- public static final <E> Iterator<E> conditionalExistenceIterator(
+ public static <E> Iterator<E> conditionalExistenceIterator(
final Iterator<E> iterator, final Predicate<E> existenceCondition) {
return new ConditionalExistenceIterator<>(iterator, existenceCondition);
}
@@ -437,16 +448,16 @@ public final class ConditionalExistenceCollections {
/**
* Mappings in the returned wrapper map are ignored if the corresponding
* entry doesn't pass a condition
- *
+ *
* @param <K> type of key in map
* @param <V> type of value in map
* @param map map to wrap
* @param entryExistenceCondition mappings only exist if this returns true
* @return wrapper map
* @since 2019-10-17
+ * @since v0.3.0
*/
- public static final <K, V> Map<K, V> conditionalExistenceMap(
- final Map<K, V> map,
+ public static <K, V> Map<K, V> conditionalExistenceMap(final Map<K, V> map,
final Predicate<Entry<K, V>> entryExistenceCondition) {
return new ConditionalExistenceMap<>(map, entryExistenceCondition);
}
@@ -454,14 +465,15 @@ public final class ConditionalExistenceCollections {
/**
* Elements in the returned wrapper set are ignored if they don't pass a
* condition.
- *
+ *
* @param <E> type of elements in set
* @param set set to wrap
* @param existenceCondition elements only exist if this returns true
* @return wrapper set
* @since 2019-10-17
+ * @since v0.3.0
*/
- public static final <E> Set<E> conditionalExistenceSet(final Set<E> set,
+ public static <E> Set<E> conditionalExistenceSet(final Set<E> set,
final Predicate<E> existenceCondition) {
return new ConditionalExistenceSet<>(set, existenceCondition);
}