{-# LANGUAGE OverloadedStrings #-}
module Web.Growler.EventSource where
import           Blaze.ByteString.Builder (Builder)
import           Control.Monad.Trans
import           Data.Function (fix)
import           Network.HTTP.Types (hContentType, status200)
import           Network.Wai.EventSource.EventStream
import           Web.Growler

eventSource :: MonadIO m => IO ServerEvent -> HandlerT m ()
eventSource m = do
  status status200
  setHeader hContentType "text/event-stream"
  stream $ \sendChunk flush -> fix $ \loop -> do
    se <- m
    case eventToBuilder se of
      Nothing -> return ()
      Just b -> sendChunk b >> flush >> loop