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

static method test(core::Object? o) → core::String {
  core::String toReturn = "";
  #L1:
  {
    final synthesized core::Object? #0#0 = o;
    {
      if(#0#0 is core::List<core::Object?> && #0#0{core::List<core::Object?>}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && #C2 =={core::num::==}{(core::Object) → core::bool} #0#0{core::List<core::Object?>}.{core::List::[]}(0){(core::int) → core::Object?} && #C1 =={core::num::==}{(core::Object) → core::bool} #0#0{core::List<core::Object?>}.{core::List::[]}(1){(core::int) → core::Object?}) {
        {
          toReturn = "list";
          break #L1;
        }
      }
    }
    {
      if(#0#0 is core::Map<core::Object?, core::Object?> && #0#0{core::Map<core::Object?, core::Object?>}.{core::Map::containsKey}(#C3){(core::Object?) → core::bool} && (let final dynamic #t1 = #0#0{core::Map<core::Object?, core::Object?>}.{core::Map::[]}(#C3){(core::Object?) → core::Object?} in true)) {
        {
          toReturn = "map";
          break #L1;
        }
      }
    }
    {
      {
        {
          toReturn = "default";
        }
      }
    }
  }
  return toReturn;
}
static method main() → dynamic {
  self::expect("list", self::test(<core::int>[1, 2]));
  self::expect("map", self::test(<core::String, core::int>{"key1": 1}));
}
static method expect(dynamic expected, dynamic actual) → dynamic {
  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
    throw "Expected ${expected}, actual ${actual}";
  }
}

constants  {
  #C1 = 2
  #C2 = 1
  #C3 = "key1"
}
