import Foundation /// Was mit dem Akku gerade geschieht — in Worten statt in Symbolen. /// /// „Am Netz" allein beantwortet die Frage nicht, die man hat, wenn der /// Ladestand stehen bleibt: lädt es gerade nicht, weil das Limit erreicht ist, /// oder stimmt etwas nicht? public enum ChargeActivity: Equatable, Sendable { case charging /// Angehalten, weil das eingestellte Ladelimit erreicht ist. case pausedAtLimit(Int) /// Am Netz, lädt aber nicht — Grund unbekannt. case pluggedNotCharging case onBattery /// Wie weit unter dem Limit noch als „am Limit" gilt. /// /// Der Ladestand pendelt um die Grenze. Auf das Prozent genau zu /// vergleichen hieße, den Grund die halbe Zeit zu verschweigen. public static let limitTolerance = 2 public static func resolve(isCharging: Bool, isPluggedIn: Bool, charge: Double, limit: Int?) -> ChargeActivity { if isCharging { return .charging } guard isPluggedIn else { return .onBattery } let percent = Int((min(max(charge, 0), 1) * 100).rounded()) // Ein Limit von hundert ist keines. if let limit, limit < 100, percent >= limit - limitTolerance { return .pausedAtLimit(limit) } // Steht das Laden aus einem anderen Grund — etwa weil macOS den Akku // schont —, ist das der ehrliche Befund. Einen falschen Grund zu // nennen wäre schlimmer als keinen. return .pluggedNotCharging } }