Ver Fonte

#70 new: CQuery#indexOfEach

Ranides Atterwim há 4 anos atrás
pai
commit
ad7ab388cc

+ 4 - 0
assira.core/src/main/java/net/ranides/assira/collection/query/CQuery.java

@@ -209,10 +209,14 @@ public interface CQuery<T> extends Iterable<T> {
 
     int indexOf(Predicate<? super T> predicate);
 
+    int indexOfEach(EachPredicate<? super T> predicate);
+
     int lastIndexOf(T value);
 
     int lastIndexOf(Predicate<? super T> predicate);
 
+    int lastIndexOfEach(EachPredicate<? super T> predicate);
+
     <R> R apply(Function<? extends CQuery<? super T>, R> function);
 
     default <R> R applyThis(Function<? extends CQuery<T>, R> function) {

+ 10 - 0
assira.core/src/main/java/net/ranides/assira/collection/query/CQueryAbstract.java

@@ -602,6 +602,11 @@ public abstract class CQueryAbstract<T> implements CQuery<T>, CQueryFeatures {
 
     @Override
     public int indexOf(Predicate<? super T> predicate) {
+        return indexOfEach((i,v) -> predicate.test(v));
+    }
+
+    @Override
+    public int indexOfEach(Predicates.EachPredicate<? super T> predicate) {
         if(!hasFastStream()) {
             if(hasFastEach()) {
                 return BaseEach.indexOf(this, predicate);
@@ -624,6 +629,11 @@ public abstract class CQueryAbstract<T> implements CQuery<T>, CQueryFeatures {
 
     @Override
     public int lastIndexOf(Predicate<? super T> predicate) {
+        return lastIndexOfEach((i,v) -> predicate.test(v));
+    }
+
+    @Override
+    public int lastIndexOfEach(Predicates.EachPredicate<? super T> predicate) {
         if(!hasFastStream()) {
             if(hasFastEach()) {
                 return BaseEach.lastIndexOf(this, predicate);

+ 6 - 4
assira.core/src/main/java/net/ranides/assira/collection/query/support/BaseEach.java

@@ -6,6 +6,8 @@ import net.ranides.assira.collection.arrays.NativeArrayBuilder;
 import net.ranides.assira.collection.maps.OpenMap;
 import net.ranides.assira.collection.query.CQuery;
 import net.ranides.assira.collection.sets.OpenSet;
+import net.ranides.assira.functional.Predicates;
+import net.ranides.assira.functional.Predicates.EachPredicate;
 import net.ranides.assira.text.StrBuilder;
 
 import java.util.ArrayList;
@@ -145,10 +147,10 @@ public class BaseEach {
         return Optional.ofNullable(out.get());
     }
 
-    public static <T> int indexOf(CQuery<T> that, Predicate<? super T> predicate) {
+    public static <T> int indexOf(CQuery<T> that, EachPredicate<? super T> predicate) {
         BaseState.Holder<Integer> out = BaseState.newHolder(that, -1);
         that.whileEach((i,v) -> {
-            if(predicate.test(v)) {
+            if(predicate.test(i,v)) {
                 out.set(i);
                 return false;
             }
@@ -157,10 +159,10 @@ public class BaseEach {
         return out.get();
     }
 
-    public static <T> int lastIndexOf(CQuery<T> that, Predicate<? super T> predicate) {
+    public static <T> int lastIndexOf(CQuery<T> that, EachPredicate<? super T> predicate) {
         BaseState.Holder<Integer> out = BaseState.newHolder(that, -1);
         that.forEach((i,v) -> {
-            if(predicate.test(v)) {
+            if(predicate.test(i,v)) {
                 out.set(i);
             }
         });

+ 6 - 5
assira.core/src/main/java/net/ranides/assira/collection/query/support/BaseIterable.java

@@ -10,6 +10,7 @@ import net.ranides.assira.collection.query.CQuery;
 import net.ranides.assira.collection.sets.OpenSet;
 import net.ranides.assira.functional.Consumers;
 import net.ranides.assira.functional.Predicates;
+import net.ranides.assira.functional.Predicates.EachPredicate;
 import net.ranides.assira.functional.special.Fold;
 import net.ranides.assira.text.StringUtils;
 
@@ -182,7 +183,7 @@ public class BaseIterable {
         return true;
     }
 
-    public static <T> boolean whileEach(Iterable<T> that, Predicates.EachPredicate<? super T> consumer) {
+    public static <T> boolean whileEach(Iterable<T> that, EachPredicate<? super T> consumer) {
         int index = 0;
         for (T t : that) {
             if( !consumer.test(index++, t)) {
@@ -209,23 +210,23 @@ public class BaseIterable {
         return IterableUtils.last(that);
     }
 
-    public static <T> int indexOf(CQuery<T> that, Predicate<? super T> predicate) {
+    public static <T> int indexOf(CQuery<T> that, EachPredicate<? super T> predicate) {
         Iterator<T> itr = that.iterator();
 
         for (int i = 0; itr.hasNext(); i++) {
-            if(predicate.test(itr.next())) {
+            if(predicate.test(i, itr.next())) {
                 return i;
             }
         }
         return -1;
     }
 
-    public static <T> int lastIndexOf(CQuery<T> that, Predicate<? super T> predicate) {
+    public static <T> int lastIndexOf(CQuery<T> that, EachPredicate<? super T> predicate) {
         Iterator<T> itr = that.iterator();
         int found = -1;
 
         for (int i = 0; itr.hasNext(); i++) {
-            if(predicate.test(itr.next())) {
+            if(predicate.test(i, itr.next())) {
                 found = i;
             }
         }

+ 8 - 6
assira.core/src/main/java/net/ranides/assira/collection/query/support/BaseStream.java

@@ -4,6 +4,7 @@ import lombok.experimental.UtilityClass;
 
 import net.ranides.assira.collection.query.CQuery;
 import net.ranides.assira.functional.Predicates;
+import net.ranides.assira.functional.Predicates.EachPredicate;
 
 import java.util.Iterator;
 import java.util.List;
@@ -78,15 +79,15 @@ public class BaseStream {
         return that.stream().allMatch(v -> consumer.test(v));
     }
 
-    public static <T> boolean whileEach(CQuery<T> that, Predicates.EachPredicate<? super T> consumer) {
+    public static <T> boolean whileEach(CQuery<T> that, EachPredicate<? super T> consumer) {
         BaseState.Index index = BaseState.newIndex(that);
         return that.stream().allMatch(v -> consumer.test(index.next(), v));
     }
 
-    public static <T> int indexOf(CQuery<T> that, Predicate<? super T> predicate) {
+    public static <T> int indexOf(CQuery<T> that, EachPredicate<? super T> predicate) {
         BaseState.Holder<Integer> out = BaseState.newHolder(that, -1);
         whileEach(that, (i,v) -> {
-            if(predicate.test(v)) {
+            if(predicate.test(i,v)) {
                 out.set(i);
                 return false;
             }
@@ -95,12 +96,13 @@ public class BaseStream {
         return out.get();
     }
 
-    public static <T> int lastIndexOf(CQuery<T> that, Predicate<? super T> predicate) {
+    public static <T> int lastIndexOf(CQuery<T> that, EachPredicate<? super T> predicate) {
         BaseState.Holder<Integer> out = BaseState.newHolder(that, -1);
         BaseState.Index index = BaseState.newIndex(that);
         that.stream().forEach(v -> {
-            if(predicate.test(v)) {
-                out.set(index.value());
+            int let_index = index.value();
+            if(predicate.test(let_index,v)) {
+                out.set(let_index);
             }
             index.next();
         });

+ 0 - 5
assira.core/src/test/java/net/ranides/test/CQueryAssert.java

@@ -247,11 +247,6 @@ public class CQueryAssert {
             return true;
         });
 
-        System.out.println(forEach1);
-        System.out.println(forEach2);
-        System.out.println(whileEach1);
-        System.out.println(whileEach2);
-
         Assert.assertEquals(expectValues, forEach1);
         Assert.assertEquals(expectValues, forEach2);
         Assert.assertEquals(expectIndexes, forEachIndex);