Advertisement
Guest User

Untitled

a guest
Oct 17th, 2019
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.06 KB | None | 0 0
  1. /// Removes stale objects after 12 hours.
  2. final class Cache<Key: Hashable, Value> {
  3. private let wrapped = NSCache<WrappedKey, Entry>()
  4. private let dateProvider: () -> Date
  5. private let entryLifetime: TimeInterval
  6.  
  7. init(dateProvider: @escaping () -> Date = Date.init,
  8. entryLifetime: TimeInterval = 12 * 60 * 60) {
  9. self.dateProvider = dateProvider
  10. self.entryLifetime = entryLifetime
  11. }
  12.  
  13. func insert(_ value: Value, forKey key: Key) {
  14. let date = dateProvider().addingTimeInterval(entryLifetime)
  15. let entry = Entry(value: value, expirationDate: date)
  16. wrapped.setObject(entry, forKey: WrappedKey(key))
  17. }
  18.  
  19. func value(forKey key: Key) -> Value? {
  20. guard let entry = wrapped.object(forKey: WrappedKey(key)) else {
  21. return nil
  22. }
  23.  
  24. guard dateProvider() < entry.expirationDate else {
  25. removeValue(forKey: key)
  26. return nil
  27. }
  28.  
  29. return entry.value
  30. }
  31.  
  32. func removeValue(forKey key: Key) {
  33. wrapped.removeObject(forKey: WrappedKey(key))
  34. }
  35. }
  36.  
  37. extension Cache {
  38. subscript(key: Key) -> Value? {
  39. get {
  40. return value(forKey: key)
  41. }
  42. set {
  43. guard let value = newValue else {
  44. removeValue(forKey: key)
  45. return
  46. }
  47.  
  48. insert(value, forKey: key)
  49. }
  50. }
  51. }
  52.  
  53. private extension Cache {
  54. final class WrappedKey: NSObject {
  55. let key: Key
  56.  
  57. init(_ key: Key) {
  58. self.key = key
  59. }
  60.  
  61. override var hash: Int {
  62. return key.hashValue
  63. }
  64.  
  65. override func isEqual(_ object: Any?) -> Bool {
  66. guard let value = object as? WrappedKey else {
  67. return false
  68. }
  69.  
  70. return value.key == key
  71. }
  72. }
  73. }
  74.  
  75. private extension Cache {
  76. final class Entry {
  77. let value: Value
  78. let expirationDate: Date
  79.  
  80. init(value: Value, expirationDate: Date) {
  81. self.value = value
  82. self.expirationDate = expirationDate
  83. }
  84. }
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement