import Foundation import Dispatch /// Manipulate storage in a "all sync" manner. /// Block the current queue until the operation completes. public class SyncStorage { public let innerStorage: HybridStorage public let serialQueue: DispatchQueue public init(storage: HybridStorage, serialQueue: DispatchQueue) { self.innerStorage = storage self.serialQueue = serialQueue } } extension SyncStorage: StorageAware { public func entry(forKey key: String) throws -> Entry { var entry: Entry! try serialQueue.sync { entry = try innerStorage.entry(forKey: key) } return entry } public func removeObject(forKey key: String) throws { try serialQueue.sync { try self.innerStorage.removeObject(forKey: key) } } public func setObject(_ object: T, forKey key: String, expiry: Expiry? = nil) throws { try serialQueue.sync { try innerStorage.setObject(object, forKey: key, expiry: expiry) } } public func removeAll() throws { try serialQueue.sync { try innerStorage.removeAll() } } public func removeExpiredObjects() throws { try serialQueue.sync { try innerStorage.removeExpiredObjects() } } } public extension SyncStorage { func transform(transformer: Transformer) -> SyncStorage { let storage = SyncStorage( storage: innerStorage.transform(transformer: transformer), serialQueue: serialQueue ) return storage } }