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

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