1.1.1Updated a month ago
import { I_File } from "../modules/zip.ts";
import { SerializeVersionNumber } from "./version_helpers.ts";

type SortFN<T> = (a: T, b: T) => number;

type ComplexSorter<T> = SortFN<T> & {
  Ascending: SortFN<T>,
  Descending: SortFN<T>
}

const Sorter = <T>(input: SortFN<T>): ComplexSorter<T> => {
  const ascending = input;
  const descending = ((a: T, b: T) => input(a, b) * -1) as SortFN<T>;

  return Object.assign(ascending, {
    Ascending: ascending,
    Descending: descending
  });
}

export class Sort {
  static Event = Sorter<Viapak.Package.Event>((a: Viapak.Package.Event, b: Viapak.Package.Event) => a.timestamp - b.timestamp)
  static EventVersion = Sorter<Viapak.Package.Event>((a: Viapak.Package.Event, b: Viapak.Package.Event) => SerializeVersionNumber(a.version) - SerializeVersionNumber(b.version))
  static String = Sorter<string>((a, b) => a > b ? 1 : a < b ? -1 : 0)
  static Version = Sorter<string>((a: string, b: string) => SerializeVersionNumber(a) - SerializeVersionNumber(b))

  static File = Sorter<I_File>((a: I_File, b: I_File) => (
    a.is_directory == b.is_directory
      ? a.name > b.name ? 1 : a.name < b.name ? -1 : 0
    : a.is_directory && !b.is_directory ? 1 : -1 )
  )
}