From e52b893541a1ff0f5eea156f67f0647654a13934 Mon Sep 17 00:00:00 2001
From: Jan Beinke <git@janbeinke.com>
Date: Fri, 14 Feb 2020 14:38:49 +0100
Subject: [PATCH] Fix battery charging time estimate becoming negative in rare
 cases

---
 src/QBar/Blocks/Battery.hs | 10 ++++++++--
 src/QBar/Blocks/Utils.hs   |  5 +++++
 2 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/src/QBar/Blocks/Battery.hs b/src/QBar/Blocks/Battery.hs
index cfa9f28..f7d0358 100644
--- a/src/QBar/Blocks/Battery.hs
+++ b/src/QBar/Blocks/Battery.hs
@@ -158,8 +158,8 @@ batteryIsDischarging = any (singleBatteryIsDischarging . _status)
 batteryEstimate :: [BatteryState] -> Maybe Int
 batteryEstimate batteryStates
   | batteryPowerNow == 0 = Nothing
-  | isCharging, not isDischarging = Just $ div ((batteryEnergyFull - batteryEnergyNow) * 3600) batteryPowerNow
-  | isDischarging, not isCharging = Just $ div (batteryEnergyNow * 3600) batteryPowerNow
+  | isCharging, not isDischarging = ensure (>0) batteryEstimateCharging
+  | isDischarging, not isCharging = ensure (>0) batteryEstimateDischarging
   | otherwise = Nothing
   where
     isCharging :: Bool
@@ -176,3 +176,9 @@ batteryEstimate batteryStates
 
     batteryEnergyFull :: Int
     batteryEnergyFull = sum . map _energyFull $ batteryStates
+
+    batteryEstimateCharging :: Int
+    batteryEstimateCharging = div ((batteryEnergyFull - batteryEnergyNow) * 3600) batteryPowerNow
+
+    batteryEstimateDischarging :: Int
+    batteryEstimateDischarging = div (batteryEnergyNow * 3600) batteryPowerNow
diff --git a/src/QBar/Blocks/Utils.hs b/src/QBar/Blocks/Utils.hs
index 17b759a..59304f2 100644
--- a/src/QBar/Blocks/Utils.hs
+++ b/src/QBar/Blocks/Utils.hs
@@ -14,6 +14,11 @@ formatFloatN = formatFloatN' 0
 formatFloatN' :: RealFloat a => Int -> Int -> a -> T.Text
 formatFloatN' padWithZeros decimalPlaces f = T.justifyRight (fromIntegral padWithZeros) '0' . T.pack $ showFFloat (Just decimalPlaces) f ""
 
+ensure :: (a -> Bool) -> a -> Maybe a
+ensure f a
+  | f a = Just a
+  | otherwise = Nothing
+
 tryMaybe :: IO a -> IO (Maybe a)
 tryMaybe a = tryMaybe' (Just <$> a)
 
-- 
GitLab