Skip to content
This repository was archived by the owner on Aug 29, 2022. It is now read-only.

Commit cf64968

Browse files
committed
Add a Future.async(upon:flags:execute:) convenience
1 parent 7f2e9a8 commit cf64968

File tree

3 files changed

+94
-0
lines changed

3 files changed

+94
-0
lines changed

Deferred.xcodeproj/project.pbxproj

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,13 @@
159159
DB126D951E5369E200054E95 /* Deferred.h in Headers */ = {isa = PBXBuildFile; fileRef = DB524CA11D85200C00DDF16D /* Deferred.h */; settings = {ATTRIBUTES = (Public, ); }; };
160160
DB126D961E5369E300054E95 /* Deferred.h in Headers */ = {isa = PBXBuildFile; fileRef = DB524CA11D85200C00DDF16D /* Deferred.h */; settings = {ATTRIBUTES = (Public, ); }; };
161161
DB126D971E5369E300054E95 /* Deferred.h in Headers */ = {isa = PBXBuildFile; fileRef = DB524CA11D85200C00DDF16D /* Deferred.h */; settings = {ATTRIBUTES = (Public, ); }; };
162+
DB166DC320C445F500C25E9B /* FutureAsync.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB166DC220C445F500C25E9B /* FutureAsync.swift */; };
163+
DB166DC420C445F500C25E9B /* FutureAsync.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB166DC220C445F500C25E9B /* FutureAsync.swift */; };
164+
DB166DC520C445F500C25E9B /* FutureAsync.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB166DC220C445F500C25E9B /* FutureAsync.swift */; };
165+
DB166DC620C445F500C25E9B /* FutureAsync.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB166DC220C445F500C25E9B /* FutureAsync.swift */; };
166+
DB166DC820C4460B00C25E9B /* FutureAsyncTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB166DC720C4460B00C25E9B /* FutureAsyncTests.swift */; };
167+
DB166DC920C4460B00C25E9B /* FutureAsyncTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB166DC720C4460B00C25E9B /* FutureAsyncTests.swift */; };
168+
DB166DCA20C4460B00C25E9B /* FutureAsyncTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB166DC720C4460B00C25E9B /* FutureAsyncTests.swift */; };
162169
DB34FC902096D335005D5B82 /* ObjectDeferredTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB34FC8F2096D335005D5B82 /* ObjectDeferredTests.swift */; };
163170
DB34FC912096D335005D5B82 /* ObjectDeferredTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB34FC8F2096D335005D5B82 /* ObjectDeferredTests.swift */; };
164171
DB34FC922096D335005D5B82 /* ObjectDeferredTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB34FC8F2096D335005D5B82 /* ObjectDeferredTests.swift */; };
@@ -234,6 +241,8 @@
234241
DB126CD81E53686900054E95 /* Deferred.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Deferred.framework; sourceTree = BUILT_PRODUCTS_DIR; };
235242
DB126CE01E53686900054E95 /* TVDeferredTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TVDeferredTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
236243
DB126CF41E53687300054E95 /* Deferred.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Deferred.framework; sourceTree = BUILT_PRODUCTS_DIR; };
244+
DB166DC220C445F500C25E9B /* FutureAsync.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FutureAsync.swift; sourceTree = "<group>"; };
245+
DB166DC720C4460B00C25E9B /* FutureAsyncTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FutureAsyncTests.swift; sourceTree = "<group>"; };
237246
DB34FC8F2096D335005D5B82 /* ObjectDeferredTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ObjectDeferredTests.swift; sourceTree = "<group>"; };
238247
DB34FC932096DCE1005D5B82 /* FilledDeferredTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilledDeferredTests.swift; sourceTree = "<group>"; };
239248
DB39B2D01DDE194C00DDE4C0 /* module.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; path = module.modulemap; sourceTree = "<group>"; };
@@ -384,6 +393,7 @@
384393
DB524C951D85200C00DDF16D /* ExistentialFuture.swift */,
385394
DB524C9A1D85200C00DDF16D /* Future.swift */,
386395
DBA01B032071E68F00083CD0 /* FutureAndThen.swift */,
396+
DB166DC220C445F500C25E9B /* FutureAsync.swift */,
387397
DB524C961D85200C00DDF16D /* FutureCollections.swift */,
388398
DB524C971D85200C00DDF16D /* FutureComposition.swift */,
389399
DBC742631DC2F6D4002FB30D /* FutureEveryMap.swift */,
@@ -444,6 +454,7 @@
444454
DB55F1F01D96968E00FC1439 /* DeferredTests.swift */,
445455
DB55F1F11D96968E00FC1439 /* ExistentialFutureTests.swift */,
446456
DB34FC932096DCE1005D5B82 /* FilledDeferredTests.swift */,
457+
DB166DC720C4460B00C25E9B /* FutureAsyncTests.swift */,
447458
DB55F1F21D96968E00FC1439 /* FutureCustomExecutorTests.swift */,
448459
DB55F1F31D96968E00FC1439 /* FutureIgnoreTests.swift */,
449460
DB55F20B1D969A1B00FC1439 /* FutureTests.swift */,
@@ -733,6 +744,7 @@
733744
DB126D2A1E5368A700054E95 /* TaskResult.swift in Sources */,
734745
DB126D021E5368A100054E95 /* FutureEveryMap.swift in Sources */,
735746
DBA01B082071E69100083CD0 /* FutureAndThen.swift in Sources */,
747+
DB166DC320C445F500C25E9B /* FutureAsync.swift in Sources */,
736748
DBA01B0D2071E6FF00083CD0 /* FuturePeek.swift in Sources */,
737749
DB126CFE1E5368A100054E95 /* ExistentialFuture.swift in Sources */,
738750
DBABD0BB203F2E3E00C50896 /* Atomics.swift in Sources */,
@@ -773,6 +785,7 @@
773785
DB126D651E5368B900054E95 /* LockingTests.swift in Sources */,
774786
DB126D691E5368B900054E95 /* TaskResultTests.swift in Sources */,
775787
DB126D6A1E5368B900054E95 /* VoidResultTests.swift in Sources */,
788+
DB166DC820C4460B00C25E9B /* FutureAsyncTests.swift in Sources */,
776789
DB126D631E5368B900054E95 /* FutureIgnoreTests.swift in Sources */,
777790
DB126D6F1E5368B900054E95 /* AllTestsCommon.swift in Sources */,
778791
DB126D6B1E5368B900054E95 /* TaskComprehensiveTests.swift in Sources */,
@@ -797,6 +810,7 @@
797810
DB126D2D1E5368A700054E95 /* TaskResult.swift in Sources */,
798811
DB126D0D1E5368A100054E95 /* FutureEveryMap.swift in Sources */,
799812
DBA01B092071E69100083CD0 /* FutureAndThen.swift in Sources */,
813+
DB166DC420C445F500C25E9B /* FutureAsync.swift in Sources */,
800814
DBA01B0E2071E6FF00083CD0 /* FuturePeek.swift in Sources */,
801815
DB126D091E5368A100054E95 /* ExistentialFuture.swift in Sources */,
802816
DB126D3F1E5368AD00054E95 /* ExistentialTask.swift in Sources */,
@@ -837,6 +851,7 @@
837851
DB126D751E5368B900054E95 /* LockingTests.swift in Sources */,
838852
DB126D791E5368B900054E95 /* TaskResultTests.swift in Sources */,
839853
DB126D7A1E5368B900054E95 /* VoidResultTests.swift in Sources */,
854+
DB166DC920C4460B00C25E9B /* FutureAsyncTests.swift in Sources */,
840855
DB126D731E5368B900054E95 /* FutureIgnoreTests.swift in Sources */,
841856
DB126D7F1E5368B900054E95 /* AllTestsCommon.swift in Sources */,
842857
DB126D7B1E5368B900054E95 /* TaskComprehensiveTests.swift in Sources */,
@@ -861,6 +876,7 @@
861876
DB126D301E5368A800054E95 /* TaskResult.swift in Sources */,
862877
DB126D181E5368A200054E95 /* FutureEveryMap.swift in Sources */,
863878
DBA01B0A2071E69100083CD0 /* FutureAndThen.swift in Sources */,
879+
DB166DC520C445F500C25E9B /* FutureAsync.swift in Sources */,
864880
DBA01B0F2071E6FF00083CD0 /* FuturePeek.swift in Sources */,
865881
DB126D141E5368A200054E95 /* ExistentialFuture.swift in Sources */,
866882
DB126D4A1E5368AE00054E95 /* ExistentialTask.swift in Sources */,
@@ -901,6 +917,7 @@
901917
DB126D851E5368BA00054E95 /* LockingTests.swift in Sources */,
902918
DB126D891E5368BA00054E95 /* TaskResultTests.swift in Sources */,
903919
DB126D8A1E5368BA00054E95 /* VoidResultTests.swift in Sources */,
920+
DB166DCA20C4460B00C25E9B /* FutureAsyncTests.swift in Sources */,
904921
DB126D831E5368BA00054E95 /* FutureIgnoreTests.swift in Sources */,
905922
DB126D8F1E5368BA00054E95 /* AllTestsCommon.swift in Sources */,
906923
DB126D8B1E5368BA00054E95 /* TaskComprehensiveTests.swift in Sources */,
@@ -925,6 +942,7 @@
925942
DB126D331E5368A900054E95 /* TaskResult.swift in Sources */,
926943
DB126D231E5368A200054E95 /* FutureEveryMap.swift in Sources */,
927944
DBA01B0B2071E69100083CD0 /* FutureAndThen.swift in Sources */,
945+
DB166DC620C445F500C25E9B /* FutureAsync.swift in Sources */,
928946
DBA01B102071E6FF00083CD0 /* FuturePeek.swift in Sources */,
929947
DB126D1F1E5368A200054E95 /* ExistentialFuture.swift in Sources */,
930948
DB126D551E5368AE00054E95 /* ExistentialTask.swift in Sources */,

