import AppKit class ImageCache { static let shared = ImageCache() private let cache = NSCache() private let session: URLSession init(session: URLSession = .shared) { self.session = session } func image(for url: URL) -> NSImage? { return cache.object(forKey: url.absoluteString as NSString) } func insertImage(_ image: NSImage, for url: URL) { cache.setObject(image, forKey: url.absoluteString as NSString) } func fetchImage(url: URL) async throws -> NSImage { if let cached = image(for: url) { return cached } let (data, response) = try await session.data(from: url) guard let response = response as? HTTPURLResponse, (200...299).contains(response.statusCode) else { throw WallhavenError.apiError("Image download failed") } guard let image = NSImage(data: data) else { throw WallhavenError.decodingError(NSError(domain: "ImageCache", code: -1, userInfo: nil)) } insertImage(image, for: url) return image } }