module GraphMod.Utils
(
Qualifier
, Import(..)
, ImpType(..)
, splitQualifier
, ModName
, splitModName
, joinModName
, relPaths
, modToFile
, suffixes
) where
import Control.Monad(mplus)
import Control.Exception(evaluate)
import Data.Maybe(catMaybes)
import Data.List(intersperse,isPrefixOf)
import System.Directory(doesFileExist)
import System.FilePath
data Import = Import { impMod :: ModName, impType :: ImpType }
deriving Show
data ImpType = NormalImp | SourceImp
deriving (Show,Eq,Ord)
type Qualifier = [String]
type ModName = (Qualifier,String)
splitQualifier :: String -> Qualifier
splitQualifier cs = case break ('.'==) cs of
(xs,_:ys) -> xs : splitQualifier ys
_ -> [cs]
splitModName :: String -> ModName
splitModName cs = case break ('.'==) cs of
(xs,_:ys) -> let (as,bs) = splitModName ys
in (xs:as,bs)
_ -> ([],cs)
joinModName :: ModName -> String
joinModName (xs,y) = concat $ intersperse "." (xs ++ [y])
relPaths :: ModName -> [FilePath]
relPaths (xs,y) = [ prefix ++ suffix | suffix <- suffixes ]
where prefix = foldr (</>) y xs
suffixes :: [String]
suffixes = [".hs",".lhs", ".imports"]
modToFile :: [FilePath] -> ModName -> IO [FilePath]
modToFile dirs m = catMaybes `fmap` mapM check paths
where
paths = [ d </> r | d <- dirs, r <- relPaths m ]
check p = do x <- doesFileExist p
return (if x then Just p else Nothing)
delit :: String -> String
delit txt = unlines $ bird $ lines txt
where
bird (('>' : cs) : ls) = (' ' : cs) : bird ls
bird (l : ls)
| "\\begin{code}" `isPrefixOf` l = in_code ls
| otherwise = bird ls
bird [] = []
in_code (l : ls)
| "\\end{code}" `isPrefixOf` l = bird ls
| otherwise = l : in_code ls
in_code [] = []