diff --git a/changelog b/changelog
--- a/changelog
+++ b/changelog
@@ -1,3 +1,8 @@
+0.2.1
+
+* `collapse[N]` and `map[N]` functions.
+*  Generalised `catMaybes` and `mapMaybe`.
+
 0.2.0
 
 * Initial release.
diff --git a/papa-lens-implement.cabal b/papa-lens-implement.cabal
--- a/papa-lens-implement.cabal
+++ b/papa-lens-implement.cabal
@@ -1,5 +1,5 @@
 name:               papa-lens-implement
-version:            0.2.0
+version:            0.2.1
 license:            BSD3
 license-file:       LICENSE
 author:             Tony Morris <ʇǝu˙sıɹɹoɯʇ@ןןǝʞsɐɥ>
@@ -40,6 +40,7 @@
 
   exposed-modules:
                     Papa.Lens.Implement
+                    Papa.Lens.Implement.Data.Collapse
                     Papa.Lens.Implement.Data.List
                     Papa.Lens.Implement.Data.Tuple
                     
diff --git a/src/Papa/Lens/Implement.hs b/src/Papa/Lens/Implement.hs
--- a/src/Papa/Lens/Implement.hs
+++ b/src/Papa/Lens/Implement.hs
@@ -4,5 +4,6 @@
   module P
 ) where
 
+import Papa.Lens.Implement.Data.Collapse as P
 import Papa.Lens.Implement.Data.List as P
 import Papa.Lens.Implement.Data.Tuple as P
diff --git a/src/Papa/Lens/Implement/Data/Collapse.hs b/src/Papa/Lens/Implement/Data/Collapse.hs
new file mode 100644
--- /dev/null
+++ b/src/Papa/Lens/Implement/Data/Collapse.hs
@@ -0,0 +1,95 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+
+module Papa.Lens.Implement.Data.Collapse(
+  collapse0
+, collapse1
+, collapse2
+, map0
+, map1
+, map2
+, mapMaybe
+, catMaybes
+) where
+
+import Control.Category((.))
+import Control.Lens(AsEmpty(_Empty), Cons, cons, Getting, folded, foldrOf, ( # ))
+import Data.Monoid(Endo)
+import Data.Foldable(Foldable(foldr))
+import Data.Functor(Functor(fmap))
+
+collapse0 ::
+ (Cons r r a a, AsEmpty r) =>
+ Getting (Endo r) s a
+ -> s
+ -> r
+collapse0 x =
+  foldrOf x cons (_Empty # ())
+
+collapse1 ::
+  (Cons r r a a, AsEmpty r) =>
+  Getting (Endo r) (Compose f g b) a
+  -> f (g b)
+  -> r
+collapse1 x =
+  collapse0 x . Compose
+
+collapse2 ::
+  (Cons r r a a, AsEmpty r) =>
+  Getting (Endo r) (Compose (Compose f g) h b) a
+  -> f (g (h b))
+  -> r
+collapse2 x =
+  collapse1 x . Compose
+
+map0 ::
+  (Cons r r a a, AsEmpty r, Functor f) =>
+  Getting (Endo r) (f c) a
+  -> (b -> c)
+  -> f b
+  -> r
+map0 x f =
+  collapse0 x . fmap f
+
+map1 ::
+  (Cons r r a a, AsEmpty r, Functor f) =>
+  Getting (Endo r) (Compose f g c) a
+  -> (b -> g c)
+  -> f b
+  -> r
+map1 x f =
+  collapse1 x . fmap f
+
+map2 ::
+  (Cons r r a a, AsEmpty r, Functor f) =>
+  Getting (Endo r) (Compose (Compose f g) h c) a
+  -> (b -> g (h c))
+  -> f b
+  -> r
+map2 x f =
+  collapse2 x . fmap f
+
+----
+
+mapMaybe ::
+  (Cons r r c c, AsEmpty r, Foldable f, Functor f, Foldable g) =>
+  (b -> g c)
+  -> f b
+  -> r
+mapMaybe = 
+  map1 folded
+
+catMaybes ::
+  (Cons r r b b, AsEmpty r, Foldable f, Foldable g) =>
+  f (g b)
+  -> r
+catMaybes =
+  collapse1 folded
+  
+-- not exported
+
+newtype Compose f g a =
+  Compose (f (g a))
+
+instance (Foldable f, Foldable g) => Foldable (Compose f g) where
+  foldr f z (Compose x) =
+    foldr (\a b -> foldr f b a) z x
