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::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 = <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 = <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));
}
