Skip to content

Commit 80de540

Browse files
committed
Use function composition to create sort functions
1 parent 82f05ed commit 80de540

File tree

1 file changed

+18
-43
lines changed

1 file changed

+18
-43
lines changed

src/features/sorting/utils/sortTracks.ts

Lines changed: 18 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,25 @@ type PlaylistTrack = SpotifyApi.PlaylistTrackObject
1212

1313
type CompareFunction = (trackA: PlaylistTrack, trackB: PlaylistTrack) => number
1414

15+
function createStringCompare(
16+
getter: (track: PlaylistTrack) => string,
17+
): CompareFunction {
18+
return (trackA, trackB) => compareStrings(getter(trackA), getter(trackB))
19+
}
20+
21+
function createNumberCompare(
22+
getter: (track: PlaylistTrack) => number,
23+
): CompareFunction {
24+
return (trackA, trackB) => getter(trackA) - getter(trackB)
25+
}
26+
1527
const rulesCompareFunctions: Record<SortKey, CompareFunction> = {
16-
artist: compareArtists,
17-
title: compareTitles,
18-
album: compareAlbums,
19-
release_date: compareReleaseDates,
20-
disc_number: compareDiscNumbers,
21-
track_number: compareTrackNumbers,
28+
artist: createStringCompare(getArtistName),
29+
title: createStringCompare(getTrackTitle),
30+
album: createStringCompare(getAlbumName),
31+
release_date: createStringCompare(getReleaseDate),
32+
disc_number: createNumberCompare(getDiscNumber),
33+
track_number: createNumberCompare(getTrackNumber),
2234
}
2335

2436
export function sortTracks(
@@ -49,43 +61,6 @@ export function sortTracks(
4961
return isArrayChanged
5062
}
5163

52-
function compareAlbums(trackA: PlaylistTrack, trackB: PlaylistTrack): number {
53-
return compareStrings(getAlbumName(trackA), getAlbumName(trackB))
54-
}
55-
56-
function compareArtists(trackA: PlaylistTrack, trackB: PlaylistTrack): number {
57-
return compareStrings(getArtistName(trackA), getArtistName(trackB))
58-
}
59-
60-
function compareReleaseDates(
61-
trackA: PlaylistTrack,
62-
trackB: PlaylistTrack,
63-
): number {
64-
return compareStrings(getReleaseDate(trackA), getReleaseDate(trackB))
65-
}
66-
67-
function compareTitles(trackA: PlaylistTrack, trackB: PlaylistTrack): number {
68-
return compareStrings(getTrackTitle(trackA), getTrackTitle(trackB))
69-
}
70-
71-
function compareDiscNumbers(
72-
trackA: PlaylistTrack,
73-
trackB: PlaylistTrack,
74-
): number {
75-
const discA = getDiscNumber(trackA)
76-
const discB = getDiscNumber(trackB)
77-
return discA - discB
78-
}
79-
80-
function compareTrackNumbers(
81-
trackA: PlaylistTrack,
82-
trackB: PlaylistTrack,
83-
): number {
84-
const trackNumA = getTrackNumber(trackA)
85-
const trackNumB = getTrackNumber(trackB)
86-
return trackNumA - trackNumB
87-
}
88-
8964
function compareStrings(str1: string, str2: string): number {
9065
if (!str1) {
9166
return -1

0 commit comments

Comments
 (0)