Preserve laziness in Stream
authorMaciej Piechotka <uzytkownik2@gmail.com>
Mon, 25 Jul 2011 02:13:47 +0000 (03:13 +0100)
committerMaciej Piechotka <uzytkownik2@gmail.com>
Mon, 25 Jul 2011 02:13:47 +0000 (03:13 +0100)
gee/iterator.vala
gee/traversable.vala

index f3b74d1..aecd3c0 100644 (file)
@@ -86,7 +86,7 @@ public interface Gee.Iterator<G> : Object, Traversable<G> {
                switch (str) {
                case Traversable.Stream.CONTINUE:
                        if (self.valid) {
-                               str = f (Traversable.Stream.CONTINUE, self.get (), out initial);
+                               str = f (Traversable.Stream.CONTINUE, new Lazy<G> (() => {return self.get ();}), out initial);
                                switch (str) {
                                case Traversable.Stream.YIELD:
                                case Traversable.Stream.CONTINUE:
@@ -120,7 +120,7 @@ public interface Gee.Iterator<G> : Object, Traversable<G> {
                                } else {
                                        need_next = true;
                                }
-                               str = f (Traversable.Stream.CONTINUE, self.get (), out val);
+                               str = f (Traversable.Stream.CONTINUE, new Lazy<G> (() => {return self.get ();}), out val);
                        }
                        switch (str) {
                        case Traversable.Stream.YIELD:
index 016130e..d90dd9e 100644 (file)
@@ -26,7 +26,7 @@ namespace Gee {
        public delegate A FoldFunc<A, G> (owned G g, owned A a);
        public delegate void ForallFunc<G> (owned G g);
        public delegate Lazy<A>? UnfoldFunc<A> ();
-       public delegate Traversable.Stream StreamFunc<G, A> (Traversable.Stream state, owned G? g, out Lazy<A>? lazy);
+       public delegate Traversable.Stream StreamFunc<G, A> (Traversable.Stream state, owned Lazy<G>? g, out Lazy<A>? lazy);
        public delegate A MapFunc<A, G> (owned G g);
 }
 
@@ -111,7 +111,11 @@ public interface Gee.Traversable<G> : Object
                        case Stream.YIELD:
                                return Stream.CONTINUE;
                        case Stream.CONTINUE:
-                               val = new Lazy<A>(() => {return (f ((owned)item));});
+                               val = new Lazy<A>(() => {
+                                       A tmp = item.get ();
+                                       item = null;
+                                       return (f ((owned)tmp));
+                               });
                                return Stream.YIELD;
                        case Stream.END:
                                return Stream.END;
@@ -145,7 +149,12 @@ public interface Gee.Traversable<G> : Object
                                        return Stream.YIELD;
                                }
                        case Stream.CONTINUE:
-                               val = new Lazy<A> (() => {seed = f ((owned)item, (owned) seed); return seed;});
+                               val = new Lazy<A> (() => {
+                                       A tmp = item.get ();
+                                       item = null;
+                                       seed = f ((owned) tmp, (owned) seed);
+                                       return seed;
+                               });
                                return Stream.YIELD;
                        case Stream.END:
                                return Stream.END;