summaryrefslogtreecommitdiff
path: root/gee/iterator.vala
diff options
context:
space:
mode:
Diffstat (limited to 'gee/iterator.vala')
-rw-r--r--gee/iterator.vala69
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;
+ }
+ }
+ });
+ }
}