import CoreFoundation import Models import Validations extension BalancePoint.Request { func respond() async throws -> BalancePoint.Response { try await validate() let balancePoint = await thermalBalancePoint( heatLoss: Double(heatLoss), at47: Double(heatPumpCapacity.at47), at17: Double(heatPumpCapacity.at17), designTemperature: Double(winterDesignTemperature) ) return .init(balancePointTemperature: balancePoint) } } extension BalancePoint.Request: AsyncValidatable { @inlinable public var body: some AsyncValidation { AsyncValidator.accumulating { AsyncValidator.greaterThan(\.heatLoss, 0) AsyncValidator.validate(\.heatPumpCapacity) } } } private func thermalBalancePoint( heatLoss: Double, at47: Double, at17: Double, designTemperature: Double ) async -> Double { (30.0 * (((designTemperature - 65.0) * at47) + (65.0 * heatLoss)) - ((designTemperature - 65.0) * (at47 - at17) * 47.0)) / ((30.0 * heatLoss) - ((designTemperature - 65.0) * (at47 - at17))) }