diff --git a/impure-containers.cabal b/impure-containers.cabal
--- a/impure-containers.cabal
+++ b/impure-containers.cabal
@@ -1,5 +1,5 @@
 name:                impure-containers
-version:             0.4.1
+version:             0.4.2
 synopsis:            Mutable containers in haskell
 description:         Please see README.md
 homepage:            https://github.com/andrewthad/impure-containers#readme
diff --git a/src/Data/Graph/Immutable.hs b/src/Data/Graph/Immutable.hs
--- a/src/Data/Graph/Immutable.hs
+++ b/src/Data/Graph/Immutable.hs
@@ -16,6 +16,7 @@
   , lookupEdge
   , atVertex
   , mapVertices
+  , mapEdges
   , traverseVertices_
   , traverseEdges_
   , traverseNeighbors_
@@ -80,6 +81,19 @@
 mapVertices :: (Vertex g -> a -> b) -> Graph g e a -> Graph g e b
 mapVertices f (Graph sg) = Graph sg
   { graphVertices = V.imap (coerce f) (graphVertices sg) }
+
+-- | Map of the edges in the graph.
+mapEdges :: (Vertex g -> Vertex g -> e -> d) -> Graph g e v -> Graph g d v
+mapEdges f (Graph (SomeGraph v verts edges)) = Graph $ SomeGraph v verts $ 
+  V.imap
+    ( \outerIx edgeVals ->
+        let vertIxs = V.unsafeIndex verts outerIx
+         in V.imap
+              ( \sourceIx edgeVal -> 
+                  let destIx = U.unsafeIndex vertIxs sourceIx
+                   in f (Vertex sourceIx) (Vertex destIx) edgeVal
+              ) edgeVals
+    ) edges
 
 traverseVertices_ :: Applicative m => (Vertex g -> v -> m a) -> Graph g e v -> m ()
 traverseVertices_ f g = verticesTraverse_ f (vertices g)
