// Copyright (c) 2016, 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.

/// @assertion Execution of a statement s of the form yield e; proceeds as
/// follows:
///    First, the expression e is evaluated to an object o. If the enclosing
///  function m is marked async* and the stream u associated with m has been
///  paused, then execution of m is suspended until u is resumed or canceled.
///    Next, o is added to the iterable or stream associated with the immediately
///  enclosing function.
/// ...
/// If the enclosing function m is marked sync*  then:
///   - Execution of the function m immediately enclosing s is suspended until
///   the nullary method moveNext() is invoked upon the iterator used to initiate
///   the current invocation of m.
///   - The current call to moveNext() returns true.
///
/// @description Check that object o is added to iterable associated with the
/// immediately enclosing function.
///
/// @author a.semenov@unipro.ru

import '../../../../Utils/expect.dart';

Iterable<int> generator(Iterable<int> iterable) sync* {
  for (int o in iterable) {
    yield o;
  }
}

main() {
  List<int> data = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
  List<int> log = [];
  Iterable<int> iterable = generator(data);
  Iterator<int> it = iterable.iterator;
  while (it.moveNext()) {
    log.add(it.current);
  }
  Expect.listEquals(data, log);
}
