blob: c05abe4175d99b654d34fcda1be716708a448ad1 [file] [log] [blame]
// 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;
/// Wrapper for [Iterator] providing the pre-Dart 1.0 iterator interface.
///
/// This class should not be used in new code.
///
/// The [HasNextIterator] class wraps an [Iterator] and provides methods to
/// iterate over an object using [hasNext] and [next].
///
/// The [HasNextIterator] does not implement the [Iterator] interface.
///
/// This class was intended for migration to the current [Iterator]
/// interface, from an earlier interface using [hasNext] and [next].
/// The API change happened in the Dart 1.0 release.
/// Any other use of this class should be migrated to using the
/// current API directly, e.g., using a separate variable to
/// cache the [Iterator.moveNext] result, so that [hasNext] can be
/// checked multiple times.
@Deprecated("Will be removed in a later version of the Dart SDK")
final class HasNextIterator<E> {
Iterator<E> _iterator;
/// Cache for `_iterator.moveNext()`, used by `hasNext`.
///
/// Is reset to `null` when [next] consumes a current element.
/// Will not change again after becoming `false`.
bool? _hasNext;
HasNextIterator(Iterator<E> iterator) : _iterator = iterator;
/// Whether the iterator has a next element.
///
/// Should be checked to be `true` before calling [next].
bool get hasNext => _ensureHasNext;
/// Ensures [_hasNext] has a value, and provides that value.
bool get _ensureHasNext => _hasNext ??= _iterator.moveNext();
/// Provides the next element of the iterable, and moves past it.
///
/// Must only be used when [hasNext] is `true`.
/// The value of [hasNext] can change after calling this method.
E next() {
if (_ensureHasNext) {
_hasNext = null;
return _iterator.current;
}
throw StateError("No more elements");
}
}