library test;
import self as self;
import "dart:core" as core;
import "dart:async" as asy;

import "dart:async";

static method make(core::int* x) → asy::Future<core::int*>*
  return asy::Future::•<dynamic>(() → dynamic => x);
static method test() → dynamic {
  core::Iterable<asy::Future<core::int*>*>* list = <core::int*>[1, 2, 3].map(#C1);
  asy::Future<core::List<core::int*>*>* results = asy::Future::wait<dynamic>(list);
  asy::Future<core::String*>* results2 = results.then((core::List<core::int*>* list) → dynamic => list.fold("", (dynamic x, dynamic y) → dynamic => x.+(y.toString())));
  asy::Future<core::String*>* results3 = results.then((core::List<core::int*>* list) → dynamic => list.fold("", (core::String* x, dynamic y) → dynamic => x.+(y.toString())));
  asy::Future<core::String*>* results4 = results.then((core::List<core::int*>* list) → dynamic => list.fold<core::String*>("", (dynamic x, dynamic y) → dynamic => x.+(y.toString())));
}
static method main() → dynamic {}

constants  {
  #C1 = tearoff self::make
}
