module Ki.Debug
  ( debug,
  )
where

import Control.Concurrent
import System.IO.Unsafe (unsafePerformIO)
import Prelude

debug :: Monad m => String -> m ()
debug :: String -> m ()
debug String
message =
  IO () -> ()
forall a. IO a -> a
unsafePerformIO IO ()
output () -> m () -> m ()
`seq` () -> m ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
  where
    output :: IO ()
    output :: IO ()
output = do
      ThreadId
threadId <- IO ThreadId
myThreadId
      MVar () -> (() -> IO ()) -> IO ()
forall a b. MVar a -> (a -> IO b) -> IO b
withMVar MVar ()
lock \()
_ -> String -> IO ()
putStrLn (String
"[" String -> String -> String
forall a. [a] -> [a] -> [a]
++ ThreadId -> String
forall a. Show a => a -> String
show ThreadId
threadId String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"] " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
message)

lock :: MVar ()
lock :: MVar ()
lock =
  IO (MVar ()) -> MVar ()
forall a. IO a -> a
unsafePerformIO (() -> IO (MVar ())
forall a. a -> IO (MVar a)
newMVar ())
{-# NOINLINE lock #-}