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.2
+  0.6.3
 category:
   Folding
 synopsis:
diff --git a/library/DeferredFolds/UnfoldM.hs b/library/DeferredFolds/UnfoldM.hs
--- a/library/DeferredFolds/UnfoldM.hs
+++ b/library/DeferredFolds/UnfoldM.hs
@@ -65,10 +65,12 @@
 foldlM' step init (UnfoldM run) =
   run step init
 
+{-| A more efficient implementation of mapM_ -}
 {-# INLINE mapM_ #-}
 mapM_ :: Monad m => (input -> m ()) -> UnfoldM m input -> m ()
 mapM_ step = foldlM' (const step) ()
 
+{-| Same as 'mapM_' with arguments flipped -}
 {-# INLINE forM_ #-}
 forM_ :: Monad m => UnfoldM m input -> (input -> m ()) -> m ()
 forM_ = flip mapM_
@@ -91,6 +93,16 @@
 {-# INLINE foldable #-}
 foldable :: (Monad m, Foldable foldable) => foldable a -> UnfoldM m a
 foldable foldable = UnfoldM (\ step init -> A.foldlM step init foldable)
+
+{-| Construct from a specification of how to execute a left-fold -}
+{-# INLINE foldlRunner #-}
+foldlRunner :: Monad m => (forall x. (x -> a -> x) -> x -> x) -> UnfoldM m a
+foldlRunner run = UnfoldM (\ stepM state -> run (\ stateM a -> stateM >>= \state -> stepM state a) (return state))
+
+{-| Construct from a specification of how to execute a right-fold -}
+{-# INLINE foldrRunner #-}
+foldrRunner :: Monad m => (forall x. (a -> x -> x) -> x -> x) -> UnfoldM m a
+foldrRunner run = UnfoldM (\ stepM -> run (\ x k z -> stepM z x >>= k) return)
 
 {-| Filter -}
 {-# INLINE filter #-}
