5 // Created by Hori,Masaki on 2018/01/13.
6 // Copyright © 2018年 Hori,Masaki. All rights reserved.
20 init(_ error: Error) {
25 enum FutureError: Error {
32 private let defaultWaitingQueue = DispatchQueue(label: "Future", attributes: .concurrent)
33 private final class FutureSynchronous {
35 private let queue: DispatchQueue
36 private let semaphore = DispatchSemaphore(value: 1)
38 init(queue: DispatchQueue = defaultWaitingQueue) {
42 func excuteAfterWaiting(_ block: @escaping () -> Void) {
47 self.semaphore.signal()
56 self.semaphore.signal()
62 private let synchronous: FutureSynchronous
64 fileprivate var result: Result<T>? {
67 fatalError("Result already seted")
71 synchronous.stopWaiting()
76 init(queue: DispatchQueue? = nil) {
78 self.synchronous = queue.map { FutureSynchronous(queue: $0) } ?? FutureSynchronous()
80 synchronous.startWaiting()
83 init(queue: DispatchQueue? = nil, _ block: @escaping () throws -> T) {
85 self.synchronous = queue.map { FutureSynchronous(queue: $0) } ?? FutureSynchronous()
87 synchronous.excuteAfterWaiting {
89 self.result = Result(try block())
91 self.result = Result(error)
96 init(queue: DispatchQueue? = nil, _ result: Result<T>) {
98 self.synchronous = queue.map { FutureSynchronous(queue: $0) } ?? FutureSynchronous()
102 convenience init(_ value: T) {
104 self.init(Result(value))
106 convenience init(_ error: Error) {
108 self.init(Result(error))
112 synchronous.stopWaiting()
120 func await() -> Self {
122 synchronous.excuteAfterWaiting {
130 func onComplete(_ block: @escaping (Result<T>) -> Void) -> Self {
132 synchronous.excuteAfterWaiting {
140 func onSuccess(_ block: @escaping (T) -> Void) -> Self {
142 synchronous.excuteAfterWaiting {
143 if case let .value(value)? = self.result { block(value) }
150 func onFailure(_ block: @escaping (Error) -> Void) -> Self {
152 synchronous.excuteAfterWaiting {
153 if case let .error(error)? = self.result { block(error) }
163 func transform<U>(_ s: @escaping (T) -> U, _ f: @escaping (Error) -> (Error)) -> Future<U> {
168 case let .value(value): return Result(s(value))
170 case let .error(error): return Result(f(error))
175 func transform<U>(_ s: @escaping (Result<T>) -> Result<U>) ->Future<U> {
179 guard let r = self.await().result.map({s($0)}) else {
180 return Result(FutureError.unsolvedFuture)
187 func map<U>(_ t: @escaping (T) -> U) -> Future<U> {
189 return transform(t, { $0 })
192 func flatMap<U>(_ t: @escaping (T) -> Future<U>) -> Future<U> {
196 switch self.await().result {
197 case let .value(v)?: return t(v)
198 case let .error(e)?: return Future<U>(e)
199 case .none: return Future<U>(FutureError.unsolvedFuture)
205 func filter(_ f: @escaping (T) -> Bool) -> Future<T> {
209 if case let .value(v)? = self.result, f(v) {
212 return Result(FutureError.noSuchElement)
217 func recover(_ s: @escaping (Error) throws -> T) -> Future<T> {
221 if case let .error(e) = $0 {
222 return Result(try s(e))
232 fileprivate extension Future {
234 func complete(_ result: Result<T>) {
240 private let promiseQueue = DispatchQueue(label: "Promise", attributes: .concurrent)
241 final class Promise<T> {
243 let future: Future<T> = Future<T>()
246 func complete(_ result: Result<T>) {
248 future.complete(result)
250 func success(_ value: T) {
252 complete(Result(value))
254 func failure(_ error: Error) {
256 complete(Result(error))
259 func complete(_ completor: @escaping () -> Result<T>) -> Self {
262 self.complete(completor())
268 func completeWith(_ completor: @escaping () -> Future<T>) -> Self {