diff --git a/observable-sharing.cabal b/observable-sharing.cabal
--- a/observable-sharing.cabal
+++ b/observable-sharing.cabal
@@ -2,7 +2,7 @@
 -- documentation, see http://haskell.org/cabal/users-guide/
 
 name:                observable-sharing
-version:             0.2.3
+version:             0.2.4
 synopsis:            Simple observable sharing
 -- description:         
 license:             BSD3
diff --git a/src/Data/Ref/Map.hs b/src/Data/Ref/Map.hs
--- a/src/Data/Ref/Map.hs
+++ b/src/Data/Ref/Map.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE GADTs, ScopedTypeVariables #-}
+{-# LANGUAGE GADTs, ScopedTypeVariables, Rank2Types #-}
 
 module Data.Ref.Map (
     Map
@@ -14,6 +14,7 @@
   , insert     -- :: Ref a -> f a -> Map f -> Map f
   , delete     -- :: Name a -> Map f -> Map f
   , adjust     -- :: (f a -> f b) -> Name a -> Map f -> Map f
+  , filter     -- :: (f a -> Bool) -> Map f -> Map f
   , hmap       -- :: (f a -> h a) -> Map f -> Map h
   , union
   , difference
@@ -50,6 +51,8 @@
 
 -- | A reference indexed map.
 --   Useful for associating info with a reference.
+--
+--   Note: this is generally unsound when `f` is a GADT!
 data Map f = Map (IntMap [(HideType Name, HideType f)])
 
 --------------------------------------------------------------------------------
@@ -115,6 +118,13 @@
     open pair@(Hide x, Hide v)
       | x `eqStableName` n = (Hide x, Hide $ f $ unsafeCoerce v)
       | otherwise          = pair
+
+-- | Filters the map for values matching the predicate
+filter :: (forall a. f a -> Bool) -> Map f -> Map f
+filter f (Map m) = Map $ M.filter (unwrap f) m
+  where
+    unwrap :: (forall a. f a -> Bool) -> [(HideType Name, HideType f)] -> Bool
+    unwrap f = and . fmap (\(_, Hide a) -> f a)
 
 --------------------------------------------------------------------------------
 -- ** Traversal
