aboutsummaryrefslogtreecommitdiffstats
path: root/src/Lib.hs
blob: a65333637daa2f5ce408bcf6dc72bdea3af39d7d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
{-# LANGUAGE LambdaCase #-}
module Lib (
    runScriptFile,
    runInlineScript,
) where

import qualified Data.List as L
import Control.Monad.Except
import Control.Monad.Reader
import Utils
import Tokenizer ( tokenize )
import Parser ( parse )
import Evaluator ( evaluate )

runScriptFile :: Env -> String -> LContext Env
runScriptFile env fileName = do
    src <- liftIO $ readFile fileName
    runInlineScript env src

runInlineScript :: Env -> String -> LContext Env
runInlineScript env src = do
    tokenized <- tokenize src
    config <- ask
    when (configVerboseMode config) $ liftIO $ putStrLn $ "tokenized:\t\t" ++ show tokenized
    parsed <- parse tokenized
    when (configVerboseMode config) $ do
        let output = "parsed:\t\t\t" ++ (map show parsed $> L.intercalate "\n\t\t\t")
        liftIO $ putStrLn output
    (newEnv, evaluated) <- foldEvaluate env parsed
    liftIO $ mapM_ putStrLn (map show evaluated)
    return newEnv
        where
            foldEvaluate :: Env -> [AST] -> LContext (Env, [AST])
            foldEvaluate accEnv [] = return (accEnv, [])
            foldEvaluate accEnv (ast:rest) = do
                (newAccEnv, newAst) <- evaluate accEnv ast
                (retEnv, restEvaled) <- foldEvaluate newAccEnv rest
                return $ (retEnv, newAst : restEvaled)