diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+1.3.4
+
+* Add `prefilter` and `prefilterM`
+
 1.3.3
 
 * Add back the old `vector` as `vectorM`
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# `foldl` v1.3.3
+# `foldl` v1.3.4
 
 Use this `foldl` library when you want to compute multiple folds over a
 collection in one pass over the data without space leaks.
diff --git a/foldl.cabal b/foldl.cabal
--- a/foldl.cabal
+++ b/foldl.cabal
@@ -1,5 +1,5 @@
 Name: foldl
-Version: 1.3.3
+Version: 1.3.4
 Cabal-Version: >=1.8.0.2
 Build-Type: Simple
 License: BSD3
diff --git a/src/Control/Foldl.hs b/src/Control/Foldl.hs
--- a/src/Control/Foldl.hs
+++ b/src/Control/Foldl.hs
@@ -119,6 +119,8 @@
     , _Fold1
     , premap
     , premapM
+    , prefilter
+    , prefilterM
     , Handler
     , handles
     , foldOver
@@ -1122,6 +1124,29 @@
   where
     step' x a = step x (f a)
 {-# INLINABLE premapM #-}
+
+{-| @(prefilter f folder)@ returns a new 'Fold' where the folder's input is used
+  only when the input satisfies a predicate f
+
+  This can also be done with 'handles' (@handles (filtered f)@) but @prefilter@
+  does not need you to depend on a lens library.
+-}
+prefilter :: (a -> Bool) -> Fold a r -> Fold a r
+prefilter f (Fold step begin done) = Fold step' begin done
+  where
+    step' x a = if f a then step x a else x
+{-# INLINABLE prefilter #-}
+
+{-| @(prefilterM f folder)@ returns a new 'Fold' where the folder's input is used
+  only when the input satisfies a monadic predicate f.
+-}
+prefilterM :: (Monad m) => (a -> m Bool) -> FoldM m a r -> FoldM m a r
+prefilterM f (FoldM step begin done) = FoldM step' begin done
+  where
+    step' x a = do
+      use <- f a
+      if use then step x a else return x
+{-# INLINABLE prefilterM #-}
 
 {-| A handler for the upstream input of a `Fold`
 
