diff --git a/hw-streams.cabal b/hw-streams.cabal
--- a/hw-streams.cabal
+++ b/hw-streams.cabal
@@ -3,7 +3,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           hw-streams
-version:        0.0.0.5
+version:        0.0.0.6
 synopsis:       Primitive functions and data types
 description:    Primitive functions and data types.
 category:       Data
@@ -15,7 +15,7 @@
 copyright:      2016-2018 John Ky
 license:        BSD3
 license-file:   LICENSE
-tested-with:    GHC == 8.4.2, GHC == 8.2.2, GHC == 8.0.2, GHC == 7.10.3
+tested-with:    GHC == 8.6.1, GHC == 8.4.4, GHC == 8.2.2, GHC == 8.0.2, GHC == 7.10.3
 build-type:     Simple
 cabal-version:  >= 1.10
 
@@ -50,6 +50,8 @@
   if flag(bounds-checking-enabled)
     cpp-options: -DBOUNDS_CHECKING_ENABLED
   exposed-modules:
+      HaskellWorks.Data.Streams.ByteString
+      HaskellWorks.Data.Streams.ByteString.Lazy
       HaskellWorks.Data.Streams.Internal
       HaskellWorks.Data.Streams.Internal.Bundle
       HaskellWorks.Data.Streams.Internal.Chunk
diff --git a/src/HaskellWorks/Data/Streams/ByteString.hs b/src/HaskellWorks/Data/Streams/ByteString.hs
new file mode 100644
--- /dev/null
+++ b/src/HaskellWorks/Data/Streams/ByteString.hs
@@ -0,0 +1,29 @@
+{-# 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 #-}
diff --git a/src/HaskellWorks/Data/Streams/ByteString/Lazy.hs b/src/HaskellWorks/Data/Streams/ByteString/Lazy.hs
new file mode 100644
--- /dev/null
+++ b/src/HaskellWorks/Data/Streams/ByteString/Lazy.hs
@@ -0,0 +1,12 @@
+module HaskellWorks.Data.Streams.ByteString.Lazy
+  ( stream
+  ) where
+
+import Data.Word
+import HaskellWorks.Data.Streams.Stream (Stream (..))
+
+import qualified Data.ByteString.Lazy                 as LBS
+import qualified HaskellWorks.Data.Streams.ByteString as BS
+
+stream :: LBS.ByteString -> Stream Word8
+stream = BS.streamChunks . LBS.toChunks
