shithub: MicroHs

ref: 2ab39f5ee3ec52d097989ec8fecac0f6a7c12b16
dir: /src/MicroHs/CompileCache.hs/

View raw version
module MicroHs.CompileCache(
  CModule(..), tModuleOf,
  Cache, cache, working, updWorking, emptyCache, deleteFromCache, workToDone,
  saveCache, loadCached,
  ) where
import Prelude
import MicroHs.Desugar(LDef)
import MicroHs.Expr(IdentModule)
--import MicroHs.Ident
import qualified MicroHs.IdentMap as M
import MicroHs.TypeCheck(TModule)
import System.IO
import System.IO.MD5(MD5CheckSum)
import Compat

data CModule = CModule
    (TModule [LDef])                    -- the cached module
    [IdentModule]                       -- imported module names
    MD5CheckSum                         -- checksum of the source file
--  deriving (Show)

tModuleOf :: CModule -> TModule [LDef]
tModuleOf (CModule t _ _) = t

data Cache = Cache [IdentModule] (M.Map CModule)
--  deriving (Show)

working :: Cache -> [IdentModule]
working (Cache x _) = x

updWorking :: [IdentModule] -> Cache -> Cache
updWorking w (Cache _ m) = Cache w m

cache :: Cache -> M.Map CModule
cache (Cache _ x) = x

emptyCache :: Cache
emptyCache = Cache [] M.empty

deleteFromCache :: IdentModule -> Cache -> Cache
deleteFromCache mn (Cache is m) = Cache is (M.delete mn m)

workToDone :: CModule -> Cache -> Cache
workToDone cm (Cache (mn:ws) m) = Cache ws (M.insert mn cm m)
workToDone _ _ = undefined

saveCache :: FilePath -> Cache -> IO ()
saveCache fn cash = do
  hout <- openFile fn WriteMode
  hSerialize hout cash
  hClose hout

loadCached :: FilePath -> IO (Maybe Cache)
loadCached fn = do
  mhin <- openFileM fn ReadMode
  case mhin of
    Nothing ->
      return Nothing
    Just hin -> do
      cash <- hDeserialize hin
      hClose hin
      return (Just cash)