module Sarsi.Trace where

import Data.Machine ((<~), auto, runT_)
import Data.Attoparsec.Text (Parser)
import Data.Attoparsec.Text.Machine (streamParser)
import System.IO (Handle)
import System.IO.Machine (byLine, printer, sourceHandle)

import qualified Codec.GHC.Log as GHC
import qualified Codec.Sarsi.SBT as SBT
import qualified Data.Text as Text

traceHS :: Handle -> IO ()
traceHS = traceParser GHC.messageParser

traceSBT :: Handle -> IO ()
traceSBT = traceParser SBT.eventParser

traceParser :: Show a => Parser a -> Handle -> IO ()
traceParser parser h = do
  runT_ $ printer <~ streamParser parser <~ appendCR <~ sourceHandle byLine h
    where
      appendCR = auto $ (`Text.snoc` '\n')