{-# LANGUAGE Rank2Types #-}
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
  -- TODO use sinkPart_
  res   <- f $ asParts <~ fanout [auto (:[]), auto (const []) <~ sinkHandle byChunk h <~ processPut putEvent]
  hClose h
  return res