From c9022bbe0451c6239771444a911a2454c918ebdd Mon Sep 17 00:00:00 2001
From: Joachim Breitner <mail@joachim-breitner.de>
Date: Tue, 11 Oct 2022 16:00:23 +0200
Subject: [PATCH] Also add newGenArray

---
 Data/Array/Base.hs        | 9 +++++++++
 Data/Array/MArray.hs      | 1 +
 Data/Array/MArray/Safe.hs | 1 +
 changelog.md              | 2 +-
 4 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/Data/Array/Base.hs b/Data/Array/Base.hs
index f009f4b9..3b843d65 100644
--- a/Data/Array/Base.hs
+++ b/Data/Array/Base.hs
@@ -905,6 +905,15 @@ newListArray (l,u) es = do
     fillFromList 0 es
     return marr
 
+-- | Constructs a mutable array using a generator function.
+-- It invokes the generator function in ascending order of the indices.
+newGenArray :: (MArray a e m, Ix i) => (i,i) -> (i -> m e) -> m (a i e)
+newGenArray (l,u) f = do
+    marr <- newArray_ (l,u)
+    let n = safeRangeSize (l,u)
+    sequence_ [ f i >>= unsafeWrite marr (safeIndex (l,u) n i) | i <- range (l,u)]
+    return marr
+
 {-# INLINE readArray #-}
 -- | Read an element from a mutable array
 readArray :: (MArray a e m, Ix i) => a i e -> i -> m e
diff --git a/Data/Array/MArray.hs b/Data/Array/MArray.hs
index 7f0f1054..c7923da0 100644
--- a/Data/Array/MArray.hs
+++ b/Data/Array/MArray.hs
@@ -27,6 +27,7 @@ module Data.Array.MArray (
     newArray,     -- :: (MArray a e m, Ix i) => (i,i) -> e -> m (a i e)
     newArray_,    -- :: (MArray a e m, Ix i) => (i,i) -> m (a i e)
     newListArray, -- :: (MArray a e m, Ix i) => (i,i) -> [e] -> m (a i e)
+    newGenArray,  -- :: (MArray a e m, Ix i) => (i,i) -> (i -> m e) -> m (a i e)
 
     -- * Reading and writing mutable arrays
     readArray,    -- :: (MArray a e m, Ix i) => a i e -> i -> m e
diff --git a/Data/Array/MArray/Safe.hs b/Data/Array/MArray/Safe.hs
index fcbf768c..be7a62e8 100644
--- a/Data/Array/MArray/Safe.hs
+++ b/Data/Array/MArray/Safe.hs
@@ -29,6 +29,7 @@ module Data.Array.MArray.Safe (
     newArray,     -- :: (MArray a e m, Ix i) => (i,i) -> e -> m (a i e)
     newArray_,    -- :: (MArray a e m, Ix i) => (i,i) -> m (a i e)
     newListArray, -- :: (MArray a e m, Ix i) => (i,i) -> [e] -> m (a i e)
+    newGenArray,  -- :: (MArray a e m, Ix i) => (i,i) -> (i -> m e) -> m (a i e)
 
     -- * Reading and writing mutable arrays
     readArray,    -- :: (MArray a e m, Ix i) => a i e -> i -> m e
diff --git a/changelog.md b/changelog.md
index 61ca9749..fdbaf7d1 100644
--- a/changelog.md
+++ b/changelog.md
@@ -2,7 +2,7 @@
 
 ## 0.5.5.0  *UNRELEASED*
 
-* add the `genArray` function
+* add the `genArray` and `newGenArray` function
 
 ## 0.5.4.0  *July 2019*
 
-- 
GitLab