Tusker/Tusker/Caching/MemoryCache.swift

70 lines
1.6 KiB
Swift

//
// MemoryCache.swift
// Tusker
//
// Created by Shadowfacts on 1/18/21.
// Copyright © 2021 Shadowfacts. All rights reserved.
//
import Foundation
class MemoryCache<T> {
private let cache = NSCache<NSString, Entry>()
private let defaultExpiry: CacheExpiry
init(defaultExpiry: CacheExpiry) {
self.defaultExpiry = defaultExpiry
}
func setObject(_ object: T, forKey key: String) {
let entry = Entry(expiresAt: defaultExpiry.date, object: object)
cache.setObject(entry, forKey: key as NSString)
}
func removeObject(forKey key: String) {
cache.removeObject(forKey: key as NSString)
}
func existsObject(forKey key: String) -> Bool {
return cache.object(forKey: key as NSString) != nil
}
func object(forKey key: String) throws -> T {
guard let entry = cache.object(forKey: key as NSString) else {
throw Error.notFound
}
guard entry.expiresAt.timeIntervalSinceNow >= 0 else {
cache.removeObject(forKey: key as NSString)
throw Error.expired
}
return entry.object
}
func removeAll() {
cache.removeAllObjects()
}
}
extension MemoryCache {
enum Error: Swift.Error {
case notFound
case expired
}
}
extension MemoryCache {
class Entry {
let expiresAt: Date
let object: T
init(expiresAt: Date, object: T) {
self.expiresAt = expiresAt
self.object = object
}
}
}