Index: sdk/lib/collection/iterator.dart |
diff --git a/sdk/lib/collection/iterator.dart b/sdk/lib/collection/iterator.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..1fe49cd2dc4d1ea84e27e2d2cbed7a9d7ae3003f |
--- /dev/null |
+++ b/sdk/lib/collection/iterator.dart |
@@ -0,0 +1,45 @@ |
+// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+part of dart.collection; |
+ |
+/** |
+ * The [HasNextIterator] class wraps an [Iterator] and provides methods to |
+ * iterate over an object using `hasNext` and `next`. |
+ * |
+ * An [HasNextIterator] does not implement the [Iterator] interface. |
+ */ |
+class HasNextIterator<E> { |
+ static const int _HAS_NEXT_AND_NEXT_IN_CURRENT = 0; |
+ static const int _NO_NEXT = 1; |
+ static const int _NOT_MOVED_YET = 2; |
+ |
+ Iterator _iterator; |
+ int _state = _NOT_MOVED_YET; |
+ |
+ HasNextIterator(this._iterator); |
+ |
+ bool get hasNext { |
+ if (_state == _NOT_MOVED_YET) _move(); |
+ return _state == _HAS_NEXT_AND_NEXT_IN_CURRENT; |
+ } |
+ |
+ E next() { |
+ // Call to hasNext is necessary to make sure we are positioned at the first |
+ // element when we start iterating. |
+ if (!hasNext) throw new StateError("No more elements"); |
+ assert(_state == _HAS_NEXT_AND_NEXT_IN_CURRENT); |
+ E result = _iterator.current; |
+ _move(); |
+ return result; |
+ } |
+ |
+ void _move() { |
+ if (_iterator.moveNext()) { |
+ _state = _HAS_NEXT_AND_NEXT_IN_CURRENT; |
+ } else { |
+ _state = _NO_NEXT; |
+ } |
+ } |
+} |