DISABLE FDs (REMOVE ME).
[jackhill/mal.git] / haskell / step1_read_print.hs
1 import System.IO (hFlush, stdout)
2 import Control.Monad.Except (runExceptT)
3 import Control.Monad.Trans (liftIO)
4
5 import Readline (addHistory, readline, load_history)
6 import Types
7 import Reader (read_str)
8 import Printer (_pr_str)
9
10 -- read
11
12 mal_read :: String -> IOThrows MalVal
13 mal_read = read_str
14
15 -- eval
16
17 eval :: MalVal -> MalVal
18 eval = id
19
20 -- print
21
22 mal_print :: MalVal -> IOThrows String
23 mal_print = liftIO. Printer._pr_str True
24
25 -- repl
26
27 rep :: String -> IOThrows String
28 rep line = mal_print =<< (eval <$> mal_read line)
29
30 repl_loop :: IO ()
31 repl_loop = do
32 line <- readline "user> "
33 case line of
34 Nothing -> return ()
35 Just "" -> repl_loop
36 Just str -> do
37 addHistory str
38 res <- runExceptT $ rep str
39 out <- case res of
40 Left mv -> (++) "Error: " <$> liftIO (Printer._pr_str True mv)
41 Right val -> return val
42 putStrLn out
43 hFlush stdout
44 repl_loop
45
46 main :: IO ()
47 main = do
48 load_history
49
50 repl_loop