packages feed

paragon-0.1.22: src/Language/Java/Paragon/Interaction.hs

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.22"

libraryBase, typeCheckerBase :: String
libraryBase = "Language.Java.Paragon"
typeCheckerBase = libraryBase ++ ".TypeCheck"