module REPL where import Eval import Lexer import Parser import Research import Control.Monad (void) import qualified Data.Map as Map import System.IO (hFlush, stdout) repl :: Map.Map String T -> IO () repl env = do putStr "sapling < " hFlush stdout input <- getLine if input == "_:exit" then putStrLn "Goodbye!" else if input == "" then do putStrLn "" repl env else do let clearEnv = Map.delete "__result" env let newEnv = evalSingle clearEnv (parseSingle input) case Map.lookup "__result" newEnv of Just r -> do putStrLn $ "sapling > " ++ show r putStrLn $ "DECODE -: " ++ (decodeResult r) Nothing -> pure () repl newEnv decodeResult :: T -> String decodeResult tc = case ofString tc of Right str -> "\"" ++ str ++ "\"" Left _ -> case ofNumber tc of Right num -> "# " ++ show num Left _ -> "Failed to decode number from Tree"