diff --git a/deferred-folds.cabal b/deferred-folds.cabal
--- a/deferred-folds.cabal
+++ b/deferred-folds.cabal
@@ -1,7 +1,7 @@
 name:
   deferred-folds
 version:
-  0.6.8
+  0.6.9
 category:
   Folding
 synopsis:
@@ -45,6 +45,7 @@
     DeferredFolds.Prelude
   build-depends:
     base >=4.7 && <5,
+    bytestring >=0.10 && <0.11,
     containers >=0.5 && <0.6,
     foldl >=1 && <2,
     transformers >=0.5 && <0.6
diff --git a/library/DeferredFolds/Prelude.hs b/library/DeferredFolds/Prelude.hs
--- a/library/DeferredFolds/Prelude.hs
+++ b/library/DeferredFolds/Prelude.hs
@@ -86,3 +86,7 @@
 -- transformers
 -------------------------
 import Control.Monad.Trans.Class as Exports
+
+-- bytestring
+-------------------------
+import Data.ByteString as Exports (ByteString)
diff --git a/library/DeferredFolds/Unfold.hs b/library/DeferredFolds/Unfold.hs
--- a/library/DeferredFolds/Unfold.hs
+++ b/library/DeferredFolds/Unfold.hs
@@ -6,6 +6,7 @@
 import qualified DeferredFolds.UnfoldM as B
 import qualified Data.Map.Strict as C
 import qualified Data.IntMap.Strict as D
+import qualified Data.ByteString as ByteString
 
 
 {-|
@@ -153,3 +154,7 @@
 intMap :: IntMap value -> Unfold (Int, value)
 intMap intMap =
   Unfold (\ step init -> D.foldlWithKey' (\ state key value -> step state (key, value)) init intMap)
+
+{-# INLINE byteStringBytes #-}
+byteStringBytes :: ByteString -> Unfold Word8
+byteStringBytes bs = Unfold (\ step init -> ByteString.foldl' step init bs)
diff --git a/library/DeferredFolds/UnfoldM.hs b/library/DeferredFolds/UnfoldM.hs
--- a/library/DeferredFolds/UnfoldM.hs
+++ b/library/DeferredFolds/UnfoldM.hs
@@ -3,6 +3,8 @@
 
 import DeferredFolds.Prelude hiding (mapM_)
 import qualified DeferredFolds.Prelude as A
+import qualified Data.ByteString as ByteString
+import qualified Data.ByteString.Internal as ByteString
 
 
 {-|
@@ -149,3 +151,18 @@
 hoist :: (forall a. m a -> n a) -> (forall a. n a -> m a) -> UnfoldM m a -> UnfoldM n a
 hoist trans1 trans2 (UnfoldM unfold) = UnfoldM $ \ step init -> 
   trans1 (unfold (\ a b -> trans2 (step a b)) init)
+
+{-# INLINE byteStringBytes #-}
+byteStringBytes :: ByteString -> UnfoldM IO Word8
+byteStringBytes (ByteString.PS fp off len) =
+  UnfoldM $ \ step init ->
+  withForeignPtr fp $ \ ptr ->
+  let
+    endPtr = plusPtr ptr (off + len)
+    iterate !state !ptr = if ptr == endPtr
+      then return state
+      else do
+        x <- peek ptr
+        newState <- step state x
+        iterate newState (plusPtr ptr 1)
+    in iterate init (plusPtr ptr off)
