blob: 5cf3b12918c8e6916f20f538069c65245f316a96 [file] [log] [blame]
// Copyright 2013 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
part of quiver.iterables;
/**
* Returns an [Iterable] that infinitely cycles through the elements of
* [iterable]. If [iterable] is empty, the returned Iterable will also be empty.
*/
Iterable cycle(Iterable iterable) => new _Cycle(iterable);
class _Cycle<T> extends InfiniteIterable<T> {
final Iterable<T> _iterable;
_Cycle(this._iterable);
Iterator<T> get iterator => new _CycleIterator(_iterable);
bool get isEmpty => _iterable.isEmpty;
bool get isNotEmpty => _iterable.isNotEmpty;
// TODO(justin): add methods that can be answered by the wrapped iterable
}
class _CycleIterator<T> implements Iterator<T> {
final Iterable<T> _iterable;
Iterator<T> _iterator;
_CycleIterator(_iterable)
: _iterable = _iterable,
_iterator = _iterable.iterator;
T get current => _iterator.current;
bool moveNext() {
if (!_iterator.moveNext()) {
_iterator = _iterable.iterator;
return _iterator.moveNext();
}
return true;
}
}