module Jukebox.TPTP.FindFile where
import System.FilePath
import System.Directory(doesFileExist)
import System.Environment
import Control.Exception
import Control.Monad
import Jukebox.Options
#if __GLASGOW_HASKELL__ < 710
import Control.Applicative
import Data.Traversable(sequenceA)
#endif
findFile :: [FilePath] -> FilePath -> IO (Maybe FilePath)
findFile [] _file = return Nothing
findFile (path:paths) file = do
let candidate = path </> file
exists <- doesFileExist candidate
if exists then return (Just candidate)
else findFile paths file
findFileTPTP :: [FilePath] -> FilePath -> IO (Maybe FilePath)
findFileTPTP dirs file = do
let candidates = [file, "Problems" </> file,
"Problems" </> take 3 file </> file]
fmap msum (mapM (findFile dirs) candidates)
getTPTPDirs :: IO [FilePath]
getTPTPDirs = do { dir <- getEnv "TPTP"; return [dir] } `catch` f
where f :: IOException -> IO [FilePath]
f _ = return []
findFileFlags =
inGroup "Input and clausifier options" $
concat <$>
sequenceA [
pure ["."],
concat <$>
manyFlags "root"
["Extra directories that will be searched for TPTP input files."]
argFiles,
io getTPTPDirs
]