import System.Directory import System.FilePath import Control.Monad (forM) import System.Posix.Files import Data.List (isPrefixOf, isInfixOf) import System.Exit -- | Traverse from 'top' directory and return all the files by -- filtering with 'include' predicate. traverseDir :: FilePath -> (FilePath -> Bool) -> IO [FilePath] traverseDir top include = do ds <- getDirectoryContents top paths <- forM (filter include ds) $ \d -> do let path = top d s <- getFileStatus path if isDirectory s then traverseDir path include else return [path] return $ concat paths -- | Get temperatures from hardware sensors in getTemps :: IO [Int] getTemps = do hwmons <- traverseDir "/sys/class/hwmon" ( \name -> ("hwmon" `isPrefixOf` name) || ("temp" `isInfixOf` name) && ("input" `isInfixOf` name) ) fmap (round .(/1000) . read) <$> traverse (readFile) hwmons -- | Get a symbol corresponding to the temperature getSymbol :: Integral n => n -> String getSymbol t | t < 50 = "\57868" --  | t < 80 = "\57866" --  | otherwise = "\57867" --  main :: IO () main = do maxTemp <- maximum <$> getTemps putStrLn $ (getSymbol <> show) maxTemp <> "°" exitWith $ if maxTemp < 80 then ExitSuccess else ExitFailure 33