11import Foundation
22
33/// Use both memory and disk storage. Try on memory first.
4- public final class HybridStorage < T > {
5- public let memoryStorage : MemoryStorage < T >
6- public let diskStorage : DiskStorage < T >
4+ public final class HybridStorage < Key : Hashable , Value > {
5+ public let memoryStorage : MemoryStorage < Key , Value >
6+ public let diskStorage : DiskStorage < Key , Value >
77
8- private( set) var storageObservations = [ UUID : ( HybridStorage , StorageChange ) -> Void ] ( )
9- private( set) var keyObservations = [ String : ( HybridStorage , KeyChange < T > ) -> Void ] ( )
8+ private( set) var storageObservations = [ UUID : ( HybridStorage , StorageChange < Key > ) -> Void ] ( )
9+ private( set) var keyObservations = [ Key : ( HybridStorage , KeyChange < Value > ) -> Void ] ( )
1010
11- public init ( memoryStorage: MemoryStorage < T > , diskStorage: DiskStorage < T > ) {
11+ public init ( memoryStorage: MemoryStorage < Key , Value > , diskStorage: DiskStorage < Key , Value > ) {
1212 self . memoryStorage = memoryStorage
1313 self . diskStorage = diskStorage
1414
@@ -26,7 +26,7 @@ public final class HybridStorage<T> {
2626}
2727
2828extension HybridStorage : StorageAware {
29- public func entry( forKey key: String ) throws -> Entry < T > {
29+ public func entry( forKey key: Key ) throws -> Entry < Value > {
3030 do {
3131 return try memoryStorage. entry ( forKey: key)
3232 } catch {
@@ -37,15 +37,15 @@ extension HybridStorage: StorageAware {
3737 }
3838 }
3939
40- public func removeObject( forKey key: String ) throws {
40+ public func removeObject( forKey key: Key ) throws {
4141 memoryStorage. removeObject ( forKey: key)
4242 try diskStorage. removeObject ( forKey: key)
4343
4444 notifyStorageObservers ( about: . remove( key: key) )
4545 }
4646
47- public func setObject( _ object: T , forKey key: String , expiry: Expiry ? = nil ) throws {
48- var keyChange : KeyChange < T > ?
47+ public func setObject( _ object: Value , forKey key: Key , expiry: Expiry ? = nil ) throws {
48+ var keyChange : KeyChange < Value > ?
4949
5050 if keyObservations [ key] != nil {
5151 keyChange = . edit( before: try ? self . object ( forKey: key) , after: object)
@@ -78,8 +78,8 @@ extension HybridStorage: StorageAware {
7878}
7979
8080public extension HybridStorage {
81- func transform< U> ( transformer: Transformer < U > ) -> HybridStorage < U > {
82- let storage = HybridStorage < U > (
81+ func transform< U> ( transformer: Transformer < U > ) -> HybridStorage < Key , U > {
82+ let storage = HybridStorage < Key , U > (
8383 memoryStorage: memoryStorage. transform ( ) ,
8484 diskStorage: diskStorage. transform ( transformer: transformer)
8585 )
@@ -92,7 +92,7 @@ extension HybridStorage: StorageObservationRegistry {
9292 @discardableResult
9393 public func addStorageObserver< O: AnyObject > (
9494 _ observer: O ,
95- closure: @escaping ( O , HybridStorage , StorageChange ) -> Void
95+ closure: @escaping ( O , HybridStorage , StorageChange < Key > ) -> Void
9696 ) -> ObservationToken {
9797 let id = UUID ( )
9898
@@ -114,7 +114,7 @@ extension HybridStorage: StorageObservationRegistry {
114114 storageObservations. removeAll ( )
115115 }
116116
117- private func notifyStorageObservers( about change: StorageChange ) {
117+ private func notifyStorageObservers( about change: StorageChange < Key > ) {
118118 storageObservations. values. forEach { closure in
119119 closure ( self , change)
120120 }
@@ -125,8 +125,8 @@ extension HybridStorage: KeyObservationRegistry {
125125 @discardableResult
126126 public func addObserver< O: AnyObject > (
127127 _ observer: O ,
128- forKey key: String ,
129- closure: @escaping ( O , HybridStorage , KeyChange < T > ) -> Void
128+ forKey key: Key ,
129+ closure: @escaping ( O , HybridStorage , KeyChange < Value > ) -> Void
130130 ) -> ObservationToken {
131131 keyObservations [ key] = { [ weak self, weak observer] storage, change in
132132 guard let observer = observer else {
@@ -142,24 +142,24 @@ extension HybridStorage: KeyObservationRegistry {
142142 }
143143 }
144144
145- public func removeObserver( forKey key: String ) {
145+ public func removeObserver( forKey key: Key ) {
146146 keyObservations. removeValue ( forKey: key)
147147 }
148148
149149 public func removeAllKeyObservers( ) {
150150 keyObservations. removeAll ( )
151151 }
152152
153- private func notifyObserver( forKey key: String , about change: KeyChange < T > ) {
153+ private func notifyObserver( forKey key: Key , about change: KeyChange < Value > ) {
154154 keyObservations [ key] ? ( self , change)
155155 }
156156
157- private func notifyObserver( about change: KeyChange < T > , whereKey closure: ( ( String ) -> Bool ) ) {
157+ private func notifyObserver( about change: KeyChange < Value > , whereKey closure: ( ( Key ) -> Bool ) ) {
158158 let observation = keyObservations. first { key, _ in closure ( key) } ? . value
159159 observation ? ( self , change)
160160 }
161161
162- private func notifyKeyObservers( about change: KeyChange < T > ) {
162+ private func notifyKeyObservers( about change: KeyChange < Value > ) {
163163 keyObservations. values. forEach { closure in
164164 closure ( self , change)
165165 }
0 commit comments