library;
import self as self;
import "dart:core" as core;
import "dart:mock" as mock;

class Closure#main#function extends core::Object implements core::Function {
  field core::String note = "This is temporary. The VM doesn't need closure classes.";
  field mock::Context context;
  constructor •(final mock::Context context) → dynamic
    : self::Closure#main#function::context = context
    ;
  method call() → dynamic {
    "This is a temporary solution. In the VM, this will become an additional parameter.";
    final mock::Context #contextParameter = this.{self::Closure#main#function::context};
    return let final dynamic #t1 = #contextParameter.parent in let final dynamic #t2 = 0 in let final dynamic #t3 = #contextParameter.[](0) in let final dynamic #t4 = #t1.[]=(#t2, #t3) in #t3;
  }
}
class Closure#main#function#1 extends core::Object implements core::Function {
  field core::String note = "This is temporary. The VM doesn't need closure classes.";
  field mock::Context context;
  constructor •(final mock::Context context) → dynamic
    : self::Closure#main#function#1::context = context
    ;
  method call() → dynamic {
    "This is a temporary solution. In the VM, this will become an additional parameter.";
    final mock::Context #contextParameter = this.{self::Closure#main#function#1::context};
    if(!#contextParameter.parent.[](0).==(self::max.-(1)))
      throw "last: ${#contextParameter.parent.[](0)} != ${self::max.-(1)}";
  }
}
static const field core::int max = 100;
static method main() → dynamic {
  dynamic closures = <dynamic>[];
  dynamic closures2 = <dynamic>[];
  final mock::Context #context = new mock::Context::•(1);
  #context.parent = null;
  #context.[]=(0, null);
  {
    mock::Context #context = new mock::Context::•(1);
    #context.parent = #context;
    #context.[]=(0, 0);
    for (; #context.[](0).<(self::max); #context = #context.copy(), #context.[]=(0, #context.[](0).+(1))) {
      closures.add(new self::Closure#main#function::•(#context));
      closures2.add(new self::Closure#main#function#1::•(#context));
    }
  }
  core::int sum = 0;
  for (core::Function f in closures) {
    sum = sum.+(f.call());
  }
  for (core::Function f in closures2) {
    f.call();
  }
  core::int expectedSum = self::max.-(1).*(self::max).~/(2);
  if(!expectedSum.==(sum)) {
    throw core::Exception::•("Unexpected sum = ${sum} != ${expectedSum}");
  }
}
