packages feed

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