F4649FC91DBC51EF0097AEBF /* ScreenshotListViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = F4649FCB1DBC51EF0097AEBF /* ScreenshotListViewController.xib */; };
F4649FCE1DBC52600097AEBF /* ScreenshotDetailViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = F4649FD01DBC52600097AEBF /* ScreenshotDetailViewController.xib */; };
F4649FD31DBC52A50097AEBF /* ScreenshotEditorViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = F4649FD51DBC52A50097AEBF /* ScreenshotEditorViewController.xib */; };
+ F46C00F1200A0D3400A066E2 /* Future.swift in Sources */ = {isa = PBXBuildFile; fileRef = F46C00F0200A0D3400A066E2 /* Future.swift */; };
F46F104918ABAC910063E503 /* KCD.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = F46F104718ABAC910063E503 /* KCD.xcdatamodeld */; };
F46FEA3F1F81285D00E2427C /* Localizable.swift in Sources */ = {isa = PBXBuildFile; fileRef = F46FEA3E1F81285D00E2427C /* Localizable.swift */; };
F46FEA411F8128BB00E2427C /* LocalizedStrings.swift in Sources */ = {isa = PBXBuildFile; fileRef = F46FEA401F8128BB00E2427C /* LocalizedStrings.swift */; };
F4649FD91DBC54270097AEBF /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/ScreenshotListViewController.xib; sourceTree = "<group>"; };
F4649FDA1DBC54320097AEBF /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/ScreenshotDetailViewController.xib; sourceTree = "<group>"; };
F4649FDB1DBC543A0097AEBF /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/ScreenshotEditorViewController.xib; sourceTree = "<group>"; };
+ F46C00F0200A0D3400A066E2 /* Future.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Future.swift; sourceTree = "<group>"; };
F46F104818ABAC910063E503 /* KCD.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = KCD.xcdatamodel; sourceTree = "<group>"; };
F46FEA3E1F81285D00E2427C /* Localizable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Localizable.swift; sourceTree = "<group>"; };
F46FEA401F8128BB00E2427C /* LocalizedStrings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalizedStrings.swift; sourceTree = "<group>"; };
F48883441F2E095F0069E0C3 /* DefaultSettings.swift */,
F46FEA3E1F81285D00E2427C /* Localizable.swift */,
F46FEA401F8128BB00E2427C /* LocalizedStrings.swift */,
+ F46C00F0200A0D3400A066E2 /* Future.swift */,
F41AA4771FDEDCD200FFFBD1 /* DataExtension.swift */,
F40F97701E68536400AE81BB /* FileManagerExtension.swift */,
F44AA26A1E82AD2E00EED8BE /* NSObjectExtension.swift */,
F42A8FD81E3DEAA00099DC1D /* NyukyoDock.swift in Sources */,
F4AA591A1E1CE2EA001667AF /* SlotItemEquipTypeTransformer.swift in Sources */,
F47C3E9C1E5DC94E00D97449 /* MasterShipMapper.swift in Sources */,
+ F46C00F1200A0D3400A066E2 /* Future.swift in Sources */,
F44BC6C11E221293004644E3 /* AirCorpsChangeNameCommand.swift in Sources */,
F4CF25BE1E361F4600C02A66 /* NyukyoDockStatus.swift in Sources */,
F490978B1E1B38F00085A45D /* TiledImageView.swift in Sources */,
--- /dev/null
+//
+// Future.swift
+// KCD
+//
+// Created by Hori,Masaki on 2018/01/13.
+// Copyright © 2018年 Hori,Masaki. All rights reserved.
+//
+
+import Foundation
+
+let watingQueue = DispatchQueue(label: "Future")
+class Future<T> {
+
+ private let queue: DispatchQueue
+ private let semaphore = DispatchSemaphore(value: 1)
+
+ private(set) var value: T?
+ private(set) var error: Error?
+
+ init(queue: DispatchQueue = watingQueue) {
+
+ self.queue = queue
+
+ self.semaphore.wait()
+ }
+ deinit {
+ semaphore.signal()
+ }
+
+ @discardableResult
+ func onSuccess(block: @escaping (T) -> Void) -> Future<T> {
+
+ queue.async {
+
+ self.semaphore.wait()
+ self.value.map(block)
+ self.semaphore.signal()
+ }
+
+ return self
+ }
+
+ @discardableResult
+ func onFailure(block: @escaping (Error) -> Void) -> Future<T> {
+
+ queue.async {
+
+ self.semaphore.wait()
+ self.error.map(block)
+ self.semaphore.signal()
+ }
+
+ return self
+ }
+
+ func success(_ value: T) {
+
+ guard self.value == nil else { return }
+ guard self.error == nil else { return }
+
+ self.value = value
+ semaphore.signal()
+ }
+
+ func failure(_ error: Error) {
+
+ guard self.value == nil else { return }
+ guard self.error == nil else { return }
+
+ self.error = error
+ semaphore.signal()
+ }
+}