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