import Combine import Disk import Foundation protocol FileStorage { func save(_: Value, as name: String) -> AnyPublisher func retrieve(_: String, as type: Value.Type) -> AnyPublisher func append(_: Value, to name: String) -> AnyPublisher } final class BaseFileStorage: FileStorage { private let processQueue = DispatchQueue(label: "BaseFileStorage.processQueue") func save(_ value: Value, as name: String) -> AnyPublisher { Future { promise in self.processQueue.async { do { let encoder = JSONEncoder() encoder.outputFormatting = .prettyPrinted try Disk.save(value, to: .documents, as: name, encoder: encoder) promise(.success(())) } catch { promise(.failure(error)) } } } .eraseToAnyPublisher() } func retrieve(_ name: String, as type: Value.Type) -> AnyPublisher { Future { promise in self.processQueue.async { do { let value = try Disk.retrieve(name, from: .documents, as: type) promise(.success(value)) } catch { promise(.failure(error)) } } } .eraseToAnyPublisher() } func append(_ newValue: Value, to name: String) -> AnyPublisher { Future { promise in self.processQueue.async { do { try Disk.append(newValue, to: name, in: .documents) promise(.success(())) } catch { promise(.failure(error)) } } } .eraseToAnyPublisher() } }