Skip to content

Commit 8606126

Browse files
authored
Merge pull request #205 from louisdebaere/taskAsDisposable
Add `asDisposable` convenience property to `Task`
2 parents e17c28c + aee32ac commit 8606126

File tree

2 files changed

+58
-0
lines changed

2 files changed

+58
-0
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// Copyright 2019-2024 Spotify AB.
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
@available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *)
16+
public extension Task {
17+
18+
/// A disposable for use with `EffectHandler` that will cancel the task
19+
///
20+
/// func handle(_ parameters: Void, _ callback: EffectCallback<Event>) -> Disposable {
21+
/// Task {
22+
///
23+
/// }
24+
/// .asDisposable
25+
/// }
26+
var asDisposable: some Disposable {
27+
AnonymousDisposable { cancel() }
28+
}
29+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import MobiusCore
2+
import Nimble
3+
import Quick
4+
5+
@available(iOS 13.0, *)
6+
class TaskDisposableTests: QuickSpec {
7+
override func spec() {
8+
describe("Task+Disposable") {
9+
var task: Task<Void, any Error>!
10+
var disposable: Disposable!
11+
12+
beforeEach {
13+
task = Task {
14+
try? await Task.sleep(nanoseconds: 1_000_000_000)
15+
}
16+
disposable = task.asDisposable
17+
}
18+
19+
it("starts off not cancelled") {
20+
expect(task.isCancelled).to(beFalse())
21+
}
22+
23+
it("disposable cancels the task that owns it") {
24+
disposable.dispose()
25+
expect(task.isCancelled).to(beTrue())
26+
}
27+
}
28+
}
29+
}

0 commit comments

Comments
 (0)