@@ -3,26 +3,26 @@ import Dispatch
33
44/// Manipulate storage in a "all async" manner.
55/// The completion closure will be called when operation completes.
6- public class AsyncStorage {
7- fileprivate let internalStorage : StorageAware
6+ public class AsyncStorage < T > {
7+ public let innerStorage : HybridStorage < T >
88 public let serialQueue : DispatchQueue
99
10- init ( storage: StorageAware , serialQueue: DispatchQueue ) {
11- self . internalStorage = storage
10+ public init ( storage: HybridStorage < T > , serialQueue: DispatchQueue ) {
11+ self . innerStorage = storage
1212 self . serialQueue = serialQueue
1313 }
1414}
1515
16- extension AsyncStorage : AsyncStorageAware {
17- public func entry< T > ( ofType type : T . Type , forKey key: String , completion: @escaping ( Result < Entry < T > > ) -> Void ) {
16+ extension AsyncStorage {
17+ public func entry( forKey key: String , completion: @escaping ( Result < Entry < T > > ) -> Void ) {
1818 serialQueue. async { [ weak self] in
1919 guard let `self` = self else {
2020 completion ( Result . error ( StorageError . deallocated) )
2121 return
2222 }
2323
2424 do {
25- let anEntry = try self . internalStorage . entry ( ofType : type , forKey: key)
25+ let anEntry = try self . innerStorage . entry ( forKey: key)
2626 completion ( Result . value ( anEntry) )
2727 } catch {
2828 completion ( Result . error ( error) )
@@ -38,26 +38,27 @@ extension AsyncStorage: AsyncStorageAware {
3838 }
3939
4040 do {
41- try self . internalStorage . removeObject ( forKey: key)
41+ try self . innerStorage . removeObject ( forKey: key)
4242 completion ( Result . value ( ( ) ) )
4343 } catch {
4444 completion ( Result . error ( error) )
4545 }
4646 }
4747 }
4848
49- public func setObject< T: Codable > ( _ object: T ,
50- forKey key: String ,
51- expiry: Expiry ? = nil ,
52- completion: @escaping ( Result < ( ) > ) -> Void ) {
49+ public func setObject(
50+ _ object: T ,
51+ forKey key: String ,
52+ expiry: Expiry ? = nil ,
53+ completion: @escaping ( Result < ( ) > ) -> Void ) {
5354 serialQueue. async { [ weak self] in
5455 guard let `self` = self else {
5556 completion ( Result . error ( StorageError . deallocated) )
5657 return
5758 }
5859
5960 do {
60- try self . internalStorage . setObject ( object, forKey: key, expiry: expiry)
61+ try self . innerStorage . setObject ( object, forKey: key, expiry: expiry)
6162 completion ( Result . value ( ( ) ) )
6263 } catch {
6364 completion ( Result . error ( error) )
@@ -73,7 +74,7 @@ extension AsyncStorage: AsyncStorageAware {
7374 }
7475
7576 do {
76- try self . internalStorage . removeAll ( )
77+ try self . innerStorage . removeAll ( )
7778 completion ( Result . value ( ( ) ) )
7879 } catch {
7980 completion ( Result . error ( error) )
@@ -89,11 +90,40 @@ extension AsyncStorage: AsyncStorageAware {
8990 }
9091
9192 do {
92- try self . internalStorage . removeExpiredObjects ( )
93+ try self . innerStorage . removeExpiredObjects ( )
9394 completion ( Result . value ( ( ) ) )
9495 } catch {
9596 completion ( Result . error ( error) )
9697 }
9798 }
9899 }
100+
101+ public func object( forKey key: String , completion: @escaping ( Result < T > ) -> Void ) {
102+ entry ( forKey: key, completion: { ( result: Result < Entry < T > > ) in
103+ completion ( result. map ( { entry in
104+ return entry. object
105+ } ) )
106+ } )
107+ }
108+
109+ public func existsObject(
110+ forKey key: String ,
111+ completion: @escaping ( Result < Bool > ) -> Void ) {
112+ object ( forKey: key, completion: { ( result: Result < T > ) in
113+ completion ( result. map ( { _ in
114+ return true
115+ } ) )
116+ } )
117+ }
118+ }
119+
120+ public extension AsyncStorage {
121+ func transform< U> ( transformer: Transformer < U > ) -> AsyncStorage < U > {
122+ let storage = AsyncStorage < U > (
123+ storage: innerStorage. transform ( transformer: transformer) ,
124+ serialQueue: serialQueue
125+ )
126+
127+ return storage
128+ }
99129}
0 commit comments