{-# LANGUAGE OverloadedStrings   #-}
{-# LANGUAGE ScopedTypeVariables #-}
module TestLogging (
  module TestLogging
) where
import qualified Control.Concurrent.Async as Async
import           Control.Monad            (void)
import           Data.Monoid              ((<>))
import           System.Log.FastLogger    as FL
task :: Show a => LoggerSet -> a -> IO ()
task log i =
  pushLogStrLn log $ toLogStr ("hello world " ++ show i)
  -- putStrLn $ "task " ++ show i
logT :: FL.ToLogStr msg => FL.TimedFastLogger -> msg -> IO ()
logT logger msg = logger $ \ft -> toLogStr ft <> toLogStr (": " :: String) <> toLogStr msg <> "\n"
task'
  :: forall a. Show a => (FL.LogStr -> IO ()) -> a -> IO ()
task' logger i = do
  void $ logger (toLogStr ("hello world T " ++ show i))
  putStr ""
myTimeFormat :: TimeFormat
myTimeFormat = "%Y-%m-%dT%H:%M:%S%z"
main :: IO ()
main = do
  log <- FL.newStdoutLoggerSet 128
  print =<< Async.mapConcurrently_ void [task log i | i <- [1..10]]
  FL.flushLogStr log
  timeCache <- FL.newTimeCache myTimeFormat
  (logger, cleanUp) <- FL.newTimedFastLogger timeCache (FL.LogStdout FL.defaultBufSize)
  let myLogger = void . logT logger
  void $ Async.mapConcurrently_ void [task' myLogger i | i <- [1..10]]
  cleanUp