library;
import self as self;
import "dart:core" as core;
import "dart:collection" as col;
import "dart:math" as math;
import "dart:_internal" as _in;

import "dart:collection";

abstract class _NegativeLengthList&Object&ListMixin<E extends core::Object? = dynamic> = core::Object with col::ListBase<self::_NegativeLengthList&Object&ListMixin::E%> /*isAnonymousMixin,hasConstConstructor*/  {
  const synthetic constructor •() → self::_NegativeLengthList&Object&ListMixin<self::_NegativeLengthList&Object&ListMixin::E%>
    : super core::Object::•()
    ;
  mixin-super-stub get first() → self::_NegativeLengthList&Object&ListMixin::E%
    return super.{col::ListBase::first};
  mixin-super-stub set first(covariant-by-class self::_NegativeLengthList&Object&ListMixin::E% value) → void
    return super.{col::ListBase::first} = value;
  mixin-super-stub get last() → self::_NegativeLengthList&Object&ListMixin::E%
    return super.{col::ListBase::last};
  mixin-super-stub set last(covariant-by-class self::_NegativeLengthList&Object&ListMixin::E% value) → void
    return super.{col::ListBase::last} = value;
  mixin-super-stub get iterator() → core::Iterator<self::_NegativeLengthList&Object&ListMixin::E%>
    return super.{col::ListBase::iterator};
  mixin-super-stub method elementAt(core::int index) → self::_NegativeLengthList&Object&ListMixin::E%
    return super.{col::ListBase::elementAt}(index);
  mixin-super-stub method followedBy(covariant-by-class core::Iterable<self::_NegativeLengthList&Object&ListMixin::E%> other) → core::Iterable<self::_NegativeLengthList&Object&ListMixin::E%>
    return super.{col::ListBase::followedBy}(other);
  mixin-super-stub method forEach((self::_NegativeLengthList&Object&ListMixin::E%) → void action) → void
    return super.{col::ListBase::forEach}(action);
  mixin-super-stub get isEmpty() → core::bool
    return super.{col::ListBase::isEmpty};
  mixin-super-stub get isNotEmpty() → core::bool
    return super.{col::ListBase::isNotEmpty};
  mixin-super-stub get single() → self::_NegativeLengthList&Object&ListMixin::E%
    return super.{col::ListBase::single};
  mixin-super-stub method contains(core::Object? element) → core::bool
    return super.{col::ListBase::contains}(element);
  mixin-super-stub method every((self::_NegativeLengthList&Object&ListMixin::E%) → core::bool test) → core::bool
    return super.{col::ListBase::every}(test);
  mixin-super-stub method any((self::_NegativeLengthList&Object&ListMixin::E%) → core::bool test) → core::bool
    return super.{col::ListBase::any}(test);
  mixin-super-stub method firstWhere((self::_NegativeLengthList&Object&ListMixin::E%) → core::bool test, {covariant-by-class () →? self::_NegativeLengthList&Object&ListMixin::E% orElse = #C1}) → self::_NegativeLengthList&Object&ListMixin::E%
    return super.{col::ListBase::firstWhere}(test, orElse: orElse);
  mixin-super-stub method lastWhere((self::_NegativeLengthList&Object&ListMixin::E%) → core::bool test, {covariant-by-class () →? self::_NegativeLengthList&Object&ListMixin::E% orElse = #C1}) → self::_NegativeLengthList&Object&ListMixin::E%
    return super.{col::ListBase::lastWhere}(test, orElse: orElse);
  mixin-super-stub method singleWhere((self::_NegativeLengthList&Object&ListMixin::E%) → core::bool test, {covariant-by-class () →? self::_NegativeLengthList&Object&ListMixin::E% orElse = #C1}) → self::_NegativeLengthList&Object&ListMixin::E%
    return super.{col::ListBase::singleWhere}(test, orElse: orElse);
  mixin-super-stub method join([core::String separator = #C2]) → core::String
    return super.{col::ListBase::join}(separator);
  mixin-super-stub method where((self::_NegativeLengthList&Object&ListMixin::E%) → core::bool test) → core::Iterable<self::_NegativeLengthList&Object&ListMixin::E%>
    return super.{col::ListBase::where}(test);
  mixin-super-stub method whereType<T extends core::Object? = dynamic>() → core::Iterable<self::_NegativeLengthList&Object&ListMixin::whereType::T%>
    return super.{col::ListBase::whereType}<self::_NegativeLengthList&Object&ListMixin::whereType::T%>();
  mixin-super-stub method map<T extends core::Object? = dynamic>((self::_NegativeLengthList&Object&ListMixin::E%) → self::_NegativeLengthList&Object&ListMixin::map::T% f) → core::Iterable<self::_NegativeLengthList&Object&ListMixin::map::T%>
    return super.{col::ListBase::map}<self::_NegativeLengthList&Object&ListMixin::map::T%>(f);
  mixin-super-stub method expand<T extends core::Object? = dynamic>((self::_NegativeLengthList&Object&ListMixin::E%) → core::Iterable<self::_NegativeLengthList&Object&ListMixin::expand::T%> f) → core::Iterable<self::_NegativeLengthList&Object&ListMixin::expand::T%>
    return super.{col::ListBase::expand}<self::_NegativeLengthList&Object&ListMixin::expand::T%>(f);
  mixin-super-stub method reduce(covariant-by-class (self::_NegativeLengthList&Object&ListMixin::E%, self::_NegativeLengthList&Object&ListMixin::E%) → self::_NegativeLengthList&Object&ListMixin::E% combine) → self::_NegativeLengthList&Object&ListMixin::E%
    return super.{col::ListBase::reduce}(combine);
  mixin-super-stub method fold<T extends core::Object? = dynamic>(self::_NegativeLengthList&Object&ListMixin::fold::T% initialValue, (self::_NegativeLengthList&Object&ListMixin::fold::T%, self::_NegativeLengthList&Object&ListMixin::E%) → self::_NegativeLengthList&Object&ListMixin::fold::T% combine) → self::_NegativeLengthList&Object&ListMixin::fold::T%
    return super.{col::ListBase::fold}<self::_NegativeLengthList&Object&ListMixin::fold::T%>(initialValue, combine);
  mixin-super-stub method skip(core::int count) → core::Iterable<self::_NegativeLengthList&Object&ListMixin::E%>
    return super.{col::ListBase::skip}(count);
  mixin-super-stub method skipWhile((self::_NegativeLengthList&Object&ListMixin::E%) → core::bool test) → core::Iterable<self::_NegativeLengthList&Object&ListMixin::E%>
    return super.{col::ListBase::skipWhile}(test);
  mixin-super-stub method take(core::int count) → core::Iterable<self::_NegativeLengthList&Object&ListMixin::E%>
    return super.{col::ListBase::take}(count);
  mixin-super-stub method takeWhile((self::_NegativeLengthList&Object&ListMixin::E%) → core::bool test) → core::Iterable<self::_NegativeLengthList&Object&ListMixin::E%>
    return super.{col::ListBase::takeWhile}(test);
  mixin-super-stub method toList({core::bool growable = #C3}) → core::List<self::_NegativeLengthList&Object&ListMixin::E%>
    return super.{col::ListBase::toList}(growable: growable);
  mixin-super-stub method toSet() → core::Set<self::_NegativeLengthList&Object&ListMixin::E%>
    return super.{col::ListBase::toSet}();
  mixin-super-stub method add(covariant-by-class self::_NegativeLengthList&Object&ListMixin::E% element) → void
    return super.{col::ListBase::add}(element);
  mixin-super-stub method addAll(covariant-by-class core::Iterable<self::_NegativeLengthList&Object&ListMixin::E%> iterable) → void
    return super.{col::ListBase::addAll}(iterable);
  mixin-super-stub method remove(core::Object? element) → core::bool
    return super.{col::ListBase::remove}(element);
  mixin-super-stub method _closeGap(core::int start, core::int end) → void
    return super.{col::ListBase::_closeGap}(start, end);
  mixin-super-stub method removeWhere((self::_NegativeLengthList&Object&ListMixin::E%) → core::bool test) → void
    return super.{col::ListBase::removeWhere}(test);
  mixin-super-stub method retainWhere((self::_NegativeLengthList&Object&ListMixin::E%) → core::bool test) → void
    return super.{col::ListBase::retainWhere}(test);
  mixin-super-stub method _filter((self::_NegativeLengthList&Object&ListMixin::E%) → core::bool test, core::bool retainMatching) → void
    return super.{col::ListBase::_filter}(test, retainMatching);
  mixin-super-stub method clear() → void
    return super.{col::ListBase::clear}();
  mixin-super-stub method cast<R extends core::Object? = dynamic>() → core::List<self::_NegativeLengthList&Object&ListMixin::cast::R%>
    return super.{col::ListBase::cast}<self::_NegativeLengthList&Object&ListMixin::cast::R%>();
  mixin-super-stub method removeLast() → self::_NegativeLengthList&Object&ListMixin::E%
    return super.{col::ListBase::removeLast}();
  mixin-super-stub method sort([(self::_NegativeLengthList&Object&ListMixin::E%, self::_NegativeLengthList&Object&ListMixin::E%) →? core::int compare = #C1]) → void
    return super.{col::ListBase::sort}(compare);
  mixin-super-stub method shuffle([math::Random? random = #C1]) → void
    return super.{col::ListBase::shuffle}(random);
  mixin-super-stub method asMap() → core::Map<core::int, self::_NegativeLengthList&Object&ListMixin::E%>
    return super.{col::ListBase::asMap}();
  mixin-super-stub operator +(covariant-by-class core::List<self::_NegativeLengthList&Object&ListMixin::E%> other) → core::List<self::_NegativeLengthList&Object&ListMixin::E%>
    return super.{col::ListBase::+}(other);
  mixin-super-stub method sublist(core::int start, [core::int? end = #C1]) → core::List<self::_NegativeLengthList&Object&ListMixin::E%>
    return super.{col::ListBase::sublist}(start, end);
  mixin-super-stub method getRange(core::int start, core::int end) → core::Iterable<self::_NegativeLengthList&Object&ListMixin::E%>
    return super.{col::ListBase::getRange}(start, end);
  mixin-super-stub method removeRange(core::int start, core::int end) → void
    return super.{col::ListBase::removeRange}(start, end);
  mixin-super-stub method fillRange(core::int start, core::int end, [covariant-by-class self::_NegativeLengthList&Object&ListMixin::E? fill = #C1]) → void
    return super.{col::ListBase::fillRange}(start, end, fill);
  mixin-super-stub method setRange(core::int start, core::int end, covariant-by-class core::Iterable<self::_NegativeLengthList&Object&ListMixin::E%> iterable, [core::int skipCount = #C4]) → void
    return super.{col::ListBase::setRange}(start, end, iterable, skipCount);
  mixin-super-stub method replaceRange(core::int start, core::int end, covariant-by-class core::Iterable<self::_NegativeLengthList&Object&ListMixin::E%> newContents) → void
    return super.{col::ListBase::replaceRange}(start, end, newContents);
  mixin-super-stub method indexOf(covariant-by-class core::Object? element, [core::int start = #C4]) → core::int
    return super.{col::ListBase::indexOf}(element, start);
  mixin-super-stub method indexWhere((self::_NegativeLengthList&Object&ListMixin::E%) → core::bool test, [core::int start = #C4]) → core::int
    return super.{col::ListBase::indexWhere}(test, start);
  mixin-super-stub method lastIndexOf(covariant-by-class core::Object? element, [core::int? start = #C1]) → core::int
    return super.{col::ListBase::lastIndexOf}(element, start);
  mixin-super-stub method lastIndexWhere((self::_NegativeLengthList&Object&ListMixin::E%) → core::bool test, [core::int? start = #C1]) → core::int
    return super.{col::ListBase::lastIndexWhere}(test, start);
  mixin-super-stub method insert(core::int index, covariant-by-class self::_NegativeLengthList&Object&ListMixin::E% element) → void
    return super.{col::ListBase::insert}(index, element);
  mixin-super-stub method removeAt(core::int index) → self::_NegativeLengthList&Object&ListMixin::E%
    return super.{col::ListBase::removeAt}(index);
  mixin-super-stub method insertAll(core::int index, covariant-by-class core::Iterable<self::_NegativeLengthList&Object&ListMixin::E%> iterable) → void
    return super.{col::ListBase::insertAll}(index, iterable);
  mixin-super-stub method setAll(core::int index, covariant-by-class core::Iterable<self::_NegativeLengthList&Object&ListMixin::E%> iterable) → void
    return super.{col::ListBase::setAll}(index, iterable);
  mixin-super-stub get reversed() → core::Iterable<self::_NegativeLengthList&Object&ListMixin::E%>
    return super.{col::ListBase::reversed};
  mixin-super-stub method toString() → core::String
    return super.{col::ListBase::toString}();
}
class NegativeLengthList<E extends core::Object? = dynamic> extends self::_NegativeLengthList&Object&ListMixin<self::NegativeLengthList::E%> {
  final field core::List<self::NegativeLengthList::E%> _list;
  constructor •(core::List<self::NegativeLengthList::E%> _list) → self::NegativeLengthList<self::NegativeLengthList::E%>
    : self::NegativeLengthList::_list = _list, super self::_NegativeLengthList&Object&ListMixin::•()
    ;
  get length() → core::int
    return this.{self::NegativeLengthList::_list}{core::List<self::NegativeLengthList::E%>}.{core::List::length}{core::int}.{core::num::<=}(0){(core::num) → core::bool} ?{core::int} 1.{core::int::unary-}(){() → core::int} : this.{self::NegativeLengthList::_list}{core::List<self::NegativeLengthList::E%>}.{core::List::length}{core::int};
  set length(core::int value) → void {
    this.{self::NegativeLengthList::_list}{core::List<self::NegativeLengthList::E%>}.{core::List::length} = value;
  }
  operator [](core::int index) → self::NegativeLengthList::E%
    return this.{self::NegativeLengthList::_list}{core::List<self::NegativeLengthList::E%>}.{core::List::[]}(index){(core::int) → self::NegativeLengthList::E%};
  operator []=(core::int index, covariant-by-class self::NegativeLengthList::E% value) → void {
    this.{self::NegativeLengthList::_list}{core::List<self::NegativeLengthList::E%>}.{core::List::[]=}(index, value){(core::int, self::NegativeLengthList::E%) → void};
  }
}
static method switchList(core::List<core::int> list) → core::int
  return block {
    core::int #t1;
    final synthesized core::List<core::int> #0#0 = list;
    synthesized core::int #0#1;
    synthesized core::bool #0#1#isSet = false;
    #L1:
    {
      {
        if((#0#1#isSet ?{core::int} #0#1{core::int} : let final dynamic #t2 = #0#1#isSet = true in #0#1 = #0#0.{core::List::length}{core::int}).{core::num::>=}(#C5){(core::num) → core::bool}) {
          #t1 = 2;
          break #L1;
        }
      }
      {
        if((#0#1#isSet ?{core::int} #0#1{core::int} : let final dynamic #t3 = #0#1#isSet = true in #0#1 = #0#0.{core::List::length}{core::int}) =={core::num::==}{(core::Object) → core::bool} #C6) {
          #t1 = 1;
          break #L1;
        }
      }
      {
        if((#0#1#isSet ?{core::int} #0#1{core::int} : let final dynamic #t4 = #0#1#isSet = true in #0#1 = #0#0.{core::List::length}{core::int}).{core::num::<=}(#C4){(core::num) → core::bool}) {
          #t1 = 0;
          break #L1;
        }
      }
      throw new _in::ReachabilityError::•("`null` encountered as case in a switch expression with a non-nullable type.");
    }
  } =>#t1;
static method main() → dynamic {
  self::expect(0, self::switchList(<core::int>[]));
  self::expect(1, self::switchList(<core::int>[0]));
  self::expect(2, self::switchList(<core::int>[0, 1]));
  self::expect(0, self::switchList(new self::NegativeLengthList::•<core::int>(<core::int>[])));
  self::expect(1, self::switchList(new self::NegativeLengthList::•<core::int>(<core::int>[0])));
  self::expect(2, self::switchList(new self::NegativeLengthList::•<core::int>(<core::int>[0, 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 = null
  #C2 = ""
  #C3 = true
  #C4 = 0
  #C5 = 2
  #C6 = 1
}
