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

extension BestCom<T extends core::num*> on core::Iterable<T*>* {
  method best = self::BestCom|best;
  tearoff best = self::BestCom|get#best;
}
extension BestList<T extends core::Object* = dynamic> on core::List<T*>* {
  method best = self::BestList|best;
  tearoff best = self::BestList|get#best;
}
extension BestSpec on core::List<core::num*>* {
  method best = self::BestSpec|best;
  tearoff best = self::BestSpec|get#best;
}
static method BestCom|best<T extends core::num*>(lowered final core::Iterable<self::BestCom|best::T*>* #this) → self::BestCom|best::T*
  return null;
static method BestCom|get#best<T extends core::num*>(lowered final core::Iterable<self::BestCom|get#best::T*>* #this) → () →* self::BestCom|get#best::T*
  return () → self::BestCom|get#best::T* => self::BestCom|best<self::BestCom|get#best::T*>(#this);
static method BestList|best<T extends core::Object* = dynamic>(lowered final core::List<self::BestList|best::T*>* #this) → self::BestList|best::T*
  return null;
static method BestList|get#best<T extends core::Object* = dynamic>(lowered final core::List<self::BestList|get#best::T*>* #this) → () →* self::BestList|get#best::T*
  return () → self::BestList|get#best::T* => self::BestList|best<self::BestList|get#best::T*>(#this);
static method BestSpec|best(lowered final core::List<core::num*>* #this) → core::num*
  return null;
static method BestSpec|get#best(lowered final core::List<core::num*>* #this) → () →* core::num*
  return () → core::num* => self::BestSpec|best(#this);
static method main() → dynamic {
  core::List<core::int*>* x;
  core::int* v = self::BestList|best<core::int*>(x);
  core::List<core::num*>* y;
  core::num* w = self::BestSpec|best(y);
}
