ソースを参照

Add optional predicates to certian functions

Billy Barrow 2 年 前
コミット
c7c646cba6

+ 10 - 10
src/lib/Enumerable.vala

@@ -50,7 +50,7 @@ namespace Invercargill {
             return count;
         }
 
-        public virtual bool any(PredicateDelegate<T> predicate) {
+        public virtual bool any(PredicateDelegate<T> predicate = (i) => true) {
             var result = false;
             iterate_if(i => {
                 if(predicate(i)) {
@@ -67,7 +67,7 @@ namespace Invercargill {
             return !any(i => !predicate(i));
         }
 
-        public virtual bool no(PredicateDelegate<T> predicate) {
+        public virtual bool no(PredicateDelegate<T> predicate = (i) => true) {
             return all(i => !predicate(i));
         }
 
@@ -146,24 +146,24 @@ namespace Invercargill {
             return concat(seq);
         }
 
-        public virtual T first() throws SequenceError {
-            var tracker = get_tracker();
+        public virtual T first(owned PredicateDelegate<T>? predicate = null) throws SequenceError {
+            var tracker = predicate == null ? get_tracker() : where((owned)predicate).get_tracker();
             if(tracker.has_next()) {
                 return tracker.get_next();
             }
             throw new SequenceError.NO_ELEMENTS("The sequence contains no elements");
         }
 
-        public virtual T? first_or_default() {
-            var tracker = get_tracker();
+        public virtual T? first_or_default(owned PredicateDelegate<T>? predicate = null) {
+            var tracker = predicate == null ? get_tracker() : where((owned)predicate).get_tracker();
             if(tracker.has_next()) {
                 return tracker.get_next();
             }
             return null;
         }
 
-        public virtual T single() throws SequenceError {
-            var tracker = get_tracker();
+        public virtual T single(owned PredicateDelegate<T>? predicate = null) throws SequenceError {
+            var tracker = predicate == null ? get_tracker() : where((owned)predicate).get_tracker();
             if(tracker.has_next()) {
                 var item = tracker.get_next();
                 if(tracker.has_next()) {
@@ -174,8 +174,8 @@ namespace Invercargill {
             throw new SequenceError.NO_ELEMENTS("The sequence contains no elements");
         }
 
-        public virtual T single_or_default() throws SequenceError {
-            var tracker = get_tracker();
+        public virtual T single_or_default(owned PredicateDelegate<T>? predicate = null) throws SequenceError {
+            var tracker = predicate == null ? get_tracker() : where((owned)predicate).get_tracker();
             if(tracker.has_next()) {
                 var item = tracker.get_next();
                 if(tracker.has_next()) {

+ 42 - 0
src/tests/Integration/Firsts.vala

@@ -0,0 +1,42 @@
+using Invercargill;
+
+void first_tests() {
+
+    Test.add_func("/invercargill/operator/scalar/first/no-condition", () => {
+        var items = ate(new int[] { 1, 2, 3, 4, 5, 6});
+
+        try{
+            var first = items.first();
+            assert_true(first == 1);
+        }
+        catch (Error e) {
+            assert_no_error(e);
+        }
+        
+    });
+
+    Test.add_func("/invercargill/operator/scalar/first/condition", () => {
+        var items = ate(new int[] { 1, 2, 3, 4, 5, 6});
+
+        try {
+            var first = items.first(i => i > 3);
+            assert_true(first == 4);
+        }
+        catch (Error e) {
+            assert_no_error(e);
+        }
+    });
+
+    Test.add_func("/invercargill/operator/scalar/first/empty", () => {
+        var items = ate(new int[] {});
+
+        try {
+            items.first();
+            assert_not_reached();
+        }
+        catch (Error e) {
+
+        }
+    });
+
+}

+ 1 - 0
src/tests/TestRunner.vala

@@ -9,6 +9,7 @@ public static int main(string[] args) {
     gee_tests();
     tracker_tests();
     parallel_tests();
+    first_tests();
 
     Test.run();
 

+ 1 - 0
src/tests/meson.build

@@ -9,5 +9,6 @@ sources += files('Integration/Sort.vala')
 sources += files('Integration/Gee.vala')
 sources += files('Integration/Tracker.vala')
 sources += files('Integration/Parallel.vala')
+sources += files('Integration/Firsts.vala')
 
 executable('invercargill-test-suite', sources, dependencies: dependencies, install: true)