OSDN Git Service

Futureを導入
[kcd/KCD.git] / KCD / Future.swift
1 //
2 //  Future.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2018/01/13.
6 //  Copyright © 2018年 Hori,Masaki. All rights reserved.
7 //
8
9 import Foundation
10
11 let watingQueue = DispatchQueue(label: "Future")
12 class Future<T> {
13     
14     private let queue: DispatchQueue
15     private let semaphore = DispatchSemaphore(value: 1)
16     
17     private(set) var value: T?
18     private(set) var error: Error?
19     
20     init(queue: DispatchQueue = watingQueue) {
21         
22         self.queue = queue
23         
24         self.semaphore.wait()
25     }
26     deinit {
27         semaphore.signal()
28     }
29     
30     @discardableResult
31     func onSuccess(block: @escaping (T) -> Void) -> Future<T> {
32         
33         queue.async {
34             
35             self.semaphore.wait()
36             self.value.map(block)
37             self.semaphore.signal()
38         }
39         
40         return self
41     }
42     
43     @discardableResult
44     func onFailure(block: @escaping (Error) -> Void) -> Future<T> {
45         
46         queue.async {
47             
48             self.semaphore.wait()
49             self.error.map(block)
50             self.semaphore.signal()
51         }
52         
53         return self
54     }
55     
56     func success(_ value: T) {
57         
58         guard self.value == nil else { return }
59         guard self.error == nil else { return }
60         
61         self.value = value
62         semaphore.signal()
63     }
64     
65     func failure(_ error: Error) {
66         
67         guard self.value == nil else { return }
68         guard self.error == nil else { return }
69         
70         self.error = error
71         semaphore.signal()
72     }
73 }