| import Foundation | |
| struct AsyncWaitTimeoutError: Error, CustomStringConvertible { | |
| let label: String | |
| var description: String { "Timeout waiting for: \(self.label)" } | |
| } | |
| func waitUntil( | |
| _ label: String, | |
| timeoutSeconds: Double = 3.0, | |
| pollMs: UInt64 = 10, | |
| _ condition: @escaping () async -> Bool) async throws | |
| { | |
| let deadline = Date().addingTimeInterval(timeoutSeconds) | |
| while Date() < deadline { | |
| if await condition() { | |
| return | |
| } | |
| try await Task.sleep(nanoseconds: pollMs * 1_000_000) | |
| } | |
| throw AsyncWaitTimeoutError(label: label) | |
| } | |