{-# LANGUAGE ScopedTypeVariables #-}

module HaskellWorks.Data.Streams.ByteString
  ( streamChunks
  , stream
  ) where

import Data.Word
import HaskellWorks.Data.Streams.Size
import HaskellWorks.Data.Streams.Stream (Step (..), Stream (..))
import Prelude                          hiding (foldl, map, sum, zipWith)

import qualified Data.ByteString as BS

streamChunks :: [BS.ByteString] -> Stream Word8
streamChunks ass = Stream step (ass, 0) Unknown
  where step (bss, i) = case bss of
          cs:css -> if i < BS.length cs
            then Yield (BS.index cs i) (bss, i + 1)
            else Skip (css, 0)
          [] -> Done
{-# INLINE [1] streamChunks #-}

stream :: BS.ByteString -> Stream Word8
stream bs = Stream step (bs, 0) Unknown
  where step (cs, i) = if i < BS.length cs
          then Yield (BS.index cs i) (cs, i + 1)
          else Done
{-# INLINE [1] stream #-}