module Lambdabot.Plugin.Haskell.Check (checkPlugin) where
import Lambdabot.Plugin
import Lambdabot.Plugin.Haskell.Eval (runGHC)
import qualified Language.Haskell.Exts.Simple as Hs
import Codec.Binary.UTF8.String
checkPlugin :: Module ()
checkPlugin = newModule
{ moduleCmds = return
[ (command "check")
{ help = do
say "check <expr>"
say "You have QuickCheck and 3 seconds. Prove something."
, process = lim80 . check
}
]
}
check :: MonadLB m => String -> m String
check src =
case Hs.parseExp (decodeString src) of
Hs.ParseFailed l e -> return (Hs.prettyPrint l ++ ':' : e)
Hs.ParseOk{} -> postProcess `fmap` runGHC ("text (myquickcheck (" ++ src ++ "))")
postProcess xs =
let (first, rest) = splitAt 1 (map (unwords . words) (lines xs))
in unlines (first ++ [unwords rest | not (null rest)])