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 final class Future<T> {
45 private let semaphore: DispatchSemaphore?
47 private var callbacks: [(Result<T>) -> Void] = []
49 fileprivate var result: Result<T>? {
52 fatalError("Result already seted.")
56 guard let result = self.result else {
57 fatalError("set nil to result.")
60 callbacks.forEach { f in f(result) }
65 var isCompleted: Bool {
68 var value: Result<T>? {
76 semaphore = DispatchSemaphore(value: 1)
80 init(in queue: DispatchQueue = .global(), _ block: @escaping () throws -> T) {
82 semaphore = DispatchSemaphore(value: 1)
87 defer { self.semaphore?.signal() }
90 self.result = Result(try block())
92 self.result = Result(error)
97 init(_ result: Result<T>) {
103 convenience init(_ value: T) {
105 self.init(Result(value))
107 convenience init(_ error: Error) {
109 self.init(Result(error))
121 func await() -> Self {
132 func onComplete(_ callback: @escaping (Result<T>) -> Void) -> Self {
137 callbacks.append(callback)
144 func onSuccess(_ callback: @escaping (T) -> Void) -> Self {
146 onComplete { result in
147 if case let .value(v) = result {
156 func onFailure(_ callback: @escaping (Error) -> Void) -> Self {
158 onComplete { result in
159 if case let .error(e) = result {
171 func transform<U>(_ s: @escaping (T) -> U, _ f: @escaping (Error) -> Error) -> Future<U> {
173 return transform { result in
175 case let .value(value): return Result(s(value))
176 case let .error(error): return Result(f(error))
181 func transform<U>(_ s: @escaping (Result<T>) -> Result<U>) ->Future<U> {
185 self.await().value.map(s) ?? Result(FutureError.unsolvedFuture)
190 func map<U>(_ t: @escaping (T) -> U) -> Future<U> {
192 return transform(t, { $0 })
195 func flatMap<U>(_ t: @escaping (T) -> Future<U>) -> Future<U> {
199 switch self.await().value {
200 case .value(let v)?: return t(v)
201 case .error(let e)?: return Future<U>(e)
202 case .none: fatalError("Future not complete")
208 func filter(_ f: @escaping (T) -> Bool) -> Future<T> {
212 if case let .value(v)? = self.await().value, f(v) {
215 return Result(FutureError.noSuchElement)
220 func recover(_ s: @escaping (Error) throws -> T) -> Future<T> {
222 return transform { result in
224 return try result.error.map { error in Result(try s(error)) } ?? Result(FutureError.unsolvedFuture)
232 func andThen(_ f: @escaping (Result<T>) -> Void) -> Future<T> {
236 guard let result = self.await().result else { fatalError("Future not complete") }
245 private extension Future {
247 func complete(_ result: Result<T>) {
253 private let promiseQueue = DispatchQueue(label: "Promise", attributes: .concurrent)
254 final class Promise<T> {
256 let future: Future<T> = Future<T>()
259 func complete(_ result: Result<T>) {
261 future.complete(result)
263 func success(_ value: T) {
265 complete(Result(value))
267 func failure(_ error: Error) {
269 complete(Result(error))
272 func complete(_ completor: @escaping () -> Result<T>) -> Self {
275 self.complete(completor())
281 func completeWith(_ completor: @escaping () -> Future<T>) -> Self {