{-# LANGUAGE LambdaCase #-} module Main where import Control.Concurrent.MVar import Data.Text (Text) import qualified Data.Text as T import System.Environment (getArgs) import System.Exit (die) import Ghci import IRC runInGhci :: Ghci -> Text -> IO (Ghci, [Text]) runInGhci ghci message = do (ghci', output) <- runStmtClever ghci (T.unpack message) case output of Error "" -> return (ghci', [T.pack "Error?"]) Error err -> return (ghci', [T.pack err]) Ignored -> return (ghci', []) Return "" -> return (ghci', [T.pack ""]) Return s -> return (ghci', [T.pack s]) mainIRC :: IO () mainIRC = do ghci0 <- makeGhci ghcivar <- newMVar ghci0 connectIRC (\t -> T.take 2 t == T.pack "% ") (\recvmsg -> do ghci <- takeMVar ghcivar (ghci', msgs) <- runInGhci ghci (T.drop 2 recvmsg) putMVar ghcivar ghci' return msgs) mainGHCI :: IO () mainGHCI = do let loop :: Ghci -> IO () loop ghci = do line <- getLine (ghci', moutput) <- runStmtClever ghci line case moutput of Return output -> putStrLn $ "output = <" ++ output ++ ">" Ignored -> putStrLn "" Error err -> putStrLn err loop ghci' makeGhci >>= loop main :: IO () main = do getArgs >>= \case ["-irc"] -> mainIRC ["-ghci"] -> mainGHCI [] -> mainGHCI _ -> die "Command line not recognised"