library;
import self as self;
import "dart:core" as core;
import "dart:collection" as col;
import "package:expect/expect.dart" as exp;

import "package:expect/expect.dart";

static method test1(dynamic stringList) → dynamic {
  core::Set<core::int*>* intSet = block {
    final core::Set<core::int*>* #t1 = col::LinkedHashSet::•<core::int*>();
    final core::Iterable<dynamic>* #t2 = stringList as{TypeError,ForDynamic} core::Iterable<dynamic>*;
    if(!(#t2 == null))
      for (final dynamic #t3 in #t2) {
        final core::int* #t4 = #t3 as{TypeError} core::int*;
        #t1.{core::Set::add}(#t4){(core::int*) →* core::bool*};
      }
  } =>#t1;
}
static method test2(dynamic stringList) → dynamic {
  core::List<core::int*>* intList = block {
    final core::List<core::int*>* #t5 = <core::int*>[];
    final core::Iterable<dynamic>* #t6 = stringList as{TypeError,ForDynamic} core::Iterable<dynamic>*;
    if(!(#t6 == null))
      for (final dynamic #t7 in #t6) {
        final core::int* #t8 = #t7 as{TypeError} core::int*;
        #t5.{core::List::add}(#t8){(core::int*) →* void};
      }
  } =>#t5;
}
static method test3(dynamic stringMap) → dynamic {
  core::Map<core::int*, core::int*>* intMap = block {
    final core::Map<core::int*, core::int*>* #t9 = <core::int*, core::int*>{};
    final core::Map<dynamic, dynamic>* #t10 = stringMap as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*;
    if(!(#t10 == null))
      for (final core::MapEntry<dynamic, dynamic>* #t11 in #t10.{core::Map::entries}) {
        final core::int* #t12 = #t11.{core::MapEntry::key} as{TypeError} core::int*;
        final core::int* #t13 = #t11.{core::MapEntry::value} as{TypeError} core::int*;
        #t9.{core::Map::[]=}(#t12, #t13){(core::int*, core::int*) →* void};
      }
  } =>#t9;
}
static method main() → dynamic {
  dynamic stringList = <core::String*>["string"];
  exp::Expect::throwsTypeError(() → Null {
    self::test1(stringList);
  });
  exp::Expect::throwsTypeError(() → Null {
    self::test2(stringList);
  });
  dynamic stringMap = <core::String*, core::String*>{"a": "b"};
  exp::Expect::throwsTypeError(() → Null {
    self::test3(stringMap);
  });
}
