diff --git a/library/Potoki/Fetch.hs b/library/Potoki/Fetch.hs
--- a/library/Potoki/Fetch.hs
+++ b/library/Potoki/Fetch.hs
@@ -41,6 +41,16 @@
     Just output -> return (just output)
     Nothing -> loop
 
+{-# INLINABLE filter #-}
+filter :: (input -> Bool) -> Fetch input -> Fetch input
+filter predicate (Fetch fetchIO) =
+  Fetch $ \ nil just ->
+  fix $ \ loop ->
+  join $ fetchIO (return nil) $ \ input ->
+  if predicate input
+    then return (just input)
+    else loop
+
 {-# INLINABLE just #-}
 just :: Fetch (Maybe element) -> Fetch element
 just (Fetch fetchIO) =
diff --git a/library/Potoki/Transform.hs b/library/Potoki/Transform.hs
--- a/library/Potoki/Transform.hs
+++ b/library/Potoki/Transform.hs
@@ -9,6 +9,7 @@
   take,
   takeWhile,
   mapFilter,
+  filter,
   just,
   distinct,
   builderChunks,
@@ -26,7 +27,7 @@
 )
 where
 
-import Potoki.Prelude hiding (take, takeWhile)
+import Potoki.Prelude hiding (take, takeWhile, filter)
 import Potoki.Core.Transform
 import qualified Potoki.Fetch as A
 import qualified Potoki.Core.Fetch as A
@@ -47,6 +48,11 @@
 mapFilter :: (input -> Maybe output) -> Transform input output
 mapFilter mapping =
   Transform (pure . A.mapFilter mapping)
+
+{-# INLINE filter #-}
+filter :: (input -> Bool) -> Transform input input
+filter predicate =
+  Transform (pure . A.filter predicate)
 
 {-# INLINE just #-}
 just :: Transform (Maybe input) input
diff --git a/potoki.cabal b/potoki.cabal
--- a/potoki.cabal
+++ b/potoki.cabal
@@ -1,7 +1,7 @@
 name:
   potoki
 version:
-  0.6.3
+  0.6.4
 synopsis:
   Simple streaming in IO
 description:
