packages feed

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

module Language.Java.Paragon.Interaction
    (setVerbosity, getVerbosity, verbosePrint,
     normalPrint, extraPrint, detailPrint, finePrint,
     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

-------------------------------------------------------------
-- 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 :: Int -> String -> IO ()
verbosePrint n str = do
  k <- getVerbosity
  when (n <= k) $ putStrLn str

normalPrint, extraPrint, detailPrint, finePrint :: String -> IO ()
normalPrint = verbosePrint 1      -- Feedback to the user in the normal case
extraPrint  = verbosePrint 2      -- Report individual members
detailPrint = verbosePrint 3      -- Report verbosely (default for -v)
finePrint   = 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.16"

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