import UIKit final class RDEPUBReaderState { var parser: RDEPUBParser? var publication: RDEPUBPublication? var readingSession: RDEPUBReadingSession? var textBook: RDEPUBTextBook? var bookPageMap: RDEPUBBookPageMap? var activeBookmarks: [RDEPUBBookmark] = [] var activeHighlights: [RDEPUBHighlight] = [] var currentBookIdentifier: String? var paginationToken = UUID() var paginator: RDEPUBPaginator? var searchState: RDEPUBSearchState? var pendingFullPageMap: RDEPUBBookPageMap? var lastTextPaginationPageSize: CGSize? var lastMetadataParseWallClockMs: Int = 0 var lastMetadataParseConcurrency: Int = 0 var selectionState: RDEPUBSelectionState = .idle var isRepaginating: Bool = false var didStartInitialLoad: Bool = false var isExternalTextBook: Bool = false var textFileURL: URL? let textBookCache = RDEPUBTextBookCache() var currentSelection: RDEPUBSelection? { get { selectionState.selection } set { if let newValue, !newValue.isEmpty { selectionState = .selected(newValue) } else { selectionState = .idle } } } var activePages: [EPUBPage] { readingSession?.activePages ?? [] } var activeChapters: [EPUBChapterInfo] { readingSession?.activeChapters ?? [] } func replaceActiveSnapshot(_ snapshot: RDEPUBReadingSession.PaginationSnapshot) { readingSession?.setActiveSnapshot(snapshot) } func clearActiveSnapshot() { readingSession?.resetRuntimeState() } }