package nuapi import ( "context" "fmt" "os" "slices" ) type ChapterEntryTraverser func(ctx context.Context, api *Api, novelID NovelID, pageCount int, out chan<- NovelChapterEntry) // TraverseAscending returns a ChapterEntryTraverser which traverses entries from oldest to newest chapter func TraverseAscending() ChapterEntryTraverser { return func(ctx context.Context, api *Api, novelID NovelID, pageCount int, out chan<- NovelChapterEntry) { defer close(out) for pageIndex := pageCount; pageIndex > 0; pageIndex-- { if ctx.Err() != nil { break } entries, err := api.getChapterEntriesByPageIndex(novelID, pageIndex) if err != nil { if Verbose { fmt.Fprintln(os.Stderr, err) } return } slices.Reverse(entries) for _, entry := range entries { out <- entry } } } } // TraverseDescending returns a ChapterEntryTraverser which traverses entries from newest to oldest chapter func TraverseDescending() ChapterEntryTraverser { return func(ctx context.Context, api *Api, novelID NovelID, pageCount int, out chan<- NovelChapterEntry) { defer close(out) for pageIndex := 1; pageIndex <= pageCount; pageIndex++ { if ctx.Err() != nil { break } entries, err := api.getChapterEntriesByPageIndex(novelID, pageIndex) if err != nil { if Verbose { fmt.Fprintln(os.Stderr, err) } return } for _, entry := range entries { out <- entry } } } }