library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;

static method main() → dynamic {
  core::int? lateLocal;
  core::bool #lateLocal#isSet = false;
  function #lateLocal#get() → core::int {
    if(!#lateLocal#isSet) {
      lateLocal = 123;
      #lateLocal#isSet = true;
    }
    return lateLocal{core::int};
  }
  function #lateLocal#set(core::int #t1) → dynamic {
    #lateLocal#isSet = true;
    return lateLocal = #t1;
  }
  self::expect(123, #lateLocal#get.call());
  self::expect(124, #lateLocal#set.call(124));
  self::expect(124, #lateLocal#get.call());
  function local<T extends core::Object? = dynamic>(T% value1, T% value2) → core::Null? {
    T? lateGenericLocal;
    core::bool #lateGenericLocal#isSet = false;
    function #lateGenericLocal#get() → T% {
      if(!#lateGenericLocal#isSet) {
        lateGenericLocal = value1;
        #lateGenericLocal#isSet = true;
      }
      return lateGenericLocal{T%};
    }
    function #lateGenericLocal#set(T% #t2) → dynamic {
      #lateGenericLocal#isSet = true;
      return lateGenericLocal = #t2;
    }
    self::expect(value1, #lateGenericLocal#get.call());
    self::expect(value2, #lateGenericLocal#set.call(value2));
    self::expect(value2, #lateGenericLocal#get.call());
  }
  local.call<core::int?>(null, 0);
  local.call<core::int?>(0, null);
  local.call<core::int>(0, 42);
}
static method expect(dynamic expected, dynamic actual) → dynamic {
  if(!expected.{core::Object::==}(actual))
    throw "Expected ${expected}, actual ${actual}";
}
