import Foundation struct RDEPUBResolvedPage { let page: RDEPUBTextPage let chapter: RDEPUBRuntimeChapter let chapterIndex: Int } final class RDEPUBPageResolver { private unowned let context: RDEPUBReaderContext private let store: RDEPUBChapterRuntimeStore init(context: RDEPUBReaderContext, store: RDEPUBChapterRuntimeStore) { self.context = context self.store = store } func resolvePage(absolutePageIndex: Int) -> RDEPUBResolvedPage? { guard let bookPageMap = context.bookPageMap, let spineIndex = bookPageMap.spineIndex(forAbsolutePage: absolutePageIndex), let localPageIndex = bookPageMap.localPageIndex(forAbsolutePage: absolutePageIndex), let chapter = store.chapterData(for: spineIndex), chapter.pages.indices.contains(localPageIndex), let chapterIndex = bookPageMap.chapterIndex(forSpineIndex: spineIndex) else { return nil } var page = chapter.pages[localPageIndex] page.absolutePageIndex = absolutePageIndex page.chapterIndex = chapterIndex page.pageIndexInChapter = localPageIndex page.totalPagesInChapter = chapter.pages.count return RDEPUBResolvedPage(page: page, chapter: chapter, chapterIndex: chapterIndex) } }