package arn import ( "sort" "strconv" "strings" ) // EpisodeList is a list of episodes. type EpisodeList []*Episode // Sort sorts the episodes by episode number. func (episodes EpisodeList) Sort() { sort.Slice(episodes, func(i, j int) bool { return episodes[i].Number < episodes[j].Number }) } // Find finds the given episode number. func (episodes EpisodeList) Find(episodeNumber int) (*Episode, int) { for index, episode := range episodes { if episode.Number == episodeNumber { return episode, index } } return nil, -1 } // Merge combines the data of both episode lists to one. func (episodes EpisodeList) Merge(b EpisodeList) EpisodeList { for index, episode := range b { if index >= len(episodes) { episodes = append(episodes, episode) } else { episodes[index].Merge(episode) } } return episodes } // HumanReadable returns a text representation of the anime episodes. func (episodes EpisodeList) HumanReadable() string { b := strings.Builder{} for _, episode := range episodes { b.WriteString(strconv.Itoa(episode.Number)) b.WriteString(" | ") b.WriteString(episode.Title.Japanese) b.WriteString(" | ") b.WriteString(episode.AiringDate.StartDateHuman()) b.WriteByte('\n') } return strings.TrimRight(b.String(), "\n") } // AvailableCount counts the number of available episodes. func (episodes EpisodeList) AvailableCount() int { available := 0 for _, episode := range episodes { if episode.Available() { available++ } } return available }