diff --git a/deferred-folds.cabal b/deferred-folds.cabal
--- a/deferred-folds.cabal
+++ b/deferred-folds.cabal
@@ -1,43 +1,25 @@
-name:
-  deferred-folds
-version:
-  0.6.11
-category:
-  Folding
-synopsis:
-  Abstractions over deferred folds
-homepage:
-  https://github.com/metrix-ai/deferred-folds 
-bug-reports:
-  https://github.com/metrix-ai/deferred-folds/issues 
-author:
-  Nikita Volkov <nikita.y.volkov@mail.ru>
-maintainer:
-  Metrix.AI Ninjas <ninjas@metrix.ai>
-copyright:
-  (c) 2018, Metrix.AI
-license:
-  MIT
-license-file:
-  LICENSE
-build-type:
-  Simple
-cabal-version:
-  >=1.10
+name: deferred-folds
+version: 0.6.12
+category: Folding
+synopsis: Abstractions over deferred folds
+homepage: https://github.com/metrix-ai/deferred-folds
+bug-reports: https://github.com/metrix-ai/deferred-folds/issues
+author: Nikita Volkov <nikita.y.volkov@mail.ru>
+maintainer: Metrix.AI Tech Team <tech@metrix.ai>
+copyright: (c) 2018, Metrix.AI
+license: MIT
+license-file: LICENSE
+build-type: Simple
+cabal-version: >=1.10
 
 source-repository head
-  type:
-    git
-  location:
-    git://github.com/metrix-ai/deferred-folds.git
+  type: git
+  location: git://github.com/metrix-ai/deferred-folds.git
 
 library
-  hs-source-dirs:
-    library
-  default-extensions:
-    Arrows, BangPatterns, ConstraintKinds, DataKinds, DefaultSignatures, DeriveDataTypeable, DeriveFoldable, DeriveFunctor, DeriveGeneric, DeriveTraversable, EmptyDataDecls, FlexibleContexts, FlexibleInstances, FunctionalDependencies, GADTs, GeneralizedNewtypeDeriving, LambdaCase, LiberalTypeSynonyms, MagicHash, MultiParamTypeClasses, MultiWayIf, NoImplicitPrelude, NoMonomorphismRestriction, OverloadedStrings, PatternGuards, PatternSynonyms, ParallelListComp, QuasiQuotes, RankNTypes, RecordWildCards, ScopedTypeVariables, StandaloneDeriving, TemplateHaskell, TupleSections, TypeFamilies, TypeOperators, UnboxedTuples
-  default-language:
-    Haskell2010
+  hs-source-dirs: library
+  default-extensions: Arrows, BangPatterns, ConstraintKinds, DataKinds, DefaultSignatures, DeriveDataTypeable, DeriveFoldable, DeriveFunctor, DeriveGeneric, DeriveTraversable, EmptyDataDecls, FlexibleContexts, FlexibleInstances, FunctionalDependencies, GADTs, GeneralizedNewtypeDeriving, LambdaCase, LiberalTypeSynonyms, MagicHash, MultiParamTypeClasses, MultiWayIf, NoImplicitPrelude, NoMonomorphismRestriction, OverloadedStrings, PatternGuards, PatternSynonyms, ParallelListComp, QuasiQuotes, RankNTypes, RecordWildCards, ScopedTypeVariables, StandaloneDeriving, TemplateHaskell, TupleSections, TypeFamilies, TypeOperators, UnboxedTuples
+  default-language: Haskell2010
   exposed-modules:
     DeferredFolds.Unfold
     DeferredFolds.UnfoldM
diff --git a/library/DeferredFolds/Unfold.hs b/library/DeferredFolds/Unfold.hs
--- a/library/DeferredFolds/Unfold.hs
+++ b/library/DeferredFolds/Unfold.hs
@@ -152,24 +152,39 @@
         else state
     in loop init from
 
+{-| Associations of a map -}
 {-# INLINE map #-}
 map :: Map key value -> Unfold (key, value)
 map map =
   Unfold (\ step init -> C.foldlWithKey' (\ state key value -> step state (key, value)) init map)
 
+{-| Associations of an intmap -}
 {-# INLINE intMap #-}
 intMap :: IntMap value -> Unfold (Int, value)
 intMap intMap =
   Unfold (\ step init -> D.foldlWithKey' (\ state key value -> step state (key, value)) init intMap)
 
+{-| Bytes of a bytestring -}
 {-# INLINE byteStringBytes #-}
 byteStringBytes :: ByteString -> Unfold Word8
 byteStringBytes bs = Unfold (\ step init -> ByteString.foldl' step init bs)
 
+{-| Bytes of a short bytestring -}
 {-# INLINE shortByteStringBytes #-}
 shortByteStringBytes :: ShortByteString -> Unfold Word8
 shortByteStringBytes (ShortByteString.SBS ba#) = primArray (PrimArray ba#)
 
+{-| Elements of a prim array -}
 {-# INLINE primArray #-}
 primArray :: (Prim prim) => PrimArray prim -> Unfold prim
-primArray ba = Unfold $ \f z -> foldlPrimArray' f z ba
+primArray ba = Unfold $ \ f z -> foldlPrimArray' f z ba
+
+{-| Elements of a prim array coming paired with indices -}
+{-# INLINE primArrayWithIndices #-}
+primArrayWithIndices :: (Prim prim) => PrimArray prim -> Unfold (Int, prim)
+primArrayWithIndices pa = Unfold $ \ step state -> let
+  !size = sizeofPrimArray pa
+  iterate index !state = if index < size
+    then iterate (succ index) (step state (index, indexPrimArray pa index))
+    else state
+  in iterate 0 state
diff --git a/library/DeferredFolds/UnfoldM.hs b/library/DeferredFolds/UnfoldM.hs
--- a/library/DeferredFolds/UnfoldM.hs
+++ b/library/DeferredFolds/UnfoldM.hs
@@ -157,6 +157,7 @@
 hoist trans1 trans2 (UnfoldM unfold) = UnfoldM $ \ step init -> 
   trans1 (unfold (\ a b -> trans2 (step a b)) init)
 
+{-| Bytes of a bytestring -}
 {-# INLINABLE byteStringBytes #-}
 byteStringBytes :: ByteString -> UnfoldM IO Word8
 byteStringBytes (ByteString.PS fp off len) =
@@ -172,10 +173,24 @@
         iterate newState (plusPtr ptr 1)
     in iterate init (plusPtr ptr off)
 
+{-| Bytes of a short bytestring -}
 {-# INLINE shortByteStringBytes #-}
 shortByteStringBytes :: Monad m => ShortByteString -> UnfoldM m Word8
 shortByteStringBytes (ShortByteString.SBS ba#) = primArray (PrimArray ba#)
 
+{-| Elements of a prim array -}
 {-# INLINE primArray #-}
 primArray :: (Monad m, Prim prim) => PrimArray prim -> UnfoldM m prim
-primArray ba = UnfoldM $ \f z -> foldlPrimArrayM' f z ba
+primArray pa = UnfoldM $ \ f z -> foldlPrimArrayM' f z pa
+
+{-| Elements of a prim array coming paired with indices -}
+{-# INLINE primArrayWithIndices #-}
+primArrayWithIndices :: (Monad m, Prim prim) => PrimArray prim -> UnfoldM m (Int, prim)
+primArrayWithIndices pa = UnfoldM $ \ step state -> let
+  !size = sizeofPrimArray pa
+  iterate index !state = if index < size
+    then do
+      newState <- step state (index, indexPrimArray pa index)
+      iterate (succ index) newState
+    else return state
+  in iterate 0 state
