djinn-2011.7.23: src/REPL.hs
--
-- Copyright (c) 2005 Lennart Augustsson
-- See LICENSE for licensing details.
--
module REPL(REPL(..), repl) where
import Control.Monad.Trans
import System.Console.Haskeline
data REPL s = REPL {
repl_init :: IO (String, s), -- prompt and initial state
repl_eval :: s -> String -> IO (Bool, s), -- quit flag and new state
repl_exit :: s -> IO ()
}
repl :: REPL s -> IO ()
repl p = do
(prompt, state) <- repl_init p
let loop s = do
mline <- getInputLine prompt
case mline of
Nothing -> loop s
Just line -> do
(quit, s') <- liftIO $ repl_eval p s line
if quit then
liftIO $ repl_exit p s'
else
loop s'
runInputT defaultSettings (loop state)
{-
repl :: REPL s -> IO ()
repl p = do
(prompt, state) <- repl_init p
let loop s = (do
mline <- readline prompt
case mline of
Nothing -> loop s
Just line -> do
(quit, s') <- repl_eval p s line
if quit then
repl_exit p s'
else do
addHistory line
loop s'
) `Control.Exception.catch` ( \ exc ->
do
putStrLn $ "\nInterrupted (" ++ show exc ++ ")"
loop s
)
loop state
-}