]> git.lizzy.rs Git - go-anidb.git/blob - titles/result.go
http: Recognize more Resource types
[go-anidb.git] / titles / result.go
1 package titles
2
3 import (
4         "sort"
5 )
6
7 type ResultSet map[AID]Anime // Mapping of AIDs to Anime
8 type Results []Anime
9
10 // Returns a slice with the AIDs of all anime in the Results.
11 func (res Results) AIDList() (aid []AID) {
12         aid = make([]AID, 0, len(res))
13         for _, r := range res {
14                 aid = append(aid, r.AID)
15         }
16         return
17 }
18
19 // Converts the SearchMatches (which usually contains various duplicates)
20 // into a ResultSet. Needs the same TitlesDatabase as was used to generate the
21 // SearchMatches.
22 func (matches SearchMatches) ToResultSet(db *TitlesDatabase) (rs ResultSet) {
23         if matches == nil {
24                 return nil
25         }
26         db.RLock()
27         defer db.RUnlock()
28
29         rs = ResultSet{}
30         for _, m := range matches {
31                 rs[m.AID] = *db.AnimeMap[m.AID]
32         }
33         return
34 }
35
36 func (rs ResultSet) unsortedResults() (res Results) {
37         res = make(Results, 0, len(rs))
38         for _, r := range rs {
39                 res = append(res, r)
40         }
41         return
42 }
43
44 // Returns true if the first parameter should sort before the second parameter
45 type ResultComparer func(*Anime, *Anime) bool
46
47 var (
48         aidSort = func(a *Anime, b *Anime) bool {
49                 return a.AID < b.AID
50         }
51         titleSort = func(a *Anime, b *Anime) bool {
52                 return sort.StringSlice{a.PrimaryTitle, b.PrimaryTitle}.Less(0, 1)
53         }
54 )
55
56 // Returns the results sorted by AID
57 func (rs ResultSet) ResultsByAID() (res Results) {
58         return rs.ResultsByFunc(aidSort)
59 }
60
61 // Returns the results in inverse AID sort
62 func (rs ResultSet) ReverseResultsByAID() (res Results) {
63         return rs.ReverseResultsByFunc(aidSort)
64 }
65
66 // Returns the results sorted by Primary Title
67 func (rs ResultSet) ResultsByPrimaryTitle() (res Results) {
68         return rs.ResultsByFunc(titleSort)
69 }
70
71 // Returns the results in inverse Primary Title sort
72 func (rs ResultSet) ReverseResultsByPrimaryTitle() (res Results) {
73         return rs.ReverseResultsByFunc(titleSort)
74 }
75
76 // Returns the results sorted according to the given ResultComparer
77 func (rs ResultSet) ResultsByFunc(f ResultComparer) (res Results) {
78         res = rs.unsortedResults()
79         f.Sort(res)
80         return
81 }
82
83 // Returns the results sorted inversely according to the given ResultComparer
84 func (rs ResultSet) ReverseResultsByFunc(f ResultComparer) (res Results) {
85         res = rs.unsortedResults()
86         f.ReverseSort(res)
87         return
88 }