浏览代码

Add iterable support

Billy Barrow 3 年之前
父节点
当前提交
eea3e16207

+ 1 - 1
src/lib/Concrete/ArrayEnumerable.vala

@@ -19,7 +19,7 @@ namespace Invercargill {
         //      return true;
         //  }
 
-        public override Tracker<T> to_tracker() {
+        public override Tracker<T> get_tracker() {
             var i = 0;
             return new LambdaTracker<T>(
                 () => {

+ 3 - 3
src/lib/Concrete/ConcatEnumerable.vala

@@ -18,9 +18,9 @@ namespace Invercargill {
         //      return false;
         //  }
 
-        public override Tracker<T> to_tracker() {
-            var tracker1 = e1.to_tracker();
-            var tracker2 = e2.to_tracker();
+        public override Tracker<T> get_tracker() {
+            var tracker1 = e1.get_tracker();
+            var tracker2 = e2.get_tracker();
 
             return new LambdaTracker<T>(
                 () => tracker1.has_next() || tracker2.has_next(),

+ 1 - 1
src/lib/Concrete/DirEnumerable.vala

@@ -23,7 +23,7 @@ namespace Invercargill {
         //      return true;
         //  }
 
-        public override Tracker<string> to_tracker() {
+        public override Tracker<string> get_tracker() {
             var dir = Dir.open(path, flags);
 
             return new AdvanceTracker<string>((out obj) => {

+ 1 - 1
src/lib/Concrete/GeeEnumerable.vala

@@ -21,7 +21,7 @@ namespace Invercargill {
         //  }
 
         
-        public override Tracker<T> to_tracker() {
+        public override Tracker<T> get_tracker() {
             var iterator = iterable.iterator();
 
             return new LambdaTracker<T>(

+ 0 - 33
src/lib/Concrete/IterableEnumerable.vala

@@ -1,33 +0,0 @@
-
-//  using Gee;
-
-//  namespace Invercargill {
-
-//      private class IterableEnumerable<T> : Enumerable<T>, Iterable<T>, Object, Traversable<T> {
-
-//          private Iterable<T> iterable;
-
-//          public GeeEnumerable(Iterable<T> gee) {
-//              iterable = gee;
-//          }
-        
-//          public override Tracker<T> to_tracker() {
-//              var iterator = iterable.iterator();
-
-//              return new LambdaTracker<T>(
-//                  () => iterator.has_next(),
-//                  () => {
-//                      iterator.next();
-//                      return iterator.get();
-//                  });
-//          }
-//      public Gee.Iterator<T> iterator () {
-//          assert_not_reached ();
-//      }
-//      public new bool foreach (Gee.ForallFunc<T> f) {
-//          assert_not_reached ();
-//      }
-
-//      }
-
-//  }

+ 3 - 3
src/lib/Concrete/PairEnumerable.vala

@@ -10,9 +10,9 @@ namespace Invercargill {
             e2 = en2;
         }
 
-        public override Tracker<Pair<T1, T2>> to_tracker() {
-            var tracker1 = e1.to_tracker();
-            var tracker2 = e2.to_tracker();
+        public override Tracker<Pair<T1, T2>> get_tracker() {
+            var tracker1 = e1.get_tracker();
+            var tracker2 = e2.get_tracker();
 
             return new LambdaTracker<Pair<T1, T2>>(
                 () => tracker1.has_next() || tracker2.has_next(),

+ 1 - 1
src/lib/Concrete/RangeEnumerable.vala

@@ -22,7 +22,7 @@ namespace Invercargill {
         //      return true;
         //  }
 
-        public override Tracker<int> to_tracker() {
+        public override Tracker<int> get_tracker() {
             var i = start;
 
             return new LambdaTracker<int>(

+ 1 - 1
src/lib/Concrete/Sequence.vala

@@ -28,7 +28,7 @@ namespace Invercargill {
         //      return true;
         //  }
 
-        public override Tracker<T> to_tracker() {
+        public override Tracker<T> get_tracker() {
             var current = root;
 
             return new LambdaTracker<T>(

+ 3 - 3
src/lib/Concrete/ZipperEnumerable.vala

@@ -22,9 +22,9 @@ namespace Invercargill {
         //      });
         //  }
 
-        public override Tracker<T> to_tracker() {
-            var t1 = e1.to_tracker();
-            var t2 = e2.to_tracker();
+        public override Tracker<T> get_tracker() {
+            var t1 = e1.get_tracker();
+            var t2 = e2.get_tracker();
             var last = t2;
 
             return new LambdaTracker<T>(

+ 7 - 7
src/lib/Enumerable.vala

@@ -1,18 +1,14 @@
 
 namespace Invercargill {
 
-    //  public interface Enumerable<T> {
-        
-    //  }
-
     public abstract class Enumerable<T> {
 
-        public abstract Tracker<T> to_tracker();
+        public abstract Tracker<T> get_tracker();
 
         // Returns false if iteration was interrupted
         // Returns true if iteration reached natural end
         public virtual bool iterate_if(PredicateDelegate<T> handler) {
-            var tracker = to_tracker();
+            var tracker = get_tracker();
             while(tracker.has_next()) {
                 if(!handler(tracker.get_next())) {
                     return false;
@@ -34,12 +30,16 @@ namespace Invercargill {
             return sequence;
         }
 
-        public virtual Gee.Collection to_collection() {
+        public virtual Gee.Collection<T> to_collection() {
             var collection = new Gee.LinkedList<T>();
             iterate(i => collection.add(i));
             return collection;
         }
 
+        public virtual Gee.Iterable<T> as_iterable() {
+            return new GeeIterable<T>(this);
+        }
+
         public virtual T[] to_array() {
             return to_collection().to_array();
         }

+ 74 - 0
src/lib/GeeIterable.vala

@@ -0,0 +1,74 @@
+
+using Gee;
+
+namespace Invercargill {
+
+    private class GeeIterable<T> : Object, Traversable<T>, Iterable<T> {
+
+        private Enumerable<T> enumerable;
+
+        public GeeIterable(Enumerable<T> e) {
+            enumerable = e;
+        }
+
+        public bool foreach (Gee.ForallFunc<T> f) {
+            return enumerable.iterate_if(i => f(i));
+        } 
+
+        public Gee.Iterator<T> iterator () {
+            return new GeeIterator<T>(enumerable.get_tracker());
+        }
+       
+    }
+
+    private class GeeIterator<T> : Object, Traversable<T>, Iterator<T> {
+
+        private Tracker<T> tracker;
+        private T current_value;
+        private bool has_current_value = false;
+
+
+        public GeeIterator(Tracker<T> tracker) {
+            this.tracker = tracker;
+        }
+
+        public new T get () {
+            return current_value;
+        }
+
+        public bool has_next () {
+            return tracker.has_next ();
+        }
+
+        public bool next () {
+            if(tracker.has_next ()) {
+                current_value = tracker.get_next ();
+                return true;
+            }
+            return false;
+        }
+
+        public void remove () {
+            assert_not_reached ();
+        }
+
+        public bool read_only { get {
+            return true;
+        }}
+
+        public bool valid { get {
+            return has_current_value;
+        }}
+
+        public bool foreach (Gee.ForallFunc<T> handler) {
+            while(tracker.has_next()) {
+                if(!handler(tracker.get_next())) {
+                    return false;
+                }
+            }
+            return true;
+        }
+
+    }
+
+}

+ 2 - 2
src/lib/Queries/Filter.vala

@@ -19,8 +19,8 @@ namespace Invercargill {
         //      });
         //  }
 
-        public override Tracker<T> to_tracker() {
-            var tracker = input.to_tracker();
+        public override Tracker<T> get_tracker() {
+            var tracker = input.get_tracker();
 
             return new AdvanceTracker<T>((out obj) => {
                 while(tracker.has_next()) {

+ 3 - 3
src/lib/Queries/Merge.vala

@@ -10,8 +10,8 @@ namespace Invercargill {
             return input.iterate_if(i => i.iterate_if(handler));
         }
 
-        public override Tracker<T> to_tracker() {
-            var outer_tracker = input.to_tracker();
+        public override Tracker<T> get_tracker() {
+            var outer_tracker = input.get_tracker();
             Tracker<T> inner_tracker = null;
 
             return new AdvanceTracker<T>((out obj) => {
@@ -20,7 +20,7 @@ namespace Invercargill {
                         obj = null;
                         return false;
                     }
-                    inner_tracker = outer_tracker.get_next().to_tracker();
+                    inner_tracker = outer_tracker.get_next().get_tracker();
                 }
                 obj = inner_tracker.get_next();
                 return true;

+ 2 - 2
src/lib/Queries/Skip.vala

@@ -21,8 +21,8 @@ namespace Invercargill {
             });
         }
 
-        public override Tracker<T> to_tracker() {
-            var tracker = input.to_tracker();
+        public override Tracker<T> get_tracker() {
+            var tracker = input.get_tracker();
             var c = 0;
 
             return new AdvanceTracker<T>((out obj) => {

+ 2 - 2
src/lib/Queries/Sort.vala

@@ -25,11 +25,11 @@ namespace Invercargill {
             }
         }
 
-        public override Tracker<T> to_tracker() {
+        public override Tracker<T> get_tracker() {
             // Hack for now
             var list = to_collection();
             list.order_by ((a, b) => compare_func(a, b));
-            return gte<T>(list).to_tracker();
+            return gte<T>(list).get_tracker();
         }
     }
 

+ 2 - 2
src/lib/Queries/Take.vala

@@ -20,8 +20,8 @@ namespace Invercargill {
         //      });
         //  }
 
-        public override Tracker<T> to_tracker() {
-            var tracker = input.to_tracker();
+        public override Tracker<T> get_tracker() {
+            var tracker = input.get_tracker();
             var c = 0;
 
             return new LambdaTracker<T>(

+ 2 - 2
src/lib/Queries/Transform.vala

@@ -12,8 +12,8 @@ namespace Invercargill {
         //      return input.iterate_if(i => handler(transform_func(i)));
         //  }
 
-        public override Tracker<Tout> to_tracker() {
-            var tracker = input.to_tracker();
+        public override Tracker<Tout> get_tracker() {
+            var tracker = input.get_tracker();
             return new LambdaTracker<Tout>(
                 () => tracker.has_next(),
                 () => transform_func(tracker.get_next())

+ 1 - 1
src/lib/meson.build

@@ -8,6 +8,7 @@ dependencies = [
 
 sources = files('Invercargill.vala')
 sources += files('Enumerable.vala')
+sources += files('GeeIterable.vala')
 sources += files('Delegates.vala')
 sources += files('Pair.vala')
 sources += files('Tracker.vala')
@@ -29,7 +30,6 @@ sources += files('Concrete/PairEnumerable.vala')
 sources += files('Concrete/DirEnumerable.vala')
 sources += files('Concrete/ZipperEnumerable.vala')
 sources += files('Concrete/Sequence.vala')
-sources += files('Concrete/IterableEnumerable.vala')
 
 invercargill = shared_library('invercargill', sources,
     dependencies: dependencies,

+ 27 - 0
src/tests/Integration/Gee.vala

@@ -0,0 +1,27 @@
+using Invercargill;
+
+void gee_tests() {
+
+    Test.add_func("/invercargill/conversion/gee/collection", () => {
+        var items = ate(new int[] { 1, 2, 3, 4, 5, 6});
+        var result = items.to_collection();
+
+        var i = 1;
+        foreach (var item in result) {
+            assert_true(item == i);
+            i++;
+        }
+    });
+
+    Test.add_func("/invercargill/conversion/gee/iterable", () => {
+        var items = ate(new int[] { 1, 2, 3, 4, 5, 6});
+        var result = items.to_iterable();
+
+        var i = 1;
+        foreach (var item in result) {
+            assert_true(item == i);
+            i++;
+        }
+    });
+
+}

+ 1 - 0
src/tests/TestRunner.vala

@@ -6,6 +6,7 @@ public static int main(string[] args) {
     where_tests();
     select_tests();
     select_many_tests();
+    gee_tests();
 
     Test.run();
 

+ 1 - 0
src/tests/meson.build

@@ -6,5 +6,6 @@ sources += files('Integration/SelectMany.vala')
 sources += files('Integration/Skip.vala')
 sources += files('Integration/Take.vala')
 sources += files('Integration/Sort.vala')
+sources += files('Integration/Gee.vala')
 
 executable('invercargill-test-suite', sources, dependencies: dependencies, install: true)