diff --git a/Data/Array/FI.hs b/Data/Array/FI.hs
--- a/Data/Array/FI.hs
+++ b/Data/Array/FI.hs
@@ -174,3 +174,14 @@
                           s -> go xs (i +# 1#) s
         go _      _ s = case unsafeFreezeByteArray# marr s of (# _, arr #) -> arr)
 {-# inline fromList #-}
+
+{-# inline forIx #-}
+forIx :: forall a. Flat a => Array a -> (Int -> a -> IO ()) -> IO ()
+forIx arr f = go arr 0 (Data.Array.FI.size arr) where
+  go :: Array a -> Int -> Int -> IO ()
+  go arr i len | i == len = pure ()
+  go arr i len = f i (arr ! i) >> go arr (i + 1) len
+
+{-# inline null #-}
+null :: Array a -> Bool
+null (Array arr) = isTrue# (sizeofByteArray# arr ==# 0#)
diff --git a/Data/Array/LI.hs b/Data/Array/LI.hs
--- a/Data/Array/LI.hs
+++ b/Data/Array/LI.hs
@@ -239,3 +239,10 @@
             go _      _ s = case unsafeFreezeArray# marr s of
                               (# _, arr #) -> arr)
 {-# inline fromList #-}
+
+{-# inline forIx #-}
+forIx :: forall a. Array a -> (Int -> a -> IO ()) -> IO ()
+forIx arr f = go arr 0 (Data.Array.LI.size arr) where
+  go :: Array a -> Int -> Int -> IO ()
+  go arr i len | i == len = pure ()
+  go arr i len = f i (arr ! i) >> go arr (i + 1) len
diff --git a/Data/Array/SI.hs b/Data/Array/SI.hs
--- a/Data/Array/SI.hs
+++ b/Data/Array/SI.hs
@@ -239,3 +239,10 @@
             go _      _ s = case unsafeFreezeSmallArray# marr s of
                               (# _, arr #) -> arr)
 {-# inline fromList #-}
+
+{-# inline forIx #-}
+forIx :: forall a. Array a -> (Int -> a -> IO ()) -> IO ()
+forIx arr f = go arr 0 (Data.Array.SI.size arr) where
+  go :: Array a -> Int -> Int -> IO ()
+  go arr i len | i == len = pure ()
+  go arr i len = f i (arr ! i) >> go arr (i + 1) len
diff --git a/Data/Array/UI.hs b/Data/Array/UI.hs
--- a/Data/Array/UI.hs
+++ b/Data/Array/UI.hs
@@ -91,3 +91,14 @@
             go _      _ s = case unsafeFreezeArrayArray# marr s of
                               (# _, arr #) -> arr)
 {-# inline fromList #-}
+
+{-# inline forIx #-}
+forIx :: forall a. Unlifted a => Array a -> (Int -> a -> IO ()) -> IO ()
+forIx arr f = go arr 0 (Data.Array.UI.size arr) where
+  go :: Array a -> Int -> Int -> IO ()
+  go arr i len | i == len = pure ()
+  go arr i len = f i (arr ! i) >> go arr (i + 1) len
+
+{-# inline null #-}
+null :: Array a -> Bool
+null (Array arr) = isTrue# (sizeofArrayArray# arr ==# 0#)
diff --git a/primdata.cabal b/primdata.cabal
--- a/primdata.cabal
+++ b/primdata.cabal
@@ -1,11 +1,11 @@
 cabal-version: 1.12
 
--- This file has been generated from package.yaml by hpack version 0.39.1.
+-- This file has been generated from package.yaml by hpack version 0.39.6.
 --
 -- see: https://github.com/sol/hpack
 
 name:           primdata
-version:        0.1.2.4
+version:        0.1.2.5
 synopsis:       Minimum-overhead primitive datatypes
 category:       primitive
 author:         András Kovács
