import Foundation final class RDEPUBChapterDataCache { private var storage: [Int: RDEPUBRuntimeChapter] = [:] private let lock = NSLock() subscript(_ spineIndex: Int) -> RDEPUBRuntimeChapter? { get { lock.lock() defer { lock.unlock() } return storage[spineIndex] } set { lock.lock() defer { lock.unlock() } storage[spineIndex] = newValue } } var storedSpineIndices: [Int] { lock.lock() defer { lock.unlock() } return Array(storage.keys) } func remove(spineIndex: Int) { lock.lock() defer { lock.unlock() } storage.removeValue(forKey: spineIndex) } func removeAll() { lock.lock() defer { lock.unlock() } storage.removeAll() } }