Files
TelegramSwift/packages/TGUIKit/Sources/PresentationResourceCache.swift

51 lines
1.4 KiB
Swift

import Cocoa
import SwiftSignalKit
private final class PresentationsResourceCacheHolder {
var images: [Int32: CGImage] = [:]
}
private final class PresentationsResourceAnyCacheHolder {
var objects: [Int32: Any] = [:]
}
public final class PresentationsResourceCache {
public init() {
}
private let imageCache = Atomic<PresentationsResourceCacheHolder>(value: PresentationsResourceCacheHolder())
private let objectCache = Atomic<PresentationsResourceAnyCacheHolder>(value: PresentationsResourceAnyCacheHolder())
public func image(_ key: Int32, _ generate: () -> CGImage) -> CGImage {
let result = self.imageCache.with { holder -> CGImage? in
return holder.images[key]
}
if let result = result {
return result
} else {
let image = generate()
self.imageCache.with { holder -> Void in
holder.images[key] = image
}
return image
}
}
public func object(_ key: Int32, _ generate: () -> Any) -> Any {
let result = self.objectCache.with { holder -> Any? in
return holder.objects[key]
}
if let result = result {
return result
} else {
let object = generate()
self.objectCache.with { holder -> Void in
holder.objects[key] = object
}
return object
}
}
}