module Sarsi.Producer where
import Codec.Sarsi (Event(..), putEvent)
import Data.Binary.Machine (processPut)
import Data.Machine (ProcessT, (<~), auto, asParts, runT_)
import Data.Machine.Fanout (fanout)
import Network.Socket (connect, socketToHandle)
import System.IO (IOMode(AppendMode), hClose)
import System.IO.Machine (byChunk, sinkHandle)
import qualified Data.Text as T
import Sarsi (mkSocket, mkSockAddr)
produce :: FilePath -> (ProcessT IO Event Event -> IO a) -> IO a
produce fp f = do
sock <- mkSocket
addr <- mkSockAddr fp
connect sock addr
h <- socketToHandle sock AppendMode
res <- f $ asParts <~ fanout [auto (:[]), auto (const []) <~ sinkHandle byChunk h <~ processPut putEvent]
hClose h
return res