unused-0.5.0.2: src/Unused/Util.hs
module Unused.Util
( groupBy
, stringToInt
, safeHead
, readIfFileExists
) where
import System.Directory (doesFileExist)
import Control.Arrow ((&&&))
import qualified Data.List as L
import Data.Function
import Data.Char (digitToInt, isDigit)
groupBy :: (Ord b) => (a -> b) -> [a] -> [(b, [a])]
groupBy f = map (f . head &&& id)
. L.groupBy ((==) `on` f)
. L.sortBy (compare `on` f)
safeHead :: [a] -> Maybe a
safeHead (x:_) = Just x
safeHead _ = Nothing
stringToInt :: String -> Maybe Int
stringToInt xs
| all isDigit xs = Just $ loop 0 xs
| otherwise = Nothing
where
loop = foldl (\acc x -> acc * 10 + digitToInt x)
readIfFileExists :: String -> IO (Maybe String)
readIfFileExists path = do
exists <- doesFileExist path
if exists
then Just <$> readFile path
else return Nothing