|
@@ -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;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+}
|