5 // Created by Hori,Masaki on 2018/01/13.
6 // Copyright © 2018年 Hori,Masaki. All rights reserved.
20 init(_ error: Error) {
27 if case let .value(value) = self { return value }
31 if case let .error(error) = self { return error }
36 enum FutureError: Error {
43 private let defaultWaitingQueue = DispatchQueue(label: "Future", attributes: .concurrent)
44 private final class FutureSynchronous {
46 private let queue: DispatchQueue
47 private let semaphore = DispatchSemaphore(value: 1)
49 init(queue: DispatchQueue? = nil) {
51 self.queue = queue ?? defaultWaitingQueue
54 func excuteAfterWaiting(_ block: @escaping () -> Void) {
59 self.semaphore.signal()
70 self.semaphore.signal()
76 private let synchronous: FutureSynchronous
78 fileprivate var result: Result<T>? {
81 fatalError("Result already seted.")
86 fatalError("set nil to result.")
88 synchronous.stopWaiting()
92 var isCompleted: Bool {
95 var value: Result<T>? {
102 self.synchronous = FutureSynchronous()
104 synchronous.startWaiting()
107 init(_ block: @escaping () throws -> T) {
109 self.synchronous = FutureSynchronous()
111 synchronous.excuteAfterWaiting {
113 self.result = Result(try block())
115 self.result = Result(error)
120 init(_ result: Result<T>) {
122 self.synchronous = FutureSynchronous()
126 convenience init(_ value: T) {
128 self.init(Result(value))
130 convenience init(_ error: Error) {
132 self.init(Result(error))
136 synchronous.stopWaiting()
144 func await() -> Self {
146 synchronous.startWaiting()
147 synchronous.stopWaiting()
153 func onComplete(_ block: @escaping (Result<T>) -> Void) -> Self {
155 synchronous.excuteAfterWaiting {
156 self.value.map(block)
163 func onSuccess(_ block: @escaping (T) -> Void) -> Self {
165 onComplete { result in result.value.map(block) }
171 func onFailure(_ block: @escaping (Error) -> Void) -> Self {
173 onComplete { result in result.error.map(block) }
182 func transform<U>(_ s: @escaping (T) -> U, _ f: @escaping (Error) -> Error) -> Future<U> {
184 return transform { result in
186 case let .value(value): return Result(s(value))
187 case let .error(error): return Result(f(error))
192 func transform<U>(_ s: @escaping (Result<T>) -> Result<U>) ->Future<U> {
196 self.await().value.map(s) ?? Result(FutureError.unsolvedFuture)
201 func map<U>(_ t: @escaping (T) -> U) -> Future<U> {
203 return transform(t, { $0 })
206 func flatMap<U>(_ t: @escaping (T) -> Future<U>) -> Future<U> {
210 switch self.await().value {
211 case .value(let v)?: return t(v)
212 case .error(let e)?: return Future<U>(e)
213 case .none: fatalError("Future not complete")
219 func filter(_ f: @escaping (T) -> Bool) -> Future<T> {
223 if case let .value(v)? = self.await().value, f(v) {
226 return Result(FutureError.noSuchElement)
231 func recover(_ s: @escaping (Error) throws -> T) -> Future<T> {
233 return transform { result in
235 return try result.error.map { error in Result(try s(error)) } ?? Result(FutureError.unsolvedFuture)
243 func andThen(_ f: @escaping (Result<T>) -> Void) -> Future<T> {
247 guard let result = self.await().result else { fatalError("Future not complete") }
256 private extension Future {
258 func complete(_ result: Result<T>) {
264 private let promiseQueue = DispatchQueue(label: "Promise", attributes: .concurrent)
265 final class Promise<T> {
267 let future: Future<T> = Future<T>()
270 func complete(_ result: Result<T>) {
272 future.complete(result)
274 func success(_ value: T) {
276 complete(Result(value))
278 func failure(_ error: Error) {
280 complete(Result(error))
283 func complete(_ completor: @escaping () -> Result<T>) -> Self {
286 self.complete(completor())
292 func completeWith(_ completor: @escaping () -> Future<T>) -> Self {