module Language.Java.Paragon.Interaction (setVerbosity, getVerbosity, verbosePrint, normalPrint, detailPrint, finePrint, debugPrint, panic, versionString, libraryBase, typeCheckerBase ) where import Data.IORef import Control.Monad import System.IO.Unsafe (unsafePerformIO) -- Trust me, I know what I'm doing... :-D import Language.Java.Paragon.Monad.Base ------------------------------------------------------------- -- Verbosity in feedback {-# NOINLINE unsafeVerbosityGlobalVar #-} unsafeVerbosityGlobalVar :: IORef Int unsafeVerbosityGlobalVar = unsafePerformIO $ newIORef 1 getVerbosity :: IO Int getVerbosity = readIORef unsafeVerbosityGlobalVar setVerbosity :: Int -> IO () setVerbosity k = writeIORef unsafeVerbosityGlobalVar k verbosePrint :: MonadIO m => Int -> String -> m () verbosePrint n str = liftIO $ do k <- getVerbosity when (n <= k) $ putStrLn str normalPrint, detailPrint, finePrint, debugPrint :: MonadIO m => String -> m () normalPrint = verbosePrint 1 -- Feedback to the user in the normal case detailPrint = verbosePrint 2 -- Report individual members finePrint = verbosePrint 3 -- Report verbosely (default for -v) debugPrint = verbosePrint 4 -- Include DEBUG output ------------------------------------------------------------- panic :: String -> String -> a panic cause extra = error $ "Panic! " ++ cause ++ " caused the impossible, \ \and the world is now about to end in 3.. 2.. 1.. \n\ \Please report as a bug at: " ++ issueTracker ++ if not (null extra) then "\nExtra information: " ++ extra else "" issueTracker :: String issueTracker = "http://code.google.com/p/paragon-java/issues/entry" versionString :: String versionString = "0.1.23" libraryBase, typeCheckerBase :: String libraryBase = "Language.Java.Paragon" typeCheckerBase = libraryBase ++ ".TypeCheck"