packages feed

i3blocks-hs-contrib-1.0.0: Battery/Main.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeApplications  #-}

module Main where

import           Common
import           Data.Text (pack)
import           Turtle

newtype BatteryPercentage = BatteryPercentage Integer
data BatteryStatus = Discharging | Charging | Full | Plugged | Unknown
data MemType = MemTotal | MemFree

main :: IO ()
main = sh $ do
  acpi <- acpi'
  let info = parse acpi
  blockOutput $ OutputReport (makeLongDesc info) Nothing (makeColor $ fst info)
  where
    makeLongDesc = LongDesc . pack . formatBattery
    makeColor (BatteryPercentage per) = Color <$> batteryColor per

formatBattery :: (BatteryPercentage, BatteryStatus) -> String
formatBattery (BatteryPercentage per, Discharging) = format' (icon per) per
formatBattery (BatteryPercentage per, Unknown)     = format' (icon per) per
formatBattery (BatteryPercentage per, _)           = format' "\61926 " per

format' :: Show a => String -> a -> String
format' i per = i ++ " " ++ show per ++ "%"

icon :: Integer -> String
icon p | p >= 90 = "\62016"
icon p | p >= 75 = "\62017"
icon p | p >= 50 = "\62018"
icon p | p >= 25 = "\62019"
icon _ = "\62020"

batteryColor :: Integer -> Maybe Text
batteryColor p | p <= 25 = Just "#ff0000"
batteryColor _ = Nothing

parse :: Text -> (BatteryPercentage, BatteryStatus)
parse acpi = head $ match batteryLeft acpi

batteryLeft :: Pattern (BatteryPercentage, BatteryStatus)
batteryLeft = do
  _ <- batteryNumber
  state <- spaces1 *> chars1 <* ","
  per <- spaces1 *> decimal <* "%" <* ("," <|> "") <* spaces1 <* star anyChar
  return (BatteryPercentage per, toBatteryStatus state)
  where
    batteryNumber = "Battery" *> spaces1 *> decimal @Integer *> ":"
    toBatteryStatus "Discharging" = Discharging
    toBatteryStatus "Charging"    = Charging
    toBatteryStatus "Plugged"     = Plugged
    toBatteryStatus "Full"        = Full
    toBatteryStatus _             = Unknown

acpi' :: Shell Text
acpi' = strict $ inshell (pack "acpi") empty