{-# LANGUAGE CPP, OverloadedStrings #-} {-# OPTIONS_GHC -Wall -fwarn-tabs #-} module Language.Hakaru.Parser.Import where import Language.Hakaru.Parser.AST import Language.Hakaru.Parser.Parser import Control.Monad.Trans.Except import Control.Monad.IO.Class import qualified Data.Text as T import qualified Data.Text.IO as IO import Text.Parsec hiding (Empty) replaceBody :: AST' T.Text -> AST' T.Text -> AST' T.Text replaceBody e1 e2 = case e1 of Let x e3 e4 -> Let x e3 (replaceBody e4 e2) Ann e3 t -> Ann (replaceBody e3 e2) t WithMeta e3 s -> WithMeta (replaceBody e3 e2) s _ -> e2 expandImports :: ASTWithImport' T.Text -> ExceptT ParseError IO (AST' T.Text) expandImports (ASTWithImport' (Import i:is) ast) = do file <- liftIO . IO.readFile . T.unpack $ T.append i ".hk" astIm <- ExceptT . return $ parseHakaruWithImports file ast' <- expandImports astIm expandImports (ASTWithImport' is (replaceBody ast' ast)) expandImports (ASTWithImport' [] ast) = return ast