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

/*@testedFeatures=inference*/
library test;

import 'dart:async';

typedef int IntToInt(int i);

main() {
  IntToInt a() {
    return /*@returnType=int*/ (/*@type=int*/ x) => x;
  }

  Future<IntToInt> b() async {
    // TODO(paulberry): this is broken due to bug 29689.
    return /*@ returnType=dynamic */ (/*@ type=dynamic */ x) => x;
  }

  Iterable<IntToInt> c() sync* {
    yield /*@returnType=int*/ (/*@type=int*/ x) => x;
  }

  Iterable<IntToInt> d() sync* {
    yield* /*@typeArgs=(int) -> int*/ [
      /*@returnType=int*/ (/*@type=int*/ x) => x
    ];
  }

  Stream<IntToInt> e() async* {
    yield /*@returnType=int*/ (/*@type=int*/ x) => x;
  }

  Stream<IntToInt> f() async* {
    yield* new /*@typeArgs=(int) -> int*/ Stream
        .fromIterable(/*@typeArgs=(int) -> int*/ [
      /*@returnType=int*/ (/*@type=int*/ x) => x
    ]);
  }
}
