library;
import self as self;
import "dart:core" as core;
import "dart:collection" as col;

static method foldInitialElements() → void {
  dynamic element0 = 0;
  core::num* element1 = 1;
  core::int* element2 = 2;
  core::List<core::int*>* list = block {
    final core::List<core::int*>* #t1 = <core::int*>[element0 as{TypeError,ForDynamic} core::int*, element1 as{TypeError} core::int*, element2];
    if(true)
      #t1.{core::List::add}{Invariant}(3){(core::int*) →* void};
    #t1.{core::List::add}{Invariant}(4){(core::int*) →* void};
    #t1.{core::List::add}{Invariant}(5){(core::int*) →* void};
    #t1.{core::List::add}{Invariant}(6){(core::int*) →* void};
  } =>#t1;
  self::expect(core::List::generate<core::int*>(7, (core::int* i) → core::int* => i), list);
  core::Set<core::int*>* set = block {
    final core::Set<core::int*>* #t2 = col::LinkedHashSet::•<core::int*>();
    #t2.{core::Set::add}{Invariant}(element0 as{TypeError,ForDynamic} core::int*){(core::int*) →* core::bool*};
    #t2.{core::Set::add}{Invariant}(element1 as{TypeError} core::int*){(core::int*) →* core::bool*};
    #t2.{core::Set::add}{Invariant}(element2){(core::int*) →* core::bool*};
    if(true)
      #t2.{core::Set::add}{Invariant}(3){(core::int*) →* core::bool*};
    #t2.{core::Set::add}{Invariant}(4){(core::int*) →* core::bool*};
    #t2.{core::Set::add}{Invariant}(5){(core::int*) →* core::bool*};
    #t2.{core::Set::add}{Invariant}(6){(core::int*) →* core::bool*};
  } =>#t2;
  self::expect(core::List::generate<core::int*>(7, (core::int* i) → core::int* => i), set.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::int*>*});
}
static method foldInitialSpread1() → void {
  dynamic initial = <core::int*>[0, 1, 2];
  core::List<core::int*>* list = block {
    final core::List<core::int*>* #t3 = <core::int*>[];
    for (final dynamic #t4 in initial as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
      final core::int* #t5 = #t4 as{TypeError} core::int*;
      #t3.{core::List::add}{Invariant}(#t5){(core::int*) →* void};
    }
    if(true)
      #t3.{core::List::add}{Invariant}(3){(core::int*) →* void};
    #t3.{core::List::add}{Invariant}(4){(core::int*) →* void};
    #t3.{core::List::add}{Invariant}(5){(core::int*) →* void};
    #t3.{core::List::add}{Invariant}(6){(core::int*) →* void};
  } =>#t3;
  self::expect(core::List::generate<core::int*>(7, (core::int* i) → core::int* => i), list);
  core::Set<core::int*>* set = block {
    final core::Set<core::int*>* #t6 = col::LinkedHashSet::•<core::int*>();
    for (final dynamic #t7 in initial as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
      final core::int* #t8 = #t7 as{TypeError} core::int*;
      #t6.{core::Set::add}{Invariant}(#t8){(core::int*) →* core::bool*};
    }
    if(true)
      #t6.{core::Set::add}{Invariant}(3){(core::int*) →* core::bool*};
    #t6.{core::Set::add}{Invariant}(4){(core::int*) →* core::bool*};
    #t6.{core::Set::add}{Invariant}(5){(core::int*) →* core::bool*};
    #t6.{core::Set::add}{Invariant}(6){(core::int*) →* core::bool*};
  } =>#t6;
  self::expect(core::List::generate<core::int*>(7, (core::int* i) → core::int* => i), set.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::int*>*});
}
static method foldInitialSpread2() → void {
  core::Iterable<core::num*>* initial = <core::num*>[0, 1, 2];
  core::List<core::int*>* list = block {
    final core::List<core::int*>* #t9 = <core::int*>[];
    for (final dynamic #t10 in initial) {
      final core::int* #t11 = #t10 as{TypeError} core::int*;
      #t9.{core::List::add}{Invariant}(#t11){(core::int*) →* void};
    }
    if(true)
      #t9.{core::List::add}{Invariant}(3){(core::int*) →* void};
    #t9.{core::List::add}{Invariant}(4){(core::int*) →* void};
    #t9.{core::List::add}{Invariant}(5){(core::int*) →* void};
    #t9.{core::List::add}{Invariant}(6){(core::int*) →* void};
  } =>#t9;
  self::expect(core::List::generate<core::int*>(7, (core::int* i) → core::int* => i), list);
  core::Set<core::int*>* set = block {
    final core::Set<core::int*>* #t12 = col::LinkedHashSet::•<core::int*>();
    for (final dynamic #t13 in initial) {
      final core::int* #t14 = #t13 as{TypeError} core::int*;
      #t12.{core::Set::add}{Invariant}(#t14){(core::int*) →* core::bool*};
    }
    if(true)
      #t12.{core::Set::add}{Invariant}(3){(core::int*) →* core::bool*};
    #t12.{core::Set::add}{Invariant}(4){(core::int*) →* core::bool*};
    #t12.{core::Set::add}{Invariant}(5){(core::int*) →* core::bool*};
    #t12.{core::Set::add}{Invariant}(6){(core::int*) →* core::bool*};
  } =>#t12;
  self::expect(core::List::generate<core::int*>(7, (core::int* i) → core::int* => i), set.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::int*>*});
}
static method foldInitialSpread3() → void {
  core::List<core::num*>* initial = <core::num*>[0, 1, 2];
  core::List<core::int*>* list = block {
    final core::List<core::int*>* #t15 = <core::int*>[];
    for (final dynamic #t16 in initial) {
      final core::int* #t17 = #t16 as{TypeError} core::int*;
      #t15.{core::List::add}{Invariant}(#t17){(core::int*) →* void};
    }
    if(true)
      #t15.{core::List::add}{Invariant}(3){(core::int*) →* void};
    #t15.{core::List::add}{Invariant}(4){(core::int*) →* void};
    #t15.{core::List::add}{Invariant}(5){(core::int*) →* void};
    #t15.{core::List::add}{Invariant}(6){(core::int*) →* void};
  } =>#t15;
  self::expect(core::List::generate<core::int*>(7, (core::int* i) → core::int* => i), list);
  core::Set<core::int*>* set = block {
    final core::Set<core::int*>* #t18 = col::LinkedHashSet::•<core::int*>();
    for (final dynamic #t19 in initial) {
      final core::int* #t20 = #t19 as{TypeError} core::int*;
      #t18.{core::Set::add}{Invariant}(#t20){(core::int*) →* core::bool*};
    }
    if(true)
      #t18.{core::Set::add}{Invariant}(3){(core::int*) →* core::bool*};
    #t18.{core::Set::add}{Invariant}(4){(core::int*) →* core::bool*};
    #t18.{core::Set::add}{Invariant}(5){(core::int*) →* core::bool*};
    #t18.{core::Set::add}{Invariant}(6){(core::int*) →* core::bool*};
  } =>#t18;
  self::expect(core::List::generate<core::int*>(7, (core::int* i) → core::int* => i), set.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::int*>*});
}
static method foldInitialSpread4() → void {
  core::Iterable<core::int*>* initial = <core::int*>[0, 1, 2];
  core::List<core::int*>* list = block {
    final core::List<core::int*>* #t21 = core::List::of<core::int*>(initial);
    if(true)
      #t21.{core::List::add}{Invariant}(3){(core::int*) →* void};
    #t21.{core::List::add}{Invariant}(4){(core::int*) →* void};
    #t21.{core::List::add}{Invariant}(5){(core::int*) →* void};
    #t21.{core::List::add}{Invariant}(6){(core::int*) →* void};
  } =>#t21;
  self::expect(core::List::generate<core::int*>(7, (core::int* i) → core::int* => i), list);
  core::Set<core::int*>* set = block {
    final core::Set<core::int*>* #t22 = col::LinkedHashSet::of<core::int*>(initial);
    if(true)
      #t22.{core::Set::add}{Invariant}(3){(core::int*) →* core::bool*};
    #t22.{core::Set::add}{Invariant}(4){(core::int*) →* core::bool*};
    #t22.{core::Set::add}{Invariant}(5){(core::int*) →* core::bool*};
    #t22.{core::Set::add}{Invariant}(6){(core::int*) →* core::bool*};
  } =>#t22;
  self::expect(core::List::generate<core::int*>(7, (core::int* i) → core::int* => i), set.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::int*>*});
}
static method foldInitialSpread5() → void {
  core::List<core::int*>* initial = <core::int*>[0, 1, 2];
  core::List<core::int*>* list = block {
    final core::List<core::int*>* #t23 = core::List::of<core::int*>(initial);
    if(true)
      #t23.{core::List::add}{Invariant}(3){(core::int*) →* void};
    #t23.{core::List::add}{Invariant}(4){(core::int*) →* void};
    #t23.{core::List::add}{Invariant}(5){(core::int*) →* void};
    #t23.{core::List::add}{Invariant}(6){(core::int*) →* void};
  } =>#t23;
  self::expect(core::List::generate<core::int*>(7, (core::int* i) → core::int* => i), list);
  core::Set<core::int*>* set = block {
    final core::Set<core::int*>* #t24 = col::LinkedHashSet::of<core::int*>(initial);
    if(true)
      #t24.{core::Set::add}{Invariant}(3){(core::int*) →* core::bool*};
    #t24.{core::Set::add}{Invariant}(4){(core::int*) →* core::bool*};
    #t24.{core::Set::add}{Invariant}(5){(core::int*) →* core::bool*};
    #t24.{core::Set::add}{Invariant}(6){(core::int*) →* core::bool*};
  } =>#t24;
  self::expect(core::List::generate<core::int*>(7, (core::int* i) → core::int* => i), set.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::int*>*});
}
static method foldInitialSpread6() → void {
  core::List<core::int*>* initial = <core::int*>[0, 1, 2];
  core::List<core::int*>* list = block {
    final core::List<core::int*>* #t25 = <core::int*>[];
    final core::Iterable<core::int*>* #t26 = initial;
    if(!(#t26 == null))
      #t25.{core::List::addAll}{Invariant}(#t26){(core::Iterable<core::int*>*) →* void};
    if(true)
      #t25.{core::List::add}{Invariant}(3){(core::int*) →* void};
    #t25.{core::List::add}{Invariant}(4){(core::int*) →* void};
    #t25.{core::List::add}{Invariant}(5){(core::int*) →* void};
    #t25.{core::List::add}{Invariant}(6){(core::int*) →* void};
  } =>#t25;
  self::expect(core::List::generate<core::int*>(7, (core::int* i) → core::int* => i), list);
  core::Set<core::int*>* set = block {
    final core::Set<core::int*>* #t27 = col::LinkedHashSet::•<core::int*>();
    final core::Iterable<core::int*>* #t28 = initial;
    if(!(#t28 == null))
      #t27.{core::Set::addAll}{Invariant}(#t28){(core::Iterable<core::int*>*) →* void};
    if(true)
      #t27.{core::Set::add}{Invariant}(3){(core::int*) →* core::bool*};
    #t27.{core::Set::add}{Invariant}(4){(core::int*) →* core::bool*};
    #t27.{core::Set::add}{Invariant}(5){(core::int*) →* core::bool*};
    #t27.{core::Set::add}{Invariant}(6){(core::int*) →* core::bool*};
  } =>#t27;
  self::expect(core::List::generate<core::int*>(7, (core::int* i) → core::int* => i), set.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::int*>*});
}
static method main() → dynamic {
  self::foldInitialElements();
  self::foldInitialSpread1();
  self::foldInitialSpread2();
  self::foldInitialSpread3();
  self::foldInitialSpread4();
  self::foldInitialSpread5();
  self::foldInitialSpread6();
}
static method expect(core::List<dynamic>* list1, core::List<dynamic>* list2) → void {
  if(!(list1.{core::List::length}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} list2.{core::List::length}{core::int*})) {
    throw "Unexpected length. Expected ${list1.{core::List::length}{core::int*}}, actual ${list2.{core::List::length}{core::int*}}.";
  }
  for (core::int* i = 0; i.{core::num::<}(list1.{core::List::length}{core::int*}){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*}) {
    if(!(list1.{core::List::[]}(i){(core::int*) →* dynamic} =={core::Object::==}{(core::Object*) →* core::bool*} list2.{core::List::[]}(i){(core::int*) →* dynamic})) {
      throw "Unexpected element at index ${i}. Expected ${list1.{core::List::[]}(i){(core::int*) →* dynamic}}, actual ${list2.{core::List::[]}(i){(core::int*) →* dynamic}}.";
    }
  }
}
