module Control.Concurrent.ConLogger ( ConLogger , new , put ) where import Control.Applicative import Control.Concurrent (forkIO) import Control.Concurrent.Chan (Chan, newChan, readChan, writeChan) import Control.Monad (void) import qualified Data.Text as T (Text) import qualified Data.Text.IO as T (putStrLn) import Prelude hiding (log) newtype ConLogger = ConLogger { conLogger :: Chan T.Text } new :: IO ConLogger new = do ch <- ConLogger <$> newChan void $ forkIO (runner ch) return ch put :: ConLogger -> T.Text -> IO () put cl = writeChan (conLogger cl) runner :: ConLogger -> IO () runner cl = do log <- readChan chan T.putStrLn log runner cl where chan = conLogger cl