@@ -4,28 +4,31 @@ import Foundation
44
55// MARK: ScreenProviding
66
7+ @available ( iOS 13 . 0 , OSX 10 . 15 , * )
78public protocol ScreenProviding {
8- func screen( forID id: String ) -> Future < SomeScreen , Error >
9+ func screen( forID id: String ) -> AnyPublisher < SomeScreen , Error >
910}
1011
1112// MARK: ScreenProviding Basic Implementation
12-
13+ @ available ( iOS 13 . 0 , OSX 10 . 15 , * )
1314public struct MockScreenProvider : ScreenProviding {
1415 public var mockScreen : SomeScreen
1516
1617 public init ( mockScreen: SomeScreen ) {
1718 self . mockScreen = mockScreen
1819 }
1920
20- public func screen( forID id: String ) -> Future < SomeScreen , Error > {
21+ public func screen( forID id: String ) -> AnyPublisher < SomeScreen , Error > {
2122 Future { promise in
2223 var screen = mockScreen
2324 screen. id = id
2425 promise ( . success( screen) )
2526 }
27+ . eraseToAnyPublisher ( )
2628 }
2729}
2830
31+ @available ( iOS 13 . 0 , OSX 10 . 15 , * )
2932public struct URLScreenProvider : ScreenProviding {
3033 public enum URLScreenProviderError : Error {
3134 case noResponse
@@ -38,7 +41,7 @@ public struct URLScreenProvider: ScreenProviding {
3841 self . baseURL = baseURL
3942 }
4043
41- public func screen( forID id: String ) -> Future < SomeScreen , Error > {
44+ public func screen( forID id: String ) -> AnyPublisher < SomeScreen , Error > {
4245 Future { promise in
4346 URLSession . shared. dataTask ( with: baseURL. appendingPathComponent ( id) ) { ( data, response, error) in
4447 if let error = error {
@@ -62,9 +65,11 @@ public struct URLScreenProvider: ScreenProviding {
6265 }
6366 } . resume ( )
6467 }
68+ . eraseToAnyPublisher ( )
6569 }
6670}
6771
72+ @available ( iOS 13 . 0 , OSX 10 . 15 , * )
6873public struct UserDefaultScreenProvider : ScreenProviding {
6974 public enum UserDefaultScreenProviderError : Error {
7075 case noData
@@ -76,7 +81,7 @@ public struct UserDefaultScreenProvider: ScreenProviding {
7681 self . baseKey = baseKey
7782 }
7883
79- public func screen( forID id: String ) -> Future < SomeScreen , Error > {
84+ public func screen( forID id: String ) -> AnyPublisher < SomeScreen , Error > {
8085 Future { promise in
8186 guard let data = UserDefaults . standard. data ( forKey: baseKey + id) else {
8287 promise ( . failure( UserDefaultScreenProviderError . noData) )
@@ -89,24 +94,26 @@ public struct UserDefaultScreenProvider: ScreenProviding {
8994 promise ( . failure( error) )
9095 }
9196 }
97+ . eraseToAnyPublisher ( )
9298 }
9399}
94100
95101// MARK: ScreenStoring
102+ @available ( iOS 13 . 0 , OSX 10 . 15 , * )
96103public protocol ScreenStoring {
97- func store( screens: [ SomeScreen ] ) -> Future < Void , Error >
104+ func store( screens: [ SomeScreen ] ) -> AnyPublisher < Void , Error >
98105}
99106
100107// MARK: ScreenStoring Basic Implementation
101-
108+ @ available ( iOS 13 . 0 , OSX 10 . 15 , * )
102109public struct UserDefaultScreenStorer : ScreenStoring {
103110 public var baseKey : String
104111
105112 public init ( baseKey: String ) {
106113 self . baseKey = baseKey
107114 }
108115
109- public func store( screens: [ SomeScreen ] ) -> Future < Void , Error > {
116+ public func store( screens: [ SomeScreen ] ) -> AnyPublisher < Void , Error > {
110117 Future { promise in
111118 do {
112119 try screens. forEach { screen in
@@ -120,45 +127,28 @@ public struct UserDefaultScreenStorer: ScreenStoring {
120127 promise ( . failure( error) )
121128 }
122129 }
130+ . eraseToAnyPublisher ( )
123131 }
124132}
125133
126134// MARK: ScreenLoading
135+ @available ( iOS 13 . 0 , OSX 10 . 15 , * )
127136public protocol ScreenLoading {
128- func load( withProvider provider: ScreenProviding ) -> Future < [ SomeScreen ] , Error >
137+ func load( withProvider provider: ScreenProviding ) -> AnyPublisher < [ SomeScreen ] , Error >
129138}
130139
131- // MARK: ScreenLoading Basic Implementation [WIP]
132- //
140+ //// MARK: ScreenLoading Basic Implementation [WIP]
141+ //@available(iOS 13.0, OSX 10.15, *)
133142//extension SomeScreen: ScreenLoading {
134143//
135- // public func load(withProvider provider: ScreenProviding) -> Future<[SomeScreen], Error> {
136- // Future { promise in
137- // var bag = [AnyCancellable]()
138- // var screens = [SomeScreen]()
139- //
140- // Publishers.MergeMany(
141- // destinations
142- // .filter { $0.type == .screen }
143- // .map { destination in
144- // provider.screen(forID: destination.toID)
145- // }.lazy
146- // .publisher
147- // .collect()
148- // )
149- // .sink(receiveCompletion: { _ in }) { (result) in
150- //
151- //// result.forEach { futureScreen in
152- //// futureScreen
153- //// .sink(receiveCompletion: { _ in }) { (screen) in
154- //// screens.append(screen)
155- //// }
156- //// .store(in: &bag)
157- //// }
158- // }
159- // .store(in: &bag)
160- //
161- // }
144+ // public func load(withProvider provider: ScreenProviding) -> AnyPublisher<[SomeScreen], Error> {
145+ // Publishers.MergeMany(
146+ // destinations
147+ // .filter { $0.type == .screen }
148+ // .map { destination in
149+ // provider.screen(forID: destination.toID)
150+ // }
151+ // )
162152// }
163153//}
164154
@@ -179,9 +169,11 @@ public extension SomeView {
179169 let destinations = [ someCustomView. destination,
180170 someCustomView. someImage? . destination]
181171 . compactMap { $0 }
182- let subViewDestinations = someCustomView. views
183- . map ( \. destinations)
184- . reduce ( [ ] , + )
172+ guard let subViewDestinations = someCustomView. views?
173+ . map ( \. destinations)
174+ . reduce ( [ ] , + ) else {
175+ return destinations
176+ }
185177
186178 return destinations + subViewDestinations
187179 }
0 commit comments