prepare to make cache size runtime settable
[ruff:gruff.git] / Utils.hs
1 module Utils where
2
3 import Prelude hiding (catch)
4 import Control.Exception (catch, IOException)
5 import Control.Monad (forM)
6 import System.Directory (getDirectoryContents, doesFileExist, doesDirectoryExist)
7 import System.FilePath ((</>))
8
9 safeRead :: Read a => String -> Maybe a
10 safeRead s = case filter (null . snd) (reads s) of
11   [(a, "")] -> Just a
12   _ -> Nothing
13
14 catchIO :: IO a -> (IOException -> IO a) -> IO a
15 catchIO = catch
16
17 getFilesRecursive :: FilePath -> IO [([FilePath], FilePath)]
18 getFilesRecursive d = (do
19   fs0 <- getDirectoryContents d
20   let fs = filter (`notElem` [".", ".."]) fs0
21   ffs <- forM fs $ \f -> do
22     let df = d </> f
23     fe <- doesFileExist df
24     fd <- doesDirectoryExist df
25     case (fe, fd) of
26       (True, False) -> return [([], f)]
27       (False, True) -> map (\(ds, f') -> (f:ds, f')) `fmap` getFilesRecursive df
28       _ -> return []
29   return (concat ffs)) `catchIO` (\_ -> return [])
30
31 safeLast :: [a] -> Maybe a
32 safeLast [] = Nothing
33 safeLast [x] = Just x
34 safeLast (_:xs) = safeLast xs