RouteBase get $setRoute => GoRouteData.$route(
      path: '/set-route',
      factory: _$SetRoute._fromState,
    );

mixin _$SetRoute on GoRouteData {
  static SetRoute _fromState(GoRouterState state) => SetRoute(
        ids: (state.uri.queryParametersAll['ids']
                    ?.map(int.parse)
                    .cast<int>()
                    ?.toSet() as Set<int>)
                ?.toSet() ??
            const {},
        nullableIds: (state.uri.queryParametersAll['nullable-ids']
                ?.map(int.parse)
                .cast<int>()
                ?.toSet() as Set<int>?)
            ?.toSet(),
        idsWithDefaultValue: (state
                    .uri.queryParametersAll['ids-with-default-value']
                    ?.map(int.parse)
                    .cast<int>()
                    ?.toSet() as Set<int>?)
                ?.toSet() ??
            const <int>{0},
      );

  SetRoute get _self => this as SetRoute;

  @override
  String get location => GoRouteData.$location(
        '/set-route',
        queryParams: {
          'ids': _self.ids.map((e) => e.toString()).toList(),
          if (_self.nullableIds != null)
            'nullable-ids':
                _self.nullableIds?.map((e) => e.toString()).toList(),
          if (!_$iterablesEqual(_self.idsWithDefaultValue, const <int>{0}))
            'ids-with-default-value':
                _self.idsWithDefaultValue.map((e) => e.toString()).toList(),
        },
      );

  @override
  void go(BuildContext context) => context.go(location);

  @override
  Future<T?> push<T>(BuildContext context) => context.push<T>(location);

  @override
  void pushReplacement(BuildContext context) =>
      context.pushReplacement(location);

  @override
  void replace(BuildContext context) => context.replace(location);
}

bool _$iterablesEqual<T>(Iterable<T>? iterable1, Iterable<T>? iterable2) {
  if (identical(iterable1, iterable2)) return true;
  if (iterable1 == null || iterable2 == null) return false;
  final iterator1 = iterable1.iterator;
  final iterator2 = iterable2.iterator;
  while (true) {
    final hasNext1 = iterator1.moveNext();
    final hasNext2 = iterator2.moveNext();
    if (hasNext1 != hasNext2) return false;
    if (!hasNext1) return true;
    if (iterator1.current != iterator2.current) return false;
  }
}