{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE BangPatterns #-}

module SAX.Streaming where

import           Control.Monad.Except
import           Data.ByteString (ByteString)
import           Streaming
import qualified Streaming.Prelude as S
import           Xeno.SAX
import           Xeno.Types


data SaxEvent
  = OpenTag !ByteString
  | Attr !ByteString !ByteString
  | EndOfOpenTag !ByteString
  | Text !ByteString
  | CloseTag !ByteString
  | CDATA !ByteString
  deriving (Show, Eq, Ord)

streamXml
  :: (MonadError XenoException m)
  => ByteString
  -> Stream (Of SaxEvent) m ()
streamXml str = process
  (S.yield . OpenTag)
  (\a b -> S.yield $ Attr a b)
  (S.yield . EndOfOpenTag)
  (S.yield . Text)
  (S.yield . CloseTag)
  (S.yield . CDATA)
  str