41 lines
1.0 KiB
Swift
41 lines
1.0 KiB
Swift
import Foundation
|
||
|
||
public enum WatchExclusiveResource: String, Codable, Sendable {
|
||
case heartRateMeasurement
|
||
case hapticRegulation
|
||
}
|
||
|
||
public enum WatchResourceError: LocalizedError, Equatable {
|
||
case busy(WatchExclusiveResource)
|
||
case releaseMismatch
|
||
|
||
public var errorDescription: String? {
|
||
switch self {
|
||
case let .busy(resource): "Une activité \(resource.rawValue) est déjà en cours."
|
||
case .releaseMismatch: "La ressource libérée ne correspond pas à l’activité en cours."
|
||
}
|
||
}
|
||
}
|
||
|
||
public actor WatchResourceArbiter {
|
||
public static let shared = WatchResourceArbiter()
|
||
|
||
public private(set) var current: WatchExclusiveResource?
|
||
|
||
public init() {}
|
||
|
||
public func acquire(_ resource: WatchExclusiveResource) throws {
|
||
if let current { throw WatchResourceError.busy(current) }
|
||
current = resource
|
||
}
|
||
|
||
public func release(_ resource: WatchExclusiveResource) throws {
|
||
guard current == resource else { throw WatchResourceError.releaseMismatch }
|
||
current = nil
|
||
}
|
||
|
||
public func forceRelease() {
|
||
current = nil
|
||
}
|
||
}
|