moaible
5/30/2017 - 8:57 AM

(JavaScript+Flowtype).Sort

(JavaScript+Flowtype).Sort


type SortDirection = "ascending" | "descending"

reverseDirection(sortDirection: SortDirection): SortDirection {
  return sortDirection == "ascending" ? "descending" : "ascending"
}

sortStatement(lhs: any, rhs: any, sortDirection: SortDirection): number {
  if (lhs === rhs) {
    return 0
  } else if (sortDirection === "ascending") {
    return (lhs > rhs) ? 1 : -1
  } else if (sortDirection === "descending") {
    return (lhs < rhs) ? 1 : -1
  } else {
    return 0
  }
}

sort<T>(
  items: Array<T>,
  direction: SortDirection,
  compare: (lhs: T, rhs: T) => [any, any]): Array<T> {
    return items.sort((lhs: T, rhs: T) => {
      const pair = compare(lhs, rhs)
      return this.sortStatement(pair[0], pair[1], direction)
    })
}