preprocess-haskell-0.0.1.0: src/Language/Haskell/Preprocess/Examples.hs
module Language.Haskell.Preprocess.Examples where
import BasicPrelude hiding (forM, forM_, mapM, mapM_, sum)
import qualified Prelude
import Control.DeepSeq
import Data.Foldable
import Data.Map.Strict as M
import Data.Set as S
import Data.Traversable
import Language.Haskell.Exts.Annotated as HSE hiding (ModuleName)
import Language.Haskell.Preprocess
type EntireProject a = Map SrcTreePath (Pkg, Map ModuleName a)
type MaybeModule = Maybe(Module SrcSpanInfo)
-- | TODO This is poorly thought out.
type Transform a = Pkg → FilePath → String → a
loadPkg ∷ NFData a ⇒
FilePath → Transform a → SrcTreePath →
IO (Pkg,Map ModuleName a)
loadPkg root transform pkgFile = do
pkg ← scanPkg root pkgFile
sources ← forM (pkgModules pkg) $ \fp →
processFile root pkg (transform pkg $ unSTP fp) fp
return (pkg,sources)
loadEntireProject ∷ NFData a ⇒ FilePath → Transform a → IO (EntireProject a)
loadEntireProject root transform = do
pkgFiles ← S.toList <$> scan root
mapM (loadPkg root transform) $ M.fromList $ (\x→(x,x)) <$> pkgFiles
parseEntireProject ∷ FilePath → IO (EntireProject MaybeModule)
parseEntireProject root = do
pkgFiles ← S.toList <$> scan root
mapM (loadPkg root parseCode) $ M.fromList $ (\x→(x,x)) <$> pkgFiles
listFiles ∷ FilePath → IO [FilePath]
listFiles root = do
pkgFiles ← S.toList <$> scan root
fmap (fmap unSTP . join) $ forM pkgFiles $ \pkgFile →
M.elems . pkgModules <$> scanPkg root pkgFile
loc ∷ FilePath → IO Int
loc root = do
pkgFiles ← S.toList <$> scan root
fmap sum $ forM pkgFiles $ \pkgFile → do
pkg ← scanPkg root pkgFile
sum <$> forM (M.elems (pkgModules pkg))
(processFile root pkg (length . Prelude.lines))
configureAndParseEntireProject ∷ FilePath → IO (EntireProject MaybeModule)
configureAndParseEntireProject = flip analyseConfiguredCopy parseEntireProject