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 } }