@@ -13,7 +13,7 @@ module Hakyll.Core.Logger
14import Control.Monad (forever)
14import Control.Monad (forever)
15import Control.Monad.Trans (MonadIO, liftIO)
15import Control.Monad.Trans (MonadIO, liftIO)
16−import Control.Applicative ((<$>), (<*>))
16+import Control.Applicative (pure, (<$>), (<*>))
17import Control.Concurrent (forkIO)
17import Control.Concurrent (forkIO)
18import Control.Concurrent.Chan.Strict (Chan, newChan, readChan, writeChan)
18import Control.Concurrent.Chan.Strict (Chan, newChan, readChan, writeChan)
19import Control.Concurrent.MVar.Strict (MVar, newEmptyMVar, takeMVar, putMVar)
19import Control.Concurrent.MVar.Strict (MVar, newEmptyMVar, takeMVar, putMVar)
@@ -24,15 +24,16 @@ import Data.Time (getCurrentTime, diffUTCTime)
24-- | Logger structure. Very complicated.
24-- | Logger structure. Very complicated.
26data Logger = Logger
26data Logger = Logger
27− { loggerChan :: Chan (Maybe String) -- Nothing marks the end
27+ { loggerChan :: Chan (Maybe String) -- ^ Nothing marks the end
28− , loggerSync :: MVar () -- Used for sync on quit
28+ , loggerSync :: MVar () -- ^ Used for sync on quit
29+ , loggerSink :: String -> IO () -- ^ Out sink
31-- | Create a new logger
32-- | Create a new logger
33−makeLogger :: IO Logger
34+makeLogger :: (String -> IO ()) -> IO Logger
34−makeLogger = do
35+makeLogger sink = do
35− logger <- Logger <$> newChan <*> newEmptyMVar
36+ logger <- Logger <$> newChan <*> newEmptyMVar <*> pure sink
36 _ <- forkIO $ loggerThread logger
37 _ <- forkIO $ loggerThread logger
37 return logger
38 return logger
@@ -42,7 +43,7 @@ makeLogger = do
42 -- Stop: sync
43 -- Stop: sync
43 Nothing -> putMVar (loggerSync logger) ()
44 Nothing -> putMVar (loggerSync logger) ()
44 -- Print and continue
45 -- Print and continue
45− Just m -> putStrLn m
46+ Just m -> loggerSink logger m
47-- | Flush the logger (blocks until flushed)
48-- | Flush the logger (blocks until flushed)