diff options
Diffstat (limited to 'gee/iterator.vala')
-rw-r--r-- | gee/iterator.vala | 69 |
1 files changed, 57 insertions, 12 deletions
diff --git a/gee/iterator.vala b/gee/iterator.vala index 8b243e6..b22fa10 100644 --- a/gee/iterator.vala +++ b/gee/iterator.vala @@ -2,6 +2,7 @@ * * Copyright (C) 2007-2008 Jürg Billeter * Copyright (C) 2009 Didier Villevalois, Maciej Piechotka + * Copyright (C) 2010-2011 Maciej Piechotka * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -27,14 +28,14 @@ * An iterator over a collection. * * Gee's iterators are "on-track" iterators. They always point to an item - * except before the first call to {@link next} or {@link first}, or, when an - * item has been removed, until the next call to {@link next} or {@link first}. + * except before the first call to {@link next}, or, when an + * item has been removed, until the next call to {@link next}. * * Please note that when the iterator is out of track, neither {@link get} nor * {@link remove} are defined and both will fail. After the next call to - * {@link next} or {@link first}, they will be defined again. + * {@link next}, they will be defined again. */ -public interface Gee.Iterator<G> : Object { +public interface Gee.Iterator<G> : Object, Traversable<G> { /** * Advances to the next element in the iteration. * @@ -50,13 +51,6 @@ public interface Gee.Iterator<G> : Object { public abstract bool has_next (); /** - * Rewinds to the first element in the iteration. - * - * @return ``true`` if the iterator has a first element - */ - public abstract bool first (); - - /** * Returns the current element in the iteration. * * @return the current element in the iteration @@ -66,8 +60,59 @@ public interface Gee.Iterator<G> : Object { /** * Removes the current element in the iteration. The cursor is set in an * in-between state. Both {@link get} and {@link remove} will fail until - * the next move of the cursor (calling {@link next} or {@link first}). + * the next move of the cursor (calling {@link next}). */ public abstract void remove (); + + /** + * Determines wheather the call to {@link get} is legal. It is false at the + * beginning and after {@link remove} call and true otherwise. + */ + public abstract bool valid { get; } + + /** + * Determines wheather the call to {@link remove} is legal assuming the + * iterator is valid. The value must not change in runtime hence the user + * of iterator may cache it. + */ + public abstract bool read_only { get; } + + /** + * Create iterator from unfolding function. The lazy value is + * force-evaluated before progressing to next element. + * + * @param f Unfolding function + * @param current If iterator is to be valid it contains the current value of it + */ + public static Iterator<A> unfold<A> (owned UnfoldFunc<A> f, owned Lazy<G>? current = null) { + return new UnfoldIterator<A> ((owned) f, (owned) current); + } + + /** + * Concatinate iterators. + * + * @param iters Iterators of iterators + * @return Iterator containg values of each iterator + */ + public static Iterator<G> concat<G> (Iterator<Iterator<G>> iters) { + Iterator<G>? current = null; + if (iters.valid) + current = iters.get (); + return unfold<G> (() => { + while (true) { + if (current == null) { + if (iters.next ()) { + current = iters.get (); + } else { + return null; + } + } else if (current.next ()) { + return new Lazy<G>.from_value (current.get ()); + } else { + current = null; + } + } + }); + } } |