You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2021/09/02 16:00:08 UTC

[isis] 01/02: ISIS-2774: Can: support unique(..) by custom bi-predicate

This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 7cfcd3b593d204a856fb7b3d1900d159a01ba741
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Sep 2 17:49:48 2021 +0200

    ISIS-2774: Can<T>: support unique(..) by custom bi-predicate
---
 .../main/java/org/apache/isis/commons/collections/Can.java | 11 ++++++++++-
 .../org/apache/isis/commons/collections/Can_Empty.java     |  7 ++++++-
 .../org/apache/isis/commons/collections/Can_Multiple.java  | 14 ++++++++++++++
 .../org/apache/isis/commons/collections/Can_Singleton.java |  6 ++++++
 4 files changed, 36 insertions(+), 2 deletions(-)

diff --git a/commons/src/main/java/org/apache/isis/commons/collections/Can.java b/commons/src/main/java/org/apache/isis/commons/collections/Can.java
index 3ad6513..fbf6eeb 100644
--- a/commons/src/main/java/org/apache/isis/commons/collections/Can.java
+++ b/commons/src/main/java/org/apache/isis/commons/collections/Can.java
@@ -30,6 +30,7 @@ import java.util.Optional;
 import java.util.Set;
 import java.util.function.BiConsumer;
 import java.util.function.BiFunction;
+import java.util.function.BiPredicate;
 import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Predicate;
@@ -38,9 +39,10 @@ import java.util.stream.Collector;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-import org.springframework.lang.Nullable;
 import javax.enterprise.inject.Instance;
 
+import org.springframework.lang.Nullable;
+
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 
@@ -397,6 +399,13 @@ extends Iterable<T>, Comparable<Can<T>>, Serializable {
 
     /**
      * Returns a {@code Can} with all the elements from this {@code Can}, but
+     * duplicated elements removed, based on given {@code equality} relation.
+     * @return non-null
+     */
+    public Can<T> unique(@NonNull BiPredicate<T, T> equality);
+
+    /**
+     * Returns a {@code Can} with all the elements from this {@code Can}, but
      * contained in reversed order.
      * @return non-null
      */
diff --git a/commons/src/main/java/org/apache/isis/commons/collections/Can_Empty.java b/commons/src/main/java/org/apache/isis/commons/collections/Can_Empty.java
index 7b1fc6a..6fa3786 100644
--- a/commons/src/main/java/org/apache/isis/commons/collections/Can_Empty.java
+++ b/commons/src/main/java/org/apache/isis/commons/collections/Can_Empty.java
@@ -27,6 +27,7 @@ import java.util.Optional;
 import java.util.Set;
 import java.util.function.BiConsumer;
 import java.util.function.BiFunction;
+import java.util.function.BiPredicate;
 import java.util.function.Consumer;
 import java.util.function.Predicate;
 import java.util.function.Supplier;
@@ -106,6 +107,11 @@ final class Can_Empty<T> implements Can<T> {
     }
 
     @Override
+    public Can<T> unique(final @NonNull BiPredicate<T, T> equality) {
+        return this;
+    }
+
+    @Override
     public Can<T> reverse() {
         return this;
     }
@@ -245,5 +251,4 @@ final class Can_Empty<T> implements Can<T> {
     }
 
 
-
 }
diff --git a/commons/src/main/java/org/apache/isis/commons/collections/Can_Multiple.java b/commons/src/main/java/org/apache/isis/commons/collections/Can_Multiple.java
index 0be52ab..1c7c7d5 100644
--- a/commons/src/main/java/org/apache/isis/commons/collections/Can_Multiple.java
+++ b/commons/src/main/java/org/apache/isis/commons/collections/Can_Multiple.java
@@ -29,6 +29,7 @@ import java.util.Optional;
 import java.util.Set;
 import java.util.function.BiConsumer;
 import java.util.function.BiFunction;
+import java.util.function.BiPredicate;
 import java.util.function.Consumer;
 import java.util.function.Predicate;
 import java.util.function.Supplier;
@@ -39,6 +40,7 @@ import org.springframework.lang.Nullable;
 
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.commons.internal.base._Objects;
+import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.collections._Sets;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 
@@ -120,6 +122,18 @@ final class Can_Multiple<T> implements Can<T> {
     }
 
     @Override
+    public Can<T> unique(final @NonNull BiPredicate<T, T> equality) {
+        val list = _Lists.<T>newArrayList();
+        elements
+        .forEach(element->{
+            if(!list.stream().anyMatch(x->equality.test(x, element))) {
+                list.add(element);
+            }
+        });
+        return Can.ofCollection(list);
+    }
+
+    @Override
     public Iterator<T> iterator() {
         return Collections.unmodifiableList(elements).iterator();
     }
diff --git a/commons/src/main/java/org/apache/isis/commons/collections/Can_Singleton.java b/commons/src/main/java/org/apache/isis/commons/collections/Can_Singleton.java
index cc6e2b1..667ffb5 100644
--- a/commons/src/main/java/org/apache/isis/commons/collections/Can_Singleton.java
+++ b/commons/src/main/java/org/apache/isis/commons/collections/Can_Singleton.java
@@ -29,6 +29,7 @@ import java.util.Optional;
 import java.util.Set;
 import java.util.function.BiConsumer;
 import java.util.function.BiFunction;
+import java.util.function.BiPredicate;
 import java.util.function.Consumer;
 import java.util.function.Predicate;
 import java.util.function.Supplier;
@@ -107,6 +108,11 @@ final class Can_Singleton<T> implements Can<T> {
     }
 
     @Override
+    public Can<T> unique(final @NonNull BiPredicate<T, T> equality) {
+        return this;
+    }
+
+    @Override
     public Can<T> reverse() {
         return this;
     }