library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "dart:collection" as col;
import "dart:_internal" as _in;

static method useAddAll() → void {
  dynamic dynamicSet1 = block {
    final core::Set<core::int> #t1 = new col::_CompactLinkedHashSet::•<core::int>();
    #t1.{core::Set::add}{Invariant}(0){(core::int) → core::bool};
    #t1.{core::Set::add}{Invariant}(1){(core::int) → core::bool};
    #t1.{core::Set::add}{Invariant}(2){(core::int) → core::bool};
  } =>#t1;
  dynamic dynamicSet2 = block {
    final core::Set<core::num> #t2 = new col::_CompactLinkedHashSet::•<core::num>();
    #t2.{core::Set::add}{Invariant}(3){(core::num) → core::bool};
    #t2.{core::Set::add}{Invariant}(4){(core::num) → core::bool};
    #t2.{core::Set::add}{Invariant}(5){(core::num) → core::bool};
  } =>#t2;
  dynamic dynamicSet3 = block {
    final core::Set<core::int?> #t3 = new col::_CompactLinkedHashSet::•<core::int?>();
    #t3.{core::Set::add}{Invariant}(6){(core::int?) → core::bool};
    #t3.{core::Set::add}{Invariant}(7){(core::int?) → core::bool};
    #t3.{core::Set::add}{Invariant}(8){(core::int?) → core::bool};
  } =>#t3;
  core::Iterable<core::int> iterableIntSet = block {
    final core::Set<core::int> #t4 = new col::_CompactLinkedHashSet::•<core::int>();
    #t4.{core::Set::add}{Invariant}(9){(core::int) → core::bool};
    #t4.{core::Set::add}{Invariant}(10){(core::int) → core::bool};
    #t4.{core::Set::add}{Invariant}(11){(core::int) → core::bool};
  } =>#t4;
  core::Set<core::int> intSet = block {
    final core::Set<core::int> #t5 = new col::_CompactLinkedHashSet::•<core::int>();
    #t5.{core::Set::add}{Invariant}(12){(core::int) → core::bool};
    #t5.{core::Set::add}{Invariant}(13){(core::int) → core::bool};
    #t5.{core::Set::add}{Invariant}(14){(core::int) → core::bool};
  } =>#t5;
  core::Set<core::int> set1 = block {
    final core::Set<core::int> #t6 = new col::_CompactLinkedHashSet::•<core::int>();
    {
      core::Iterator<dynamic> :sync-for-iterator = (dynamicSet1 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator}{core::Iterator<dynamic>};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
        final dynamic #t7 = :sync-for-iterator.{core::Iterator::current}{dynamic};
        {
          final core::int #t8 = #t7 as{TypeError,ForNonNullableByDefault} core::int;
          #t6.{core::Set::add}{Invariant}(#t8){(core::int) → core::bool};
        }
      }
    }
    {
      core::Iterator<dynamic> :sync-for-iterator = (dynamicSet2 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator}{core::Iterator<dynamic>};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
        final dynamic #t9 = :sync-for-iterator.{core::Iterator::current}{dynamic};
        {
          final core::int #t10 = #t9 as{TypeError,ForNonNullableByDefault} core::int;
          #t6.{core::Set::add}{Invariant}(#t10){(core::int) → core::bool};
        }
      }
    }
    {
      core::Iterator<dynamic> :sync-for-iterator = (dynamicSet3 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator}{core::Iterator<dynamic>};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
        final dynamic #t11 = :sync-for-iterator.{core::Iterator::current}{dynamic};
        {
          final core::int #t12 = #t11 as{TypeError,ForNonNullableByDefault} core::int;
          #t6.{core::Set::add}{Invariant}(#t12){(core::int) → core::bool};
        }
      }
    }
    #t6.{core::Set::addAll}{Invariant}(iterableIntSet){(core::Iterable<core::int>) → void};
    #t6.{core::Set::addAll}{Invariant}(intSet){(core::Iterable<core::int>) → void};
  } =>#t6;
  self::expect(core::_GrowableList::generate<core::int>(15, (core::int i) → core::int => i).{core::Iterable::toSet}(){() → core::Set<core::int>}, set1);
  core::Set<core::num> set2 = block {
    final core::Set<core::num> #t13 = new col::_CompactLinkedHashSet::•<core::num>();
    {
      core::Iterator<dynamic> :sync-for-iterator = (dynamicSet1 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator}{core::Iterator<dynamic>};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
        final dynamic #t14 = :sync-for-iterator.{core::Iterator::current}{dynamic};
        {
          final core::num #t15 = #t14 as{TypeError,ForNonNullableByDefault} core::num;
          #t13.{core::Set::add}{Invariant}(#t15){(core::num) → core::bool};
        }
      }
    }
    {
      core::Iterator<dynamic> :sync-for-iterator = (dynamicSet2 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator}{core::Iterator<dynamic>};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
        final dynamic #t16 = :sync-for-iterator.{core::Iterator::current}{dynamic};
        {
          final core::num #t17 = #t16 as{TypeError,ForNonNullableByDefault} core::num;
          #t13.{core::Set::add}{Invariant}(#t17){(core::num) → core::bool};
        }
      }
    }
    {
      core::Iterator<dynamic> :sync-for-iterator = (dynamicSet3 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator}{core::Iterator<dynamic>};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
        final dynamic #t18 = :sync-for-iterator.{core::Iterator::current}{dynamic};
        {
          final core::num #t19 = #t18 as{TypeError,ForNonNullableByDefault} core::num;
          #t13.{core::Set::add}{Invariant}(#t19){(core::num) → core::bool};
        }
      }
    }
    #t13.{core::Set::addAll}{Invariant}(iterableIntSet){(core::Iterable<core::num>) → void};
    #t13.{core::Set::addAll}{Invariant}(intSet){(core::Iterable<core::num>) → void};
  } =>#t13;
  self::expect(core::_GrowableList::generate<core::num>(15, (core::int i) → core::int => i).{core::Iterable::toSet}(){() → core::Set<core::num>}, set2);
}
static method useAddAllNullable() → void {
  dynamic dynamicSet1 = block {
    final core::Set<core::int> #t20 = new col::_CompactLinkedHashSet::•<core::int>();
    #t20.{core::Set::add}{Invariant}(0){(core::int) → core::bool};
    #t20.{core::Set::add}{Invariant}(1){(core::int) → core::bool};
    #t20.{core::Set::add}{Invariant}(2){(core::int) → core::bool};
  } =>#t20;
  dynamic dynamicSet2 = block {
    final core::Set<core::num> #t21 = new col::_CompactLinkedHashSet::•<core::num>();
    #t21.{core::Set::add}{Invariant}(3){(core::num) → core::bool};
    #t21.{core::Set::add}{Invariant}(4){(core::num) → core::bool};
    #t21.{core::Set::add}{Invariant}(5){(core::num) → core::bool};
  } =>#t21;
  dynamic dynamicSet3 = block {
    final core::Set<core::int?> #t22 = new col::_CompactLinkedHashSet::•<core::int?>();
    #t22.{core::Set::add}{Invariant}(6){(core::int?) → core::bool};
    #t22.{core::Set::add}{Invariant}(7){(core::int?) → core::bool};
    #t22.{core::Set::add}{Invariant}(8){(core::int?) → core::bool};
  } =>#t22;
  core::Iterable<core::int>? iterableIntSet = true ?{core::Set<core::int>?} block {
    final core::Set<core::int> #t23 = new col::_CompactLinkedHashSet::•<core::int>();
    #t23.{core::Set::add}{Invariant}(9){(core::int) → core::bool};
    #t23.{core::Set::add}{Invariant}(10){(core::int) → core::bool};
    #t23.{core::Set::add}{Invariant}(11){(core::int) → core::bool};
  } =>#t23 : null;
  core::Set<core::int>? intSet = true ?{core::Set<core::int>?} block {
    final core::Set<core::int> #t24 = new col::_CompactLinkedHashSet::•<core::int>();
    #t24.{core::Set::add}{Invariant}(12){(core::int) → core::bool};
    #t24.{core::Set::add}{Invariant}(13){(core::int) → core::bool};
    #t24.{core::Set::add}{Invariant}(14){(core::int) → core::bool};
  } =>#t24 : null;
  core::Set<core::int> set1 = block {
    final core::Set<core::int> #t25 = new col::_CompactLinkedHashSet::•<core::int>();
    final core::Iterable<dynamic>? #t26 = dynamicSet1 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>?;
    if(!(#t26 == null)) {
      core::Iterator<dynamic> :sync-for-iterator = #t26{core::Iterable<dynamic>}.{core::Iterable::iterator}{core::Iterator<dynamic>};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
        final dynamic #t27 = :sync-for-iterator.{core::Iterator::current}{dynamic};
        {
          final core::int #t28 = #t27 as{TypeError,ForNonNullableByDefault} core::int;
          #t25.{core::Set::add}{Invariant}(#t28){(core::int) → core::bool};
        }
      }
    }
    final core::Iterable<dynamic>? #t29 = dynamicSet2 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>?;
    if(!(#t29 == null)) {
      core::Iterator<dynamic> :sync-for-iterator = #t29{core::Iterable<dynamic>}.{core::Iterable::iterator}{core::Iterator<dynamic>};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
        final dynamic #t30 = :sync-for-iterator.{core::Iterator::current}{dynamic};
        {
          final core::int #t31 = #t30 as{TypeError,ForNonNullableByDefault} core::int;
          #t25.{core::Set::add}{Invariant}(#t31){(core::int) → core::bool};
        }
      }
    }
    final core::Iterable<dynamic>? #t32 = dynamicSet3 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>?;
    if(!(#t32 == null)) {
      core::Iterator<dynamic> :sync-for-iterator = #t32{core::Iterable<dynamic>}.{core::Iterable::iterator}{core::Iterator<dynamic>};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
        final dynamic #t33 = :sync-for-iterator.{core::Iterator::current}{dynamic};
        {
          final core::int #t34 = #t33 as{TypeError,ForNonNullableByDefault} core::int;
          #t25.{core::Set::add}{Invariant}(#t34){(core::int) → core::bool};
        }
      }
    }
    final core::Iterable<core::int>? #t35 = iterableIntSet;
    if(!(#t35 == null))
      #t25.{core::Set::addAll}{Invariant}(#t35{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
    final core::Iterable<core::int>? #t36 = intSet;
    if(!(#t36 == null))
      #t25.{core::Set::addAll}{Invariant}(#t36{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
  } =>#t25;
  self::expect(core::_GrowableList::generate<core::int>(15, (core::int i) → core::int => i).{core::Iterable::toSet}(){() → core::Set<core::int>}, set1);
  core::Set<core::num> set2 = block {
    final core::Set<core::num> #t37 = new col::_CompactLinkedHashSet::•<core::num>();
    final core::Iterable<dynamic>? #t38 = dynamicSet1 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>?;
    if(!(#t38 == null)) {
      core::Iterator<dynamic> :sync-for-iterator = #t38{core::Iterable<dynamic>}.{core::Iterable::iterator}{core::Iterator<dynamic>};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
        final dynamic #t39 = :sync-for-iterator.{core::Iterator::current}{dynamic};
        {
          final core::num #t40 = #t39 as{TypeError,ForNonNullableByDefault} core::num;
          #t37.{core::Set::add}{Invariant}(#t40){(core::num) → core::bool};
        }
      }
    }
    final core::Iterable<dynamic>? #t41 = dynamicSet2 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>?;
    if(!(#t41 == null)) {
      core::Iterator<dynamic> :sync-for-iterator = #t41{core::Iterable<dynamic>}.{core::Iterable::iterator}{core::Iterator<dynamic>};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
        final dynamic #t42 = :sync-for-iterator.{core::Iterator::current}{dynamic};
        {
          final core::num #t43 = #t42 as{TypeError,ForNonNullableByDefault} core::num;
          #t37.{core::Set::add}{Invariant}(#t43){(core::num) → core::bool};
        }
      }
    }
    final core::Iterable<dynamic>? #t44 = dynamicSet3 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>?;
    if(!(#t44 == null)) {
      core::Iterator<dynamic> :sync-for-iterator = #t44{core::Iterable<dynamic>}.{core::Iterable::iterator}{core::Iterator<dynamic>};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
        final dynamic #t45 = :sync-for-iterator.{core::Iterator::current}{dynamic};
        {
          final core::num #t46 = #t45 as{TypeError,ForNonNullableByDefault} core::num;
          #t37.{core::Set::add}{Invariant}(#t46){(core::num) → core::bool};
        }
      }
    }
    final core::Iterable<core::num>? #t47 = iterableIntSet;
    if(!(#t47 == null))
      #t37.{core::Set::addAll}{Invariant}(#t47{core::Iterable<core::num>}){(core::Iterable<core::num>) → void};
    final core::Iterable<core::num>? #t48 = intSet;
    if(!(#t48 == null))
      #t37.{core::Set::addAll}{Invariant}(#t48{core::Iterable<core::num>}){(core::Iterable<core::num>) → void};
  } =>#t37;
  self::expect(core::_GrowableList::generate<core::num>(15, (core::int i) → core::int => i).{core::Iterable::toSet}(){() → core::Set<core::num>}, set2);
}
static method main() → dynamic {
  self::useAddAll();
  self::useAddAllNullable();
}
static method expect(core::Set<dynamic> set1, core::Set<dynamic> set2) → void {
  if(!(set1.{_in::EfficientLengthIterable::length}{core::int} =={core::num::==}{(core::Object) → core::bool} set2.{_in::EfficientLengthIterable::length}{core::int})) {
    throw "Unexpected length. Expected ${set1.{_in::EfficientLengthIterable::length}{core::int}}, actual ${set2.{_in::EfficientLengthIterable::length}{core::int}}.";
  }
  {
    core::Iterator<dynamic> :sync-for-iterator = set1.{core::Iterable::iterator}{core::Iterator<dynamic>};
    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
      dynamic element = :sync-for-iterator.{core::Iterator::current}{dynamic};
      {
        if(!set2.{core::Set::contains}(element){(core::Object?) → core::bool}) {
          throw "Element ${element} not found. Expected ${set1}, actual ${set2}.";
        }
      }
    }
  }
}
