Skip to content

Commit

Permalink
Add Rankable protocol (#803)
Browse files Browse the repository at this point in the history
- Add extension helpers to Array of Rankable.
- ArtistDigest and VenueDigest are now Rankable, and do not need
specialized extensions on Array anymore.
  • Loading branch information
bolsinga committed Jun 8, 2024
1 parent ff28b32 commit 65c16b3
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 46 deletions.
24 changes: 1 addition & 23 deletions Sources/Site/Music/ArtistDigest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -30,26 +30,4 @@ extension ArtistDigest: LibraryComparable {
}
}

extension Array where Element == ArtistDigest {
func ranked(by sort: RankingSort) -> [Ranking: [ArtistDigest]] {
self.reduce(into: [Ranking: [ArtistDigest]]()) {
let ranking = $1.ranking(for: sort)
var arr = ($0[ranking] ?? [])
arr.append($1)
$0[ranking] = arr
}
}

var firstSeen: [PartialDate: [ArtistDigest]] {
self.reduce(into: [PartialDate: [(ArtistDigest, FirstSet)]]()) {
let firstSet = $1.firstSet
var arr = ($0[firstSet.date] ?? [])
arr.append(($1, firstSet))
$0[firstSet.date] = arr
}.reduce(into: [PartialDate: [ArtistDigest]]()) {
$0[$1.key] = $1.value.sorted(by: { lhs, rhs in
lhs.1.rank < rhs.1.rank
}).map { $0.0 }
}
}
}
extension ArtistDigest: Rankable {}
37 changes: 37 additions & 0 deletions Sources/Site/Music/Rankable.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
//
// Rankable.swift
//
//
// Created by Greg Bolsinga on 6/8/24.
//

import Foundation

protocol Rankable: LibraryComparable, Hashable, PathRestorable {
var firstSet: FirstSet { get }
func ranking(for sort: RankingSort) -> Ranking
}

extension Array where Element: Rankable {
func ranked(by sort: RankingSort) -> [Ranking: [Element]] {
self.reduce(into: [Ranking: [Element]]()) {
let ranking = $1.ranking(for: sort)
var arr = ($0[ranking] ?? [])
arr.append($1)
$0[ranking] = arr
}
}

var firstSeen: [PartialDate: [Element]] {
self.reduce(into: [PartialDate: [(Element, FirstSet)]]()) {
let firstSet = $1.firstSet
var arr = ($0[firstSet.date] ?? [])
arr.append(($1, firstSet))
$0[firstSet.date] = arr
}.reduce(into: [PartialDate: [Element]]()) {
$0[$1.key] = $1.value.sorted(by: { lhs, rhs in
lhs.1.rank < rhs.1.rank
}).map { $0.0 }
}
}
}
24 changes: 1 addition & 23 deletions Sources/Site/Music/VenueDigest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -30,26 +30,4 @@ extension VenueDigest: LibraryComparable {
}
}

extension Array where Element == VenueDigest {
func ranked(by sort: RankingSort) -> [Ranking: [VenueDigest]] {
self.reduce(into: [Ranking: [VenueDigest]]()) {
let ranking = $1.ranking(for: sort)
var arr = ($0[ranking] ?? [])
arr.append($1)
$0[ranking] = arr
}
}

var firstSeen: [PartialDate: [VenueDigest]] {
self.reduce(into: [PartialDate: [(VenueDigest, FirstSet)]]()) {
let firstSet = $1.firstSet
var arr = ($0[firstSet.date] ?? [])
arr.append(($1, firstSet))
$0[firstSet.date] = arr
}.reduce(into: [PartialDate: [VenueDigest]]()) {
$0[$1.key] = $1.value.sorted(by: { lhs, rhs in
lhs.1.rank < rhs.1.rank
}).map { $0.0 }
}
}
}
extension VenueDigest: Rankable {}

0 comments on commit 65c16b3

Please sign in to comment.