diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,9 @@
 # ChangeLog for conduit
 
+## 1.3.4
+
+* Add `foldWhile` [#453](https://github.com/snoyberg/conduit/issues/453) [#456](https://github.com/snoyberg/conduit/pull/456).
+
 ## 1.3.3
 
 * Add `uncons`, `unconsM`, `unconsEither`, `unconsEitherM`.
diff --git a/conduit.cabal b/conduit.cabal
--- a/conduit.cabal
+++ b/conduit.cabal
@@ -1,5 +1,5 @@
 Name:                conduit
-Version:             1.3.3
+Version:             1.3.4
 Synopsis:            Streaming data processing library.
 description:
     `conduit` is a solution to the streaming data problem, allowing for production,
diff --git a/src/Data/Conduit/Combinators.hs b/src/Data/Conduit/Combinators.hs
--- a/src/Data/Conduit/Combinators.hs
+++ b/src/Data/Conduit/Combinators.hs
@@ -62,6 +62,7 @@
     , foldlE
     , foldMap
     , foldMapE
+    , foldWhile
     , all
     , allE
     , any
@@ -1754,6 +1755,19 @@
         go a = either (return $!) (\(s', b) -> yield b >> loop s') $ f a s
 {-# INLINE mapAccumWhileC #-}
 STREAMING(mapAccumWhile, mapAccumWhileC, mapAccumWhileS, f s)
+
+
+-- | Specialized version of 'mapAccumWhile' that does not provide values downstream.
+--
+-- @since 1.3.4
+foldWhile :: Monad m => (a -> s -> Either e s) -> s -> ConduitT a o m (Either e s)
+foldWhile f = loop
+  where
+    loop !s = await >>= maybe (return $ Right s) go
+      where
+        go a = either (return . Left $!) loop $ f a s
+{-# INLINE foldWhile #-}
+
 
 -- | 'concatMap' with an accumulator.
 --
diff --git a/src/Data/Conduit/Internal/Conduit.hs b/src/Data/Conduit/Internal/Conduit.hs
--- a/src/Data/Conduit/Internal/Conduit.hs
+++ b/src/Data/Conduit/Internal/Conduit.hs
@@ -329,7 +329,7 @@
 
 sourceToPipe :: Monad m => Source m o -> Pipe l i o u m ()
 sourceToPipe =
-    go . flip unConduitT Done
+    go . (`unConduitT` Done)
   where
     go (HaveOutput p o) = HaveOutput (go p) o
     go (NeedInput _ c) = go $ c ()
@@ -339,7 +339,7 @@
 
 sinkToPipe :: Monad m => Sink i m r -> Pipe l i o u m r
 sinkToPipe =
-    go . injectLeftovers . flip unConduitT Done
+    go . injectLeftovers . (`unConduitT` Done)
   where
     go (HaveOutput _ o) = absurd o
     go (NeedInput p c) = NeedInput (go . p) (const $ go $ c ())
@@ -349,7 +349,7 @@
 
 conduitToPipe :: Monad m => Conduit i m o -> Pipe l i o u m ()
 conduitToPipe =
-    go . injectLeftovers . flip unConduitT Done
+    go . injectLeftovers . (`unConduitT` Done)
   where
     go (HaveOutput p o) = HaveOutput (go p) o
     go (NeedInput p c) = NeedInput (go . p) (const $ go $ c ())
@@ -402,7 +402,7 @@
 catchC (ConduitT p0) onErr = ConduitT $ \rest -> let
     go (Done r) = rest r
     go (PipeM mp) = PipeM $ withRunInIO $ \run -> E.catch (run (liftM go mp))
-        (return . flip unConduitT rest . onErr)
+        (return . (`unConduitT`rest) . onErr)
     go (Leftover p i) = Leftover (go p) i
     go (NeedInput x y) = NeedInput (go . x) (go . y)
     go (HaveOutput p o) = HaveOutput (go p) o
@@ -694,7 +694,7 @@
 -- Since 1.2.6
 sourceToList :: Monad m => Source m a -> m [a]
 sourceToList =
-    go . flip unConduitT Done
+    go . (`unConduitT` Done)
   where
     go (Done _) = return []
     go (HaveOutput src x) = liftM (x:) (go src)
