diff --git a/contiguous.cabal b/contiguous.cabal
--- a/contiguous.cabal
+++ b/contiguous.cabal
@@ -1,6 +1,6 @@
 cabal-version: 2.0
 name: contiguous
-version: 0.6.0
+version: 0.6.1
 homepage: https://github.com/andrewthad/contiguous
 bug-reports: https://github.com/andrewthad/contiguous/issues
 author: Andrew Martin
diff --git a/src/Data/Primitive/Contiguous.hs b/src/Data/Primitive/Contiguous.hs
--- a/src/Data/Primitive/Contiguous.hs
+++ b/src/Data/Primitive/Contiguous.hs
@@ -163,6 +163,7 @@
   , itraverse
   , itraverse_
   , traverseP
+  , itraverseP
   , mapM
   , forM
   , mapM_
@@ -790,6 +791,29 @@
   go 0
   unsafeFreeze marr
 {-# inline traverseP #-}
+
+-- | Map each element of the array to an action, evaluate these
+--   actions from left to right, and collect the results in a
+--   new array.
+itraverseP ::
+     ( PrimMonad m
+     , Contiguous arr1, Element arr1 a
+     , Contiguous arr2, Element arr2 b
+     )
+  => (Int -> a -> m b)
+  -> arr1 a
+  -> m (arr2 b)
+itraverseP f !arr = do
+  let !sz = size arr
+  !marr <- new sz
+  let go !ix = when (ix < sz) $ do
+        a <- indexM arr ix
+        b <- f ix a
+        write marr ix b
+        go (ix + 1)
+  go 0
+  unsafeFreeze marr
+{-# inline itraverseP #-}
 
 newtype STA v a = STA {_runSTA :: forall s. Mutable v s a -> ST s (v a)}
 
