[project @ 2005-01-29 16:10:27 by wolfgang]
[ghc-base.git] / Debug / Trace.hs
1 -----------------------------------------------------------------------------
2 -- |
3 -- Module      :  Debug.Trace
4 -- Copyright   :  (c) The University of Glasgow 2001
5 -- License     :  BSD-style (see the file libraries/base/LICENSE)
6 -- 
7 -- Maintainer  :  libraries@haskell.org
8 -- Stability   :  provisional
9 -- Portability :  portable
10 --
11 -- The 'trace' function.
12 --
13 -----------------------------------------------------------------------------
14
15 module Debug.Trace (
16         -- * Tracing
17         putTraceMsg,      -- :: String -> IO ()
18         trace             -- :: String -> a -> a
19   ) where
20
21 import Prelude
22 import System.IO.Unsafe
23
24 #ifdef __GLASGOW_HASKELL__
25 import Foreign.C.String
26 #endif
27
28 -- | 'putTraceMsg' function outputs the trace message from IO monad.
29 -- Usually the output stream is 'stderr' but if the function is called
30 -- from Windows GUI application then the output will be directed to the Windows
31 -- debug console.
32 putTraceMsg :: String -> IO ()
33 putTraceMsg msg = do
34 #ifndef __GLASGOW_HASKELL__
35     hPutStr handle msg
36     hPutChar handle '\n'
37 #else
38     withCString "%s\n" $ \cfmt ->
39      withCString msg  $ \cmsg ->
40       debugBelch cfmt cmsg
41
42 foreign import ccall unsafe debugBelch :: CString -> CString -> IO ()
43 #endif
44
45 {-# NOINLINE trace #-}
46 {-|
47 When called, 'trace' outputs the string in its first argument, before 
48 returning the second argument as its result. The 'trace' function is not 
49 referentially transparent, and should only be used for debugging, or for 
50 monitoring execution. Some implementations of 'trace' may decorate the string 
51 that\'s output to indicate that you\'re tracing. The function is implemented on
52 top of 'putTraceMsg'.
53 -}
54 trace :: String -> a -> a
55 trace string expr = unsafePerformIO $ do
56     putTraceMsg string
57     return expr