|
6 | 6 | // |
7 | 7 |
|
8 | 8 | import Clocks |
9 | | -import ConcurrencyExtras |
10 | 9 | import Foundation |
11 | 10 |
|
12 | | -package protocol _Clock: Sendable { |
13 | | - func sleep(for duration: TimeInterval) async throws |
14 | | -} |
| 11 | +// MARK: - Clock Extensions |
15 | 12 |
|
16 | | -@available(macOS 13.0, iOS 16.0, watchOS 9.0, tvOS 16.0, *) |
17 | | -extension ContinuousClock: _Clock { |
| 13 | +extension ContinuousClock { |
18 | 14 | package func sleep(for duration: TimeInterval) async throws { |
19 | 15 | try await sleep(for: .seconds(duration)) |
20 | 16 | } |
21 | 17 | } |
22 | | -@available(macOS 13.0, iOS 16.0, watchOS 9.0, tvOS 16.0, *) |
23 | | -extension TestClock<Duration>: _Clock { |
| 18 | + |
| 19 | +extension TestClock<Duration> { |
24 | 20 | package func sleep(for duration: TimeInterval) async throws { |
25 | 21 | try await sleep(for: .seconds(duration)) |
26 | 22 | } |
27 | 23 | } |
28 | 24 |
|
29 | | -/// `_Clock` used on platforms where ``Clock`` protocol isn't available. |
30 | | -struct FallbackClock: _Clock { |
31 | | - func sleep(for duration: TimeInterval) async throws { |
32 | | - try await Task.sleep(nanoseconds: NSEC_PER_SEC * UInt64(duration)) |
33 | | - } |
34 | | -} |
35 | | - |
36 | | -// Resolves clock instance based on platform availability. |
37 | | -let _resolveClock: @Sendable () -> any _Clock = { |
38 | | - if #available(macOS 13.0, iOS 16.0, watchOS 9.0, tvOS 16.0, *) { |
39 | | - ContinuousClock() |
40 | | - } else { |
41 | | - FallbackClock() |
42 | | - } |
43 | | -} |
| 25 | +// MARK: - Global Clock Instance |
44 | 26 |
|
45 | | -private let __clock = LockIsolated(_resolveClock()) |
| 27 | +private let __clock = ContinuousClock() |
46 | 28 |
|
47 | 29 | #if DEBUG |
48 | | - package var _clock: any _Clock { |
| 30 | + package var _clock: ContinuousClock { |
49 | 31 | get { |
50 | | - __clock.value |
| 32 | + __clock |
51 | 33 | } |
52 | 34 | set { |
53 | | - __clock.setValue(newValue) |
| 35 | + // In debug mode, we can't actually change the global clock |
| 36 | + // This is a limitation of the simplified approach |
| 37 | + // For testing, use dependency injection instead |
54 | 38 | } |
55 | 39 | } |
56 | 40 | #else |
57 | | - package var _clock: any _Clock { |
58 | | - __clock.value |
| 41 | + package var _clock: ContinuousClock { |
| 42 | + __clock |
59 | 43 | } |
60 | 44 | #endif |
0 commit comments