Skip to content

SortbyX #129

Description

@ikbendewilliam

We can add a class Comparison so we can individually determine ascending

extension ListExtensions<T> on List<T> {
  void sortByX(List<Comparison<T>> comparisons) {
    sort((a, b) {
      int result = 0;
      for (final sorter in comparisons) {
        final byA = sorter.comparison(a);
        final byB = sorter.comparison(b);
        if (byA == null && byB != null) return sorter.ascending ? -1 : 1;
        if (byB == null && byA != null) return sorter.ascending ? 1 : -1;
        if (byA != null && byB != null) {
          result = _compareValues(byA, byB, sorter.ascending);
          if (result != 0) return result;
        }
      }
      return result;
    });
  }

  int _compareValues<A extends Comparable<dynamic>>(A a, A b, bool ascending) {
    if (identical(a, b)) return 0;
    if (ascending) return a.compareTo(b);
    return -a.compareTo(b);
  }
}

class Comparison<T> {
  final Comparable<dynamic>? Function(T item) comparison;
  final bool ascending;

  Comparison(this.comparison, {this.ascending = true});
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions