5 // Created by Hori,Masaki on 2018/01/13.
6 // Copyright © 2018年 Hori,Masaki. All rights reserved.
22 init(_ error: Error) {
31 if case let .value(value) = self { return value }
38 if case let .error(error) = self { return error }
44 enum FutureError: Error {
51 final class Future<T> {
53 private let semaphore: DispatchSemaphore?
55 private var callbacks: [(Result<T>) -> Void] = []
57 fileprivate var result: Result<T>? {
63 fatalError("Result already seted.")
69 guard let result = self.result else {
71 fatalError("set nil to result.")
74 callbacks.forEach { f in f(result) }
81 var isCompleted: Bool {
86 var value: Result<T>? {
95 semaphore = DispatchSemaphore(value: 1)
99 init(in queue: DispatchQueue = .global(), _ block: @escaping () throws -> T) {
101 semaphore = DispatchSemaphore(value: 1)
106 defer { self.semaphore?.signal() }
110 self.result = Result(try block())
114 self.result = Result(error)
119 init(_ result: Result<T>) {
126 convenience init(_ value: T) {
128 self.init(Result(value))
131 convenience init(_ error: Error) {
133 self.init(Result(error))
146 func await() -> Self {
158 func onComplete(_ callback: @escaping (Result<T>) -> Void) -> Self {
166 callbacks.append(callback)
173 func onSuccess(_ callback: @escaping (T) -> Void) -> Self {
175 onComplete { result in
177 if case let .value(v) = result {
187 func onFailure(_ callback: @escaping (Error) -> Void) -> Self {
189 onComplete { result in
191 if case let .error(e) = result {
204 func transform<U>(_ s: @escaping (T) -> U, _ f: @escaping (Error) -> Error) -> Future<U> {
206 return transform { result in
210 case let .value(value): return Result(s(value))
212 case let .error(error): return Result(f(error))
218 func transform<U>(_ s: @escaping (Result<T>) -> Result<U>) ->Future<U> {
223 self.await().value.map(s) ?? Result(FutureError.unsolvedFuture)
228 func map<U>(_ t: @escaping (T) -> U) -> Future<U> {
230 return transform(t, { $0 })
233 func flatMap<U>(_ t: @escaping (T) -> Future<U>) -> Future<U> {
238 switch self.await().value {
240 case .value(let v)?: return t(v)
242 case .error(let e)?: return Future<U>(e)
244 case .none: fatalError("Future not complete")
251 func filter(_ f: @escaping (T) -> Bool) -> Future<T> {
256 if case let .value(v)? = self.await().value, f(v) {
261 return Result(FutureError.noSuchElement)
266 func recover(_ s: @escaping (Error) throws -> T) -> Future<T> {
268 return transform { result in
272 return try result.error.map { error in Result(try s(error)) } ?? Result(FutureError.unsolvedFuture)
282 func andThen(_ f: @escaping (Result<T>) -> Void) -> Future<T> {
287 guard let result = self.await().result else {
289 fatalError("Future not complete")
300 private extension Future {
302 func complete(_ result: Result<T>) {
308 private let promiseQueue = DispatchQueue(label: "Promise", attributes: .concurrent)
309 final class Promise<T> {
311 let future: Future<T> = Future<T>()
314 func complete(_ result: Result<T>) {
316 future.complete(result)
319 func success(_ value: T) {
321 complete(Result(value))
324 func failure(_ error: Error) {
326 complete(Result(error))
329 func complete(_ completor: @escaping () -> Result<T>) -> Self {
333 self.complete(completor())
339 func completeWith(_ completor: @escaping () -> Future<T>) -> Self {