Sources/Deferred/FutureAsync.swift

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
//
2+
// FutureAsync.swift
3+
// Deferred
4+
//
5+
// Created by Zachary Waldowski on 6/3/18.
6+
// Copyright © 2018 Big Nerd Ranch. Licensed under MIT.
7+
//
8+
9+
import Dispatch
10+
11+
extension Future {
12+
/// Captures the value of asynchronously executing `work` on `queue`.
13+
///
14+
/// - parameter queue: A dispatch queue to perform the `work` on.
15+
/// - parameter flags: Options controlling how the `work` is executed with
16+
/// respect to system resources.
17+
/// - parameter work: A function body that calculates and returns the
18+
/// fulfilled value for the future.
19+
public static func async(upon queue: DispatchQueue = .any(), flags: DispatchWorkItemFlags = [], execute work: @escaping() -> Value) -> Future {
20+
let deferred = Deferred<Value>()
21+
22+
queue.async(flags: flags) {
23+
deferred.fill(with: work())
24+
}
25+
26+
return Future(deferred)
27+
}
28+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
//
2+
// FutureAsyncTests.swift
3+
// Deferred
4+
//
5+
// Created by Zachary Waldowski on 6/3/18.
6+
// Copyright © 2018 Big Nerd Ranch. Licensed under MIT.
7+
//
8+
9+
import XCTest
10+
import Dispatch
11+
import Deferred
12+
13+
class FutureAsyncTests: XCTestCase {
14+
static let allTests: [(String, (FutureAsyncTests) -> () throws -> Void)] = [
15+
("testThatPeekingBeforeStartingReturnsNil", testThatPeekingBeforeStartingReturnsNil)
16+
]
17+
18+
private var queue: DispatchQueue!
19+
20+
override func setUp() {
21+
super.setUp()
22+
23+
queue = DispatchQueue(label: "FutureAsyncTests")
24+
queue.suspend()
25+
}
26+
27+
override func tearDown() {
28+
queue = nil
29+
30+
super.tearDown()
31+
}
32+
33+
func testThatPeekingBeforeStartingReturnsNil() {
34+
let future = Future<Int>.async(upon: queue) { 1 }
35+
36+
XCTAssertNil(future.peek())
37+
38+
queue.resume()
39+
40+
let expect = expectation(description: "future fulfils")
41+
future.upon(queue) { (result) in
42+
XCTAssertEqual(result, 1)
43+
expect.fulfill()
44+
}
45+
46+
shortWait(for: [ expect ])
47+
}
48+
}

0 commit comments

Comments
 (0)