// 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 { Iterator _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 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"); } }