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}(3){(core::int*) →* void};
    #t1.{core::List::add}(4){(core::int*) →* void};
    #t1.{core::List::add}(5){(core::int*) →* void};
    #t1.{core::List::add}(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}(element0 as{TypeError,ForDynamic} core::int*){(core::int*) →* core::bool*};
    #t2.{core::Set::add}(element1 as{TypeError} core::int*){(core::int*) →* core::bool*};
    #t2.{core::Set::add}(element2){(core::int*) →* core::bool*};
    if(true)
      #t2.{core::Set::add}(3){(core::int*) →* core::bool*};
    #t2.{core::Set::add}(4){(core::int*) →* core::bool*};
    #t2.{core::Set::add}(5){(core::int*) →* core::bool*};
    #t2.{core::Set::add}(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}(#t5){(core::int*) →* void};
    }
    if(true)
      #t3.{core::List::add}(3){(core::int*) →* void};
    #t3.{core::List::add}(4){(core::int*) →* void};
    #t3.{core::List::add}(5){(core::int*) →* void};
    #t3.{core::List::add}(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}(#t8){(core::int*) →* core::bool*};
    }
    if(true)
      #t6.{core::Set::add}(3){(core::int*) →* core::bool*};
    #t6.{core::Set::add}(4){(core::int*) →* core::bool*};
    #t6.{core::Set::add}(5){(core::int*) →* core::bool*};
    #t6.{core::Set::add}(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}(#t11){(core::int*) →* void};
    }
    if(true)
      #t9.{core::List::add}(3){(core::int*) →* void};
    #t9.{core::List::add}(4){(core::int*) →* void};
    #t9.{core::List::add}(5){(core::int*) →* void};
    #t9.{core::List::add}(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}(#t14){(core::int*) →* core::bool*};
    }
    if(true)
      #t12.{core::Set::add}(3){(core::int*) →* core::bool*};
    #t12.{core::Set::add}(4){(core::int*) →* core::bool*};
    #t12.{core::Set::add}(5){(core::int*) →* core::bool*};
    #t12.{core::Set::add}(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}(#t17){(core::int*) →* void};
    }
    if(true)
      #t15.{core::List::add}(3){(core::int*) →* void};
    #t15.{core::List::add}(4){(core::int*) →* void};
    #t15.{core::List::add}(5){(core::int*) →* void};
    #t15.{core::List::add}(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}(#t20){(core::int*) →* core::bool*};
    }
    if(true)
      #t18.{core::Set::add}(3){(core::int*) →* core::bool*};
    #t18.{core::Set::add}(4){(core::int*) →* core::bool*};
    #t18.{core::Set::add}(5){(core::int*) →* core::bool*};
    #t18.{core::Set::add}(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}(3){(core::int*) →* void};
    #t21.{core::List::add}(4){(core::int*) →* void};
    #t21.{core::List::add}(5){(core::int*) →* void};
    #t21.{core::List::add}(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}(3){(core::int*) →* core::bool*};
    #t22.{core::Set::add}(4){(core::int*) →* core::bool*};
    #t22.{core::Set::add}(5){(core::int*) →* core::bool*};
    #t22.{core::Set::add}(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}(3){(core::int*) →* void};
    #t23.{core::List::add}(4){(core::int*) →* void};
    #t23.{core::List::add}(5){(core::int*) →* void};
    #t23.{core::List::add}(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}(3){(core::int*) →* core::bool*};
    #t24.{core::Set::add}(4){(core::int*) →* core::bool*};
    #t24.{core::Set::add}(5){(core::int*) →* core::bool*};
    #t24.{core::Set::add}(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}(#t26){(core::Iterable<core::int*>*) →* void};
    if(true)
      #t25.{core::List::add}(3){(core::int*) →* void};
    #t25.{core::List::add}(4){(core::int*) →* void};
    #t25.{core::List::add}(5){(core::int*) →* void};
    #t25.{core::List::add}(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}(#t28){(core::Iterable<core::int*>*) →* void};
    if(true)
      #t27.{core::Set::add}(3){(core::int*) →* core::bool*};
    #t27.{core::Set::add}(4){(core::int*) →* core::bool*};
    #t27.{core::Set::add}(5){(core::int*) →* core::bool*};
    #t27.{core::Set::add}(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}}.";
    }
  }
}
