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.9
+  0.6.10
 category:
   Folding
 synopsis:
@@ -48,4 +48,5 @@
     bytestring >=0.10 && <0.11,
     containers >=0.5 && <0.6,
     foldl >=1 && <2,
+    primitive >=0.6.4 && <0.7,
     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
@@ -90,3 +90,8 @@
 -- bytestring
 -------------------------
 import Data.ByteString as Exports (ByteString)
+import Data.ByteString.Short as Exports (ShortByteString)
+
+-- primitive
+-------------------------
+import Data.Primitive as Exports
diff --git a/library/DeferredFolds/Unfold.hs b/library/DeferredFolds/Unfold.hs
--- a/library/DeferredFolds/Unfold.hs
+++ b/library/DeferredFolds/Unfold.hs
@@ -7,6 +7,7 @@
 import qualified Data.Map.Strict as C
 import qualified Data.IntMap.Strict as D
 import qualified Data.ByteString as ByteString
+import qualified Data.ByteString.Short.Internal as ShortByteString
 
 
 {-|
@@ -158,3 +159,11 @@
 {-# INLINE byteStringBytes #-}
 byteStringBytes :: ByteString -> Unfold Word8
 byteStringBytes bs = Unfold (\ step init -> ByteString.foldl' step init bs)
+
+{-# INLINE shortByteStringBytes #-}
+shortByteStringBytes :: ShortByteString -> Unfold Word8
+shortByteStringBytes (ShortByteString.SBS ba#) = primArray (PrimArray ba#)
+
+{-# INLINE primArray #-}
+primArray :: (Prim prim) => PrimArray prim -> Unfold prim
+primArray ba = Unfold $ \f z -> foldlPrimArray' f z ba
diff --git a/library/DeferredFolds/UnfoldM.hs b/library/DeferredFolds/UnfoldM.hs
--- a/library/DeferredFolds/UnfoldM.hs
+++ b/library/DeferredFolds/UnfoldM.hs
@@ -3,8 +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
+import qualified Data.ByteString.Short.Internal as ShortByteString
 
 
 {-|
@@ -152,7 +152,7 @@
 hoist trans1 trans2 (UnfoldM unfold) = UnfoldM $ \ step init -> 
   trans1 (unfold (\ a b -> trans2 (step a b)) init)
 
-{-# INLINE byteStringBytes #-}
+{-# INLINABLE byteStringBytes #-}
 byteStringBytes :: ByteString -> UnfoldM IO Word8
 byteStringBytes (ByteString.PS fp off len) =
   UnfoldM $ \ step init ->
@@ -166,3 +166,11 @@
         newState <- step state x
         iterate newState (plusPtr ptr 1)
     in iterate init (plusPtr ptr off)
+
+{-# INLINE shortByteStringBytes #-}
+shortByteStringBytes :: Monad m => ShortByteString -> UnfoldM m Word8
+shortByteStringBytes (ShortByteString.SBS ba#) = primArray (PrimArray ba#)
+
+{-# INLINE primArray #-}
+primArray :: (Monad m, Prim prim) => PrimArray prim -> UnfoldM m prim
+primArray ba = UnfoldM $ \f z -> foldlPrimArrayM' f z ba
