This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import os.lock | |
/// `CancellingContinuation` is built on top of `CheckedContinuation` and | |
/// provides some additional features. It can be used as a drop-in replacement, | |
/// providing a similar API. | |
/// | |
/// ## Automatic cancellation | |
/// When the suspended task is cancelled the continuation is automatically | |
/// resumed with a `CancellationError`. After that, normally resuming the | |
/// continuation from client is silently ignored. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import XCTest | |
final class BarrierTests: XCTestCase { | |
func test() async { | |
let subsystem = Subsystem() | |
await withTaskGroup(of: Void.self) { group in | |
for index in 0 ..< 100 { | |
group.addTask { subsystem.performWork(id: index) } | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
actor A { | |
var iterator: AsyncStream<Void>.Iterator | |
init() { | |
iterator = AsyncStream<Void> { _ in }.makeAsyncIterator() | |
} | |
func f() async { | |
await iterator.next() // Cannot call mutating async function 'next()' on actor-isolated property 'iterator' | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
extension Binding where Value: MutableCollection, Value.Element: Identifiable { | |
subscript(_ id: Value.Element.ID) -> Binding<Value.Element> { | |
let index = wrappedValue.firstIndex { $0.id == id } | |
guard let index else { | |
fatalError("id not found: \(id)") | |
} | |
return self[index] | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import XCTest | |
import SwiftUI | |
final class CaptureListTests: XCTestCase { | |
func testCaptureList() throws { | |
withBound("foo") { $boundValue in | |
print("value: \(boundValue), binding type: \(type(of: $boundValue))") | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
func testRequestCancellation() async throws { | |
// Used to synchronize unit test with request task. | |
let meeting = TaskMeeting() | |
// This request just waits for the unit test in its handler. | |
let sut = Request(responseHandler: { _ in | |
try? await meeting.rendezvous {} | |
}) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// TaskMeeting | |
// (c) 2022, Nikolai Ruhe | |
/// A type that synchronizes progress of two tasks. | |
public final actor TaskMeeting: Sendable { | |
private var completion: CheckedContinuation<Void, Error>? = nil | |
/// This method synchronizes two tasks so that both perform the closure at | |
/// the same time. Both tasks need to call `rendezvous`. | |
/// |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/// A type that synchronizes progress of two tasks. | |
/// | |
/// After setup, two tasks should eventually call the `join` function. The | |
/// first task will suspend until the second task arrives and calls `join` as | |
/// well. Both tasks resume normally after that. | |
public final actor TaskRendezvous: Sendable { | |
private var completion: CheckedContinuation<Void, Error>? = nil | |
/// Suspends until a second task calls `join()` on this instance. | |
public func join() async throws { |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// example unit test: | |
func testAscii() async throws { | |
locate { | |
"Celcius" | |
"Farenheit" | |
"Kelvin" | |
"yes?" | |
"no?" | |
"yes;no;cancel" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
func testCSV() throws { | |
let plainField = Prefix { $0 != .init(ascii: ",") && $0 != .init(ascii: "|") && $0 != .init(ascii: "\n") } | |
let quotedField = Parse { | |
"|".utf8 | |
Many { | |
OneOf { | |
Parse { "||".utf8 }.map { Substring("").utf8 } | |
Prefix { $0 != .init(ascii: "|") } | |
} |
NewerOlder