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

import "package:expect/expect.dart";

static field dynamic global;
static method fact4() → dynamic {
  core::int* f = 1;
  {
    core::Iterator<core::int*>* :sync-for-iterator = core::_GrowableList::_literal4<core::int*>(1, 2, 3, 4).{core::Iterable::iterator};
    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
      core::int* n = :sync-for-iterator.{core::Iterator::current};
      {
        f = f.{core::num::*}(n);
      }
    }
  }
  return f;
}
static method fact5() → dynamic {
  core::int* f = 1;
  dynamic n;
  {
    core::Iterator<dynamic>* :sync-for-iterator = core::_GrowableList::_literal5<dynamic>(1, 2, 3, 4, 5).{core::Iterable::iterator};
    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
      final dynamic #t1 = :sync-for-iterator.{core::Iterator::current};
      {
        n = #t1;
        f = f.{core::num::*}(n as{TypeError,ForDynamic} core::num*) as{TypeError} core::int*;
      }
    }
  }
  return f;
}
static method fact6() → dynamic {
  core::int* f = 1;
  {
    core::Iterator<dynamic>* :sync-for-iterator = core::_GrowableList::_literal6<dynamic>(1, 2, 3, 4, 5, 6).{core::Iterable::iterator};
    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
      final dynamic #t2 = :sync-for-iterator.{core::Iterator::current};
      {
        self::global = #t2;
        f = f.{core::num::*}(self::global as{TypeError,ForDynamic} core::num*) as{TypeError} core::int*;
      }
    }
  }
  return f;
}
static method main() → dynamic {
  exp::Expect::isTrue(self::fact4().{core::Object::==}(24));
  exp::Expect::isTrue(self::fact5().{core::Object::==}(120));
  exp::Expect::isTrue(self::fact6().{core::Object::==}(720));
}
