module MkCode (
arrangeCode
, mkSrcText
, mkSrcCode
, mkSrcBegin
, mkSrcCont
, mkSrcEnd
, mkSrcImport
, mkSrcDefinition
, mkSrcTop
, mkSrcEq
, mkSrcEqEq
, mkSrcEqShow
, mkSrcEqEqShow
) where
import Text.RegexPR (getbrsRegexPR)
arrangeCode :: String -> String -> String
arrangeCode top inner = mkImports imports ++ top ++ header ++ inner ++ footer
mkImports :: [ String ] -> String
mkImports = (++"\n") . unlines . map ("import "++)
imports :: [ String ]
imports = [
"System.Environment (getArgs)"
, "System.IO (hPutStr, stdout, openFile, hClose, IOMode(WriteMode))"
, "Control.Monad.State(runStateT, modify, lift)"
]
header, footer, putStrStr :: String
putStrStr
= "(\\stm -> do {\n" ++
" __ehs_handle <- getArgs >>= (\\args -> if null args\n" ++
" then return stdout\n" ++
" else openFile (head args) WriteMode);\n" ++
" runStateT stm \"\" >>= hPutStr __ehs_handle . snd;\n" ++
" hClose __ehs_handle }) $ "
header = "main = " ++ putStrStr ++ "do {\n"
footer = " }\n"
mkSrcText :: String -> String
mkSrcText txt = " " ++ "(modify . flip (++))" ++ " $ " ++ show txt ++ ";\n"
mkSrcCode :: String -> String
mkSrcCode code
= case (getbrsRegexPR "^\\s*(\\S+)\\s*<-(.+)$" code,
getbrsRegexPR "^\\s*let\\s+(.+)$" code) of
((_:brs), _) -> " " ++ (brs !! 0) ++ " <- lift $ " ++ (brs !! 1) ++ ";\n"
(_, (_:brs)) -> " let " ++ (brs !! 0) ++ ";\n"
_ -> " lift $ " ++ code ++ ";\n"
mkSrcBegin, mkSrcCont, mkSrcEnd, mkSrcTop,
mkSrcEq, mkSrcEqEq, mkSrcEqShow, mkSrcEqEqShow
:: String -> String
mkSrcBegin b = " lift ( " ++ b ++ " (fmap snd $ flip runStateT \"\" $ do {\n"
mkSrcCont c = " }) " ++ c ++ " (fmap snd $ flip runStateT \"\" $ do {\n"
mkSrcEnd e = " }) " ++ e ++ " ) >>= (modify . flip (++));\n"
mkSrcImport :: String -> String -> String
mkSrcImport mdl "" = "import " ++ mdl ++ "\n"
mkSrcImport mdl imps = "import " ++ mdl ++ "(" ++ imps ++ ")\n"
mkSrcDefinition :: String -> String -> String
mkSrcDefinition var val = var ++ " = " ++ val ++ "\n"
mkSrcTop = (++"\n")
mkSrcEq src = " (modify . flip (++)) $ " ++ src ++ ";\n"
mkSrcEqShow src = " (modify . flip (++)) $ show $ " ++ src ++ ";\n"
mkSrcEqEq src = " lift (" ++ src ++ ") >>= (modify . flip (++));\n"
mkSrcEqEqShow src = " lift (" ++ src ++ ") >>= (modify . flip (++)) . show;\n"