module Main where
import System.Console.Editline.Readline
import Control.Exception as Exc
import System.Process
import System.Exit
import System.IO
import Control.Monad.Error
import Text.PrettyPrint (render,text,nest, (<>),(<+>),($$),sep)
import Editor
import Operation
import Eval
import Parser
import Engine
import Undo
import Paths_Hedi
instance SIO IO where
inputSio = readline
outputSio = putStrLn
historySio = addHistory
errorSIO = putStrLn
readfileSio = handleWith show . strictReadFile
writefileSio x y = handleWith show (writeFile x y)
externalSio = externalCommand
commandhelpSIO = getDataFileName "command.help"
handleWith :: (IOError -> k) -> IO a -> ErrorT k IO a
handleWith h f = ErrorT $ Exc.catch (Right `fmap` f) (return . Left . h)
strictReadFile :: String -> IO String
strictReadFile x = readFile x >>= \x -> Exc.evaluate (length x) >> return x
externalCommand :: String -> ErrorT String IO String
externalCommand s = ErrorT $ do
(_,output,error,h) <- runInteractiveCommand s
status <- waitForProcess h
output <- hGetContents output
error <- hGetContents error
return $ case status of
ExitSuccess -> Right output
ExitFailure _ -> Left error
greetings :: IO ()
greetings = putStrLn . render $
text "Hedi command line editor. " <> (
text "Version 0.1.1" $$
text "Released under BSD licence." $$
text "Copyright 2008 Paolo Veronelli" $$
text "Homepage http://code.haskell.org/Hedi")
$$ text " "
$$ text "Type \"he\" for help or \"he command\" for help on command"
$$ text "Type \"CTRL-D\" to quit without saving"
main :: IO ()
main = do
run (liftIO greetings >> commandLoop parse eval)
(Stato empty "" Nothing Nothing Nothing)
return ()