diff --git a/library/PrimitiveExtras/IO.hs b/library/PrimitiveExtras/IO.hs
--- a/library/PrimitiveExtras/IO.hs
+++ b/library/PrimitiveExtras/IO.hs
@@ -39,3 +39,31 @@
             loop (succ index)
           else unsafeFreezeArray array
       in loop 0
+
+generatePrimArray :: Prim a => Int -> (Int -> IO a) -> IO (PrimArray a)
+generatePrimArray size elementIO =
+  do
+    array <- newPrimArray size
+    let
+      loop index =
+        if index < size
+          then do
+            element <- elementIO index
+            writePrimArray array index element
+            loop (succ index)
+          else unsafeFreezePrimArray array
+      in loop 0
+
+replicatePrimArray :: Prim a => Int -> IO a -> IO (PrimArray a)
+replicatePrimArray size elementIO =
+  do
+    array <- newPrimArray size
+    let
+      loop index =
+        if index < size
+          then do
+            element <- elementIO
+            writePrimArray array index element
+            loop (succ index)
+          else unsafeFreezePrimArray array
+      in loop 0
diff --git a/primitive-extras.cabal b/primitive-extras.cabal
--- a/primitive-extras.cabal
+++ b/primitive-extras.cabal
@@ -1,7 +1,7 @@
 name:
   primitive-extras
 version:
-  0.1.3.1
+  0.1.4
 category:
   Primitive
 synopsis:
