diff --git a/Sources/Site/Music/ArtistDigest.swift b/Sources/Site/Music/ArtistDigest.swift index 6d57bb6..c614357 100644 --- a/Sources/Site/Music/ArtistDigest.swift +++ b/Sources/Site/Music/ArtistDigest.swift @@ -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 {} diff --git a/Sources/Site/Music/Rankable.swift b/Sources/Site/Music/Rankable.swift new file mode 100644 index 0000000..463ce13 --- /dev/null +++ b/Sources/Site/Music/Rankable.swift @@ -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 } + } + } +} diff --git a/Sources/Site/Music/VenueDigest.swift b/Sources/Site/Music/VenueDigest.swift index bb2ecbe..0199609 100644 --- a/Sources/Site/Music/VenueDigest.swift +++ b/Sources/Site/Music/VenueDigest.swift @@ -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 {}