/*
 * Copyright (c) 2019, 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 Dynamic Semantics
 * The new dynamic semantics are a superset of the original behavior. To avoid
 * redundancy and handle nested uses, the semantics are expressed in terms of a
 * separate procedure below:
 *
 * Lists
 * 1. Create a fresh instance [collection] of a class that implements [List<E>].
 *
 *    An implementation is, of course, free to optimize by pre-allocating a list
 *    of the correct capacity when its size is statically known. Note that when
 *    [if] and [for] come into play, it's no longer always possible to
 *    statically tell the final size of the resulting flattened list.
 *
 * 2. For each [element] in the list literal:
 *
 *      i. Evaluate [element] using the procedure below.
 *
 * 3. The result of the literal expression is [collection].
 * . . .
 * To evaluate a collection [element]:
 * This procedure handles elements in both list and map literals because the
 * only difference is how a base expression element or entry element is handled.
 * The control flow parts are the same so are unified here.
 * . . .
 * 3. Else, if [element] is an asynchronous [await for-in] element:
 *
 *      i. Evaluate the stream expression to a value [stream]. It is a dynamic
 *         error if [stream] is not an instance of a class that implements
 *         [Stream].
 *     ii. Create a new [Future], [streamDone].
 *    iii. Evaluate [await streamDone].
 *     iv. Listen to [stream]. On each data event [event] the stream sends:
 *           a. If the [for-in] element declares a variable, create a fresh
 *              [variable] for it. Otherwise, use the existing [variable] it
 *              refers to.
 *           b. Bind [event] to [variable].
 *           c. Evaluate the body element using this procedure in the scope of
 *              [variable]. If this raises an exception, complete [streamDone]
 *              with it as an error.
 *      v. If the [for-in] element declares a variable, discard it.
 *     vi. If [stream] raises an exception, complete [streamDone] with it as an
 *         error. Otherwise, when all events in the stream are in the stream are
 *         processed, complete [streamDone] with [null].
 * . . .
 * @description Checks that if [element] of list literal is a an asynchronous
 * [await for-in] element, this element is evaluated using the specified
 * procedure.
 * @author ngl@unipro.ru
 */
// SharedOptions=--enable-experiment=constant-update-2018
import "dart:async";
import "../../Utils/expect.dart";

main() async {
  var l1 = [1, 2];
  var l2 = [3, 4, 5];
  var list1exp = <int>[1, 2, 4, 5, 6];

  var s1 = new Stream.fromIterable(l1);
  var s2 = new Stream.fromIterable(l2);

  var list1 = <int>[await for (var v in s1) v, await for (var v in s2) v + 1];
  Expect.isTrue(list1 is List<int>);
  Expect.listEquals(list1exp, list1);
}
