diff --git a/Data/Array/Base.hs b/Data/Array/Base.hs index 0cea07178d742c1ad60ec81ac7510e6a48916105..2862125c9e7ff66765ddff66de9369f02abf993e 100644 --- a/Data/Array/Base.hs +++ b/Data/Array/Base.hs @@ -922,6 +922,31 @@ writeArray marr i e = do n <- getNumElements marr unsafeWrite marr (safeIndex (l,u) n i) e +{-# INLINE modifyArray #-} +-- | Modify an element in a mutable array +-- +-- @since FIXME +modifyArray :: (MArray a e m, Ix i) => a i e -> i -> (e -> e) -> m () +modifyArray marr i f = do + (l,u) <- getBounds marr + n <- getNumElements marr + let idx = safeIndex (l,u) n i + x <- unsafeRead marr idx + unsafeWrite marr idx (f x) + +{-# INLINE modifyArray' #-} +-- | Modify an element in a mutable array. Strict in the written element. +-- +-- @since FIXME +modifyArray' :: (MArray a e m, Ix i) => a i e -> i -> (e -> e) -> m () +modifyArray' marr i f = do + (l,u) <- getBounds marr + n <- getNumElements marr + let idx = safeIndex (l,u) n i + x <- unsafeRead marr idx + let !x' = f x + unsafeWrite marr idx x' + {-# INLINE getElems #-} -- | Return a list of all the elements of a mutable array getElems :: (MArray a e m, Ix i) => a i e -> m [e] diff --git a/Data/Array/MArray.hs b/Data/Array/MArray.hs index 7f0f10541fad344ae9b95f6ae9db7badea9d971b..7a89f3951a65f41a3dd03c48fae1291402f3fb0b 100644 --- a/Data/Array/MArray.hs +++ b/Data/Array/MArray.hs @@ -31,6 +31,8 @@ module Data.Array.MArray ( -- * Reading and writing mutable arrays readArray, -- :: (MArray a e m, Ix i) => a i e -> i -> m e writeArray, -- :: (MArray a e m, Ix i) => a i e -> i -> e -> m () + modifyArray, + modifyArray', -- * Derived arrays mapArray, -- :: (MArray a e' m, MArray a e m, Ix i) => (e' -> e) -> a i e' -> m (a i e) diff --git a/changelog.md b/changelog.md index fb51a09181e7234abc45dd0b65d3af63487e488b..d6f11e41fba3d9873c2a02a24e5673ae15b16c2c 100644 --- a/changelog.md +++ b/changelog.md @@ -9,6 +9,10 @@ * Add `Data.Array.IArray.(!?)` + * Add `Data.Array.MArray.modifyArray` and `Data.Array.MArray.modifyArray'`. + These are also exposed from `Data.Array.IO`, `Data.Array.ST`, and + `Data.Array.Storable`. + ## 0.5.5.0 *February 2022* * Compatibility with GHC's new JavaScript backend.