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