array 0.5.5.0 → 0.5.6.0
raw patch · 8 files changed
+159/−39 lines, 8 filesdep ~basenew-uploaderPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: base
API changes (from Hackage documentation)
+ Data.Array.Base: (!) :: (IArray a e, Ix i) => a i e -> i -> e
+ Data.Array.Base: (!?) :: (IArray a e, Ix i) => a i e -> i -> Maybe e
+ Data.Array.Base: (//) :: (IArray a e, Ix i) => a i e -> [(i, e)] -> a i e
+ Data.Array.Base: STUArray :: !i -> !i -> !Int -> MutableByteArray# s -> STUArray s i e
+ Data.Array.Base: UArray :: !i -> !i -> !Int -> ByteArray# -> UArray i e
+ Data.Array.Base: accum :: (IArray a e, Ix i) => (e -> e' -> e) -> a i e -> [(i, e')] -> a i e
+ Data.Array.Base: accumArray :: (IArray a e, Ix i) => (e -> e' -> e) -> e -> (i, i) -> [(i, e')] -> a i e
+ Data.Array.Base: amap :: (IArray a e', IArray a e, Ix i) => (e' -> e) -> a i e' -> a i e
+ Data.Array.Base: arrEleBottom :: a
+ Data.Array.Base: array :: (IArray a e, Ix i) => (i, i) -> [(i, e)] -> a i e
+ Data.Array.Base: assocs :: (IArray a e, Ix i) => a i e -> [(i, e)]
+ Data.Array.Base: bOOL_BIT :: Int# -> Word#
+ Data.Array.Base: bOOL_INDEX :: Int# -> Int#
+ Data.Array.Base: bOOL_NOT_BIT :: Int# -> Word#
+ Data.Array.Base: bOOL_SCALE :: Int# -> Int#
+ Data.Array.Base: bounds :: (IArray a e, Ix i) => a i e -> (i, i)
+ Data.Array.Base: castSTUArray :: STUArray s ix a -> ST s (STUArray s ix b)
+ Data.Array.Base: class IArray a e
+ Data.Array.Base: class (Monad m) => MArray a e m
+ Data.Array.Base: cmpIntUArray :: (IArray UArray e, Ord e) => UArray Int e -> UArray Int e -> Ordering
+ Data.Array.Base: cmpUArray :: (IArray UArray e, Ix i, Ord e) => UArray i e -> UArray i e -> Ordering
+ Data.Array.Base: dOUBLE_SCALE :: Int# -> Int#
+ Data.Array.Base: data STUArray s i e
+ Data.Array.Base: data UArray i e
+ Data.Array.Base: elems :: (IArray a e, Ix i) => a i e -> [e]
+ Data.Array.Base: eqUArray :: (IArray UArray e, Ix i, Eq e) => UArray i e -> UArray i e -> Bool
+ Data.Array.Base: fLOAT_SCALE :: Int# -> Int#
+ Data.Array.Base: freeze :: (Ix i, MArray a e m, IArray b e) => a i e -> m (b i e)
+ Data.Array.Base: freezeIOArray :: IOArray ix e -> IO (Array ix e)
+ Data.Array.Base: freezeSTUArray :: STUArray s i e -> ST s (UArray i e)
+ Data.Array.Base: genArray :: (IArray a e, Ix i) => (i, i) -> (i -> e) -> a i e
+ Data.Array.Base: getAssocs :: (MArray a e m, Ix i) => a i e -> m [(i, e)]
+ Data.Array.Base: getBounds :: (MArray a e m, Ix i) => a i e -> m (i, i)
+ Data.Array.Base: getElems :: (MArray a e m, Ix i) => a i e -> m [e]
+ Data.Array.Base: getNumElements :: (MArray a e m, Ix i) => a i e -> m Int
+ Data.Array.Base: indices :: (IArray a e, Ix i) => a i e -> [i]
+ Data.Array.Base: instance (GHC.Ix.Ix ix, GHC.Classes.Eq e, Data.Array.Base.IArray Data.Array.Base.UArray e) => GHC.Classes.Eq (Data.Array.Base.UArray ix e)
+ Data.Array.Base: instance (GHC.Ix.Ix ix, GHC.Classes.Ord e, Data.Array.Base.IArray Data.Array.Base.UArray e) => GHC.Classes.Ord (Data.Array.Base.UArray ix e)
+ Data.Array.Base: instance (GHC.Ix.Ix ix, GHC.Read.Read ix, GHC.Read.Read e, Data.Array.Base.IArray Data.Array.Base.UArray e) => GHC.Read.Read (Data.Array.Base.UArray ix e)
+ Data.Array.Base: instance (GHC.Ix.Ix ix, GHC.Show.Show ix, GHC.Show.Show e, Data.Array.Base.IArray Data.Array.Base.UArray e) => GHC.Show.Show (Data.Array.Base.UArray ix e)
+ Data.Array.Base: instance Data.Array.Base.IArray Data.Array.Base.UArray (GHC.Ptr.FunPtr a)
+ Data.Array.Base: instance Data.Array.Base.IArray Data.Array.Base.UArray (GHC.Ptr.Ptr a)
+ Data.Array.Base: instance Data.Array.Base.IArray Data.Array.Base.UArray (GHC.Stable.StablePtr a)
+ Data.Array.Base: instance Data.Array.Base.IArray Data.Array.Base.UArray GHC.Int.Int16
+ Data.Array.Base: instance Data.Array.Base.IArray Data.Array.Base.UArray GHC.Int.Int32
+ Data.Array.Base: instance Data.Array.Base.IArray Data.Array.Base.UArray GHC.Int.Int64
+ Data.Array.Base: instance Data.Array.Base.IArray Data.Array.Base.UArray GHC.Int.Int8
+ Data.Array.Base: instance Data.Array.Base.IArray Data.Array.Base.UArray GHC.Types.Bool
+ Data.Array.Base: instance Data.Array.Base.IArray Data.Array.Base.UArray GHC.Types.Char
+ Data.Array.Base: instance Data.Array.Base.IArray Data.Array.Base.UArray GHC.Types.Double
+ Data.Array.Base: instance Data.Array.Base.IArray Data.Array.Base.UArray GHC.Types.Float
+ Data.Array.Base: instance Data.Array.Base.IArray Data.Array.Base.UArray GHC.Types.Int
+ Data.Array.Base: instance Data.Array.Base.IArray Data.Array.Base.UArray GHC.Types.Word
+ Data.Array.Base: instance Data.Array.Base.IArray Data.Array.Base.UArray GHC.Word.Word16
+ Data.Array.Base: instance Data.Array.Base.IArray Data.Array.Base.UArray GHC.Word.Word32
+ Data.Array.Base: instance Data.Array.Base.IArray Data.Array.Base.UArray GHC.Word.Word64
+ Data.Array.Base: instance Data.Array.Base.IArray Data.Array.Base.UArray GHC.Word.Word8
+ Data.Array.Base: instance Data.Array.Base.IArray GHC.Arr.Array e
+ Data.Array.Base: instance Data.Array.Base.MArray (Data.Array.Base.STUArray s) (GHC.Ptr.FunPtr a) (GHC.ST.ST s)
+ Data.Array.Base: instance Data.Array.Base.MArray (Data.Array.Base.STUArray s) (GHC.Ptr.Ptr a) (GHC.ST.ST s)
+ Data.Array.Base: instance Data.Array.Base.MArray (Data.Array.Base.STUArray s) (GHC.Stable.StablePtr a) (GHC.ST.ST s)
+ Data.Array.Base: instance Data.Array.Base.MArray (Data.Array.Base.STUArray s) GHC.Int.Int16 (GHC.ST.ST s)
+ Data.Array.Base: instance Data.Array.Base.MArray (Data.Array.Base.STUArray s) GHC.Int.Int32 (GHC.ST.ST s)
+ Data.Array.Base: instance Data.Array.Base.MArray (Data.Array.Base.STUArray s) GHC.Int.Int64 (GHC.ST.ST s)
+ Data.Array.Base: instance Data.Array.Base.MArray (Data.Array.Base.STUArray s) GHC.Int.Int8 (GHC.ST.ST s)
+ Data.Array.Base: instance Data.Array.Base.MArray (Data.Array.Base.STUArray s) GHC.Types.Bool (GHC.ST.ST s)
+ Data.Array.Base: instance Data.Array.Base.MArray (Data.Array.Base.STUArray s) GHC.Types.Char (GHC.ST.ST s)
+ Data.Array.Base: instance Data.Array.Base.MArray (Data.Array.Base.STUArray s) GHC.Types.Double (GHC.ST.ST s)
+ Data.Array.Base: instance Data.Array.Base.MArray (Data.Array.Base.STUArray s) GHC.Types.Float (GHC.ST.ST s)
+ Data.Array.Base: instance Data.Array.Base.MArray (Data.Array.Base.STUArray s) GHC.Types.Int (GHC.ST.ST s)
+ Data.Array.Base: instance Data.Array.Base.MArray (Data.Array.Base.STUArray s) GHC.Types.Word (GHC.ST.ST s)
+ Data.Array.Base: instance Data.Array.Base.MArray (Data.Array.Base.STUArray s) GHC.Word.Word16 (GHC.ST.ST s)
+ Data.Array.Base: instance Data.Array.Base.MArray (Data.Array.Base.STUArray s) GHC.Word.Word32 (GHC.ST.ST s)
+ Data.Array.Base: instance Data.Array.Base.MArray (Data.Array.Base.STUArray s) GHC.Word.Word64 (GHC.ST.ST s)
+ Data.Array.Base: instance Data.Array.Base.MArray (Data.Array.Base.STUArray s) GHC.Word.Word8 (GHC.ST.ST s)
+ Data.Array.Base: instance Data.Array.Base.MArray (GHC.Arr.STArray s) e (Control.Monad.ST.Lazy.Imp.ST s)
+ Data.Array.Base: instance Data.Array.Base.MArray (GHC.Arr.STArray s) e (GHC.ST.ST s)
+ Data.Array.Base: instance Data.Array.Base.MArray GHC.IOArray.IOArray e GHC.Types.IO
+ Data.Array.Base: instance GHC.Classes.Eq (Data.Array.Base.STUArray s i e)
+ Data.Array.Base: ixmap :: (IArray a e, Ix i, Ix j) => (i, i) -> (i -> j) -> a j e -> a i e
+ Data.Array.Base: listArray :: (IArray a e, Ix i) => (i, i) -> [e] -> a i e
+ Data.Array.Base: listArrayST :: Ix i => (i, i) -> [e] -> ST s (STArray s i e)
+ Data.Array.Base: listUArrayST :: (MArray (STUArray s) e (ST s), Ix i) => (i, i) -> [e] -> ST s (STUArray s i e)
+ Data.Array.Base: mapArray :: (MArray a e' m, MArray a e m, Ix i) => (e' -> e) -> a i e' -> m (a i e)
+ Data.Array.Base: mapIndices :: (MArray a e m, Ix i, Ix j) => (i, i) -> (i -> j) -> a j e -> m (a i e)
+ Data.Array.Base: memcpy_freeze :: MutableByteArray# s -> MutableByteArray# s -> CSize -> IO (Ptr a)
+ Data.Array.Base: memcpy_thaw :: MutableByteArray# s -> ByteArray# -> CSize -> IO (Ptr a)
+ Data.Array.Base: modifyArray :: (MArray a e m, Ix i) => a i e -> i -> (e -> e) -> m ()
+ Data.Array.Base: modifyArray' :: (MArray a e m, Ix i) => a i e -> i -> (e -> e) -> m ()
+ Data.Array.Base: newArray :: (MArray a e m, Ix i) => (i, i) -> e -> m (a i e)
+ Data.Array.Base: newArray_ :: (MArray a e m, Ix i) => (i, i) -> m (a i e)
+ Data.Array.Base: newGenArray :: (MArray a e m, Ix i) => (i, i) -> (i -> m e) -> m (a i e)
+ Data.Array.Base: newListArray :: (MArray a e m, Ix i) => (i, i) -> [e] -> m (a i e)
+ Data.Array.Base: nullStablePtr :: StablePtr a
+ Data.Array.Base: numElements :: (IArray a e, Ix i) => a i e -> Int
+ Data.Array.Base: readArray :: (MArray a e m, Ix i) => a i e -> i -> m e
+ Data.Array.Base: readIArray :: (IArray a e, Ix i, Read i, Read e) => ReadPrec (a i e)
+ Data.Array.Base: safeIndex :: Ix i => (i, i) -> Int -> i -> Int
+ Data.Array.Base: safeRangeSize :: Ix i => (i, i) -> Int
+ Data.Array.Base: safe_scale :: Int# -> Int# -> Int#
+ Data.Array.Base: showsIArray :: (IArray a e, Ix i, Show i, Show e) => Int -> a i e -> ShowS
+ Data.Array.Base: thaw :: (Ix i, IArray a e, MArray b e m) => a i e -> m (b i e)
+ Data.Array.Base: thawIOArray :: Array ix e -> IO (IOArray ix e)
+ Data.Array.Base: thawSTUArray :: UArray i e -> ST s (STUArray s i e)
+ Data.Array.Base: type ListUArray e = forall i. Ix i => (i, i) -> [e] -> UArray i e
+ Data.Array.Base: unsafeAccum :: (IArray a e, Ix i) => (e -> e' -> e) -> a i e -> [(Int, e')] -> a i e
+ Data.Array.Base: unsafeAccumArray :: (IArray a e, Ix i) => (e -> e' -> e) -> e -> (i, i) -> [(Int, e')] -> a i e
+ Data.Array.Base: unsafeAccumArrayST :: Ix i => (e -> e' -> e) -> e -> (i, i) -> [(Int, e')] -> ST s (STArray s i e)
+ Data.Array.Base: unsafeAccumArrayUArray :: (MArray (STUArray s) e (ST s), Ix i) => (e -> e' -> e) -> e -> (i, i) -> [(Int, e')] -> ST s (UArray i e)
+ Data.Array.Base: unsafeAccumST :: (IArray a e, Ix i) => (e -> e' -> e) -> a i e -> [(Int, e')] -> ST s (STArray s i e)
+ Data.Array.Base: unsafeAccumUArray :: (MArray (STUArray s) e (ST s), Ix i) => (e -> e' -> e) -> UArray i e -> [(Int, e')] -> ST s (UArray i e)
+ Data.Array.Base: unsafeArray :: (IArray a e, Ix i) => (i, i) -> [(Int, e)] -> a i e
+ Data.Array.Base: unsafeArrayUArray :: (MArray (STUArray s) e (ST s), Ix i) => (i, i) -> [(Int, e)] -> e -> ST s (UArray i e)
+ Data.Array.Base: unsafeAt :: (IArray a e, Ix i) => a i e -> Int -> e
+ Data.Array.Base: unsafeFreeze :: (Ix i, MArray a e m, IArray b e) => a i e -> m (b i e)
+ Data.Array.Base: unsafeFreezeIOArray :: IOArray ix e -> IO (Array ix e)
+ Data.Array.Base: unsafeFreezeSTUArray :: STUArray s i e -> ST s (UArray i e)
+ Data.Array.Base: unsafeNewArraySTUArray_ :: Ix i => (i, i) -> (Int# -> Int#) -> ST s (STUArray s i e)
+ Data.Array.Base: unsafeNewArray_ :: (MArray a e m, Ix i) => (i, i) -> m (a i e)
+ Data.Array.Base: unsafeRead :: (MArray a e m, Ix i) => a i e -> Int -> m e
+ Data.Array.Base: unsafeReplace :: (IArray a e, Ix i) => a i e -> [(Int, e)] -> a i e
+ Data.Array.Base: unsafeReplaceST :: (IArray a e, Ix i) => a i e -> [(Int, e)] -> ST s (STArray s i e)
+ Data.Array.Base: unsafeReplaceUArray :: (MArray (STUArray s) e (ST s), Ix i) => UArray i e -> [(Int, e)] -> ST s (UArray i e)
+ Data.Array.Base: unsafeThaw :: (Ix i, IArray a e, MArray b e m) => a i e -> m (b i e)
+ Data.Array.Base: unsafeThawIOArray :: Array ix e -> IO (IOArray ix e)
+ Data.Array.Base: unsafeThawSTUArray :: UArray i e -> ST s (STUArray s i e)
+ Data.Array.Base: unsafeWrite :: (MArray a e m, Ix i) => a i e -> Int -> e -> m ()
+ Data.Array.Base: wORD_SCALE :: Int# -> Int#
+ Data.Array.Base: writeArray :: (MArray a e m, Ix i) => a i e -> i -> e -> m ()
+ Data.Array.IArray: (!?) :: (IArray a e, Ix i) => a i e -> i -> Maybe e
+ Data.Array.IArray: genArray :: (IArray a e, Ix i) => (i, i) -> (i -> e) -> a i e
+ Data.Array.IO.Internals: IOArray :: STArray RealWorld i e -> IOArray i e
+ Data.Array.IO.Internals: IOUArray :: STUArray RealWorld i e -> IOUArray i e
+ Data.Array.IO.Internals: castIOUArray :: IOUArray ix a -> IO (IOUArray ix b)
+ Data.Array.IO.Internals: instance Data.Array.Base.MArray Data.Array.IO.Internals.IOUArray (GHC.Ptr.FunPtr a) GHC.Types.IO
+ Data.Array.IO.Internals: instance Data.Array.Base.MArray Data.Array.IO.Internals.IOUArray (GHC.Ptr.Ptr a) GHC.Types.IO
+ Data.Array.IO.Internals: instance Data.Array.Base.MArray Data.Array.IO.Internals.IOUArray (GHC.Stable.StablePtr a) GHC.Types.IO
+ Data.Array.IO.Internals: instance Data.Array.Base.MArray Data.Array.IO.Internals.IOUArray GHC.Int.Int16 GHC.Types.IO
+ Data.Array.IO.Internals: instance Data.Array.Base.MArray Data.Array.IO.Internals.IOUArray GHC.Int.Int32 GHC.Types.IO
+ Data.Array.IO.Internals: instance Data.Array.Base.MArray Data.Array.IO.Internals.IOUArray GHC.Int.Int64 GHC.Types.IO
+ Data.Array.IO.Internals: instance Data.Array.Base.MArray Data.Array.IO.Internals.IOUArray GHC.Int.Int8 GHC.Types.IO
+ Data.Array.IO.Internals: instance Data.Array.Base.MArray Data.Array.IO.Internals.IOUArray GHC.Types.Bool GHC.Types.IO
+ Data.Array.IO.Internals: instance Data.Array.Base.MArray Data.Array.IO.Internals.IOUArray GHC.Types.Char GHC.Types.IO
+ Data.Array.IO.Internals: instance Data.Array.Base.MArray Data.Array.IO.Internals.IOUArray GHC.Types.Double GHC.Types.IO
+ Data.Array.IO.Internals: instance Data.Array.Base.MArray Data.Array.IO.Internals.IOUArray GHC.Types.Float GHC.Types.IO
+ Data.Array.IO.Internals: instance Data.Array.Base.MArray Data.Array.IO.Internals.IOUArray GHC.Types.Int GHC.Types.IO
+ Data.Array.IO.Internals: instance Data.Array.Base.MArray Data.Array.IO.Internals.IOUArray GHC.Types.Word GHC.Types.IO
+ Data.Array.IO.Internals: instance Data.Array.Base.MArray Data.Array.IO.Internals.IOUArray GHC.Word.Word16 GHC.Types.IO
+ Data.Array.IO.Internals: instance Data.Array.Base.MArray Data.Array.IO.Internals.IOUArray GHC.Word.Word32 GHC.Types.IO
+ Data.Array.IO.Internals: instance Data.Array.Base.MArray Data.Array.IO.Internals.IOUArray GHC.Word.Word64 GHC.Types.IO
+ Data.Array.IO.Internals: instance Data.Array.Base.MArray Data.Array.IO.Internals.IOUArray GHC.Word.Word8 GHC.Types.IO
+ Data.Array.IO.Internals: instance GHC.Classes.Eq (Data.Array.IO.Internals.IOUArray i e)
+ Data.Array.IO.Internals: newtype IOArray i e
+ Data.Array.IO.Internals: newtype IOUArray i e
+ Data.Array.IO.Internals: unsafeFreezeIOUArray :: IOUArray ix e -> IO (UArray ix e)
+ Data.Array.IO.Internals: unsafeThawIOUArray :: UArray ix e -> IO (IOUArray ix e)
+ Data.Array.MArray: modifyArray :: (MArray a e m, Ix i) => a i e -> i -> (e -> e) -> m ()
+ Data.Array.MArray: modifyArray' :: (MArray a e m, Ix i) => a i e -> i -> (e -> e) -> m ()
+ Data.Array.MArray: newGenArray :: (MArray a e m, Ix i) => (i, i) -> (i -> m e) -> m (a i e)
+ Data.Array.MArray.Safe: newGenArray :: (MArray a e m, Ix i) => (i, i) -> (i -> m e) -> m (a i e)
+ Data.Array.Storable.Internals: StorableArray :: !i -> !i -> Int -> !ForeignPtr e -> StorableArray i e
+ Data.Array.Storable.Internals: data StorableArray i e
+ Data.Array.Storable.Internals: instance Foreign.Storable.Storable e => Data.Array.Base.MArray Data.Array.Storable.Internals.StorableArray e GHC.Types.IO
+ Data.Array.Storable.Internals: touchStorableArray :: StorableArray i e -> IO ()
+ Data.Array.Storable.Internals: unsafeForeignPtrToStorableArray :: Ix i => ForeignPtr e -> (i, i) -> IO (StorableArray i e)
+ Data.Array.Storable.Internals: withStorableArray :: StorableArray i e -> (Ptr e -> IO a) -> IO a
Files
- Data/Array/Base.hs +102/−35
- Data/Array/IArray.hs +2/−0
- Data/Array/IO/Internals.hs +13/−1
- Data/Array/MArray.hs +3/−0
- Data/Array/MArray/Safe.hs +1/−0
- Data/Array/Storable/Internals.hs +13/−1
- array.cabal +2/−2
- changelog.md +23/−0
Data/Array/Base.hs view
@@ -10,7 +10,7 @@ , UnliftedFFITypes , RoleAnnotations #-}-{-# OPTIONS_HADDOCK hide #-}+{-# OPTIONS_HADDOCK not-home #-} ----------------------------------------------------------------------------- -- |@@ -25,13 +25,24 @@ -- Basis for IArray and MArray. Not intended for external consumption; -- use IArray or MArray instead. --+-- = WARNING+--+-- This module is considered __internal__.+--+-- The Package Versioning Policy __does not apply__.+--+-- The contents of this module may change __in any way whatsoever__+-- and __without any warning__ between minor versions of this package.+--+-- Authors importing this module are expected to track development+-- closely. ----------------------------------------------------------------------------- module Data.Array.Base where import Control.Monad.ST.Lazy ( strictToLazyST ) import qualified Control.Monad.ST.Lazy as Lazy (ST)-import Data.Ix ( Ix, range, index, rangeSize )+import Data.Ix ( Ix, range, index, inRange, rangeSize ) import Foreign.C.Types import Foreign.StablePtr @@ -39,6 +50,7 @@ import GHC.Arr ( STArray ) import qualified GHC.Arr as Arr import qualified GHC.Arr as ArrST+import GHC.Ix ( unsafeIndex ) import GHC.ST ( ST(..), runST ) import GHC.Base ( IO(..), divInt# ) import GHC.Exts@@ -183,35 +195,24 @@ let n = safeRangeSize (l,u) in unsafeArray (l,u) (zip [0 .. n - 1] es) -{-# INLINE listArrayST #-}+{-# INLINE genArray #-}+-- | Constructs an immutable array using a generator function.+genArray :: (IArray a e, Ix i) => (i,i) -> (i -> e) -> a i e+genArray (l,u) f = listArray (l,u) $ map f $ range (l,u)++{-# INLINE listArrayST #-} -- See Note [Inlining and fusion] listArrayST :: Ix i => (i,i) -> [e] -> ST s (STArray s i e)-listArrayST (l,u) es = do- marr <- newArray_ (l,u)- let n = safeRangeSize (l,u)- let fillFromList i xs | i == n = return ()- | otherwise = case xs of- [] -> return ()- y:ys -> unsafeWrite marr i y >> fillFromList (i+1) ys- fillFromList 0 es- return marr+listArrayST = newListArray {-# RULES "listArray/Array" listArray = \lu es -> runST (listArrayST lu es >>= ArrST.unsafeFreezeSTArray) #-} -{-# INLINE listUArrayST #-}+{-# INLINE listUArrayST #-} -- See Note [Inlining and fusion] listUArrayST :: (MArray (STUArray s) e (ST s), Ix i) => (i,i) -> [e] -> ST s (STUArray s i e)-listUArrayST (l,u) es = do- marr <- newArray_ (l,u)- let n = safeRangeSize (l,u)- let fillFromList i xs | i == n = return ()- | otherwise = case xs of- [] -> return ()- y:ys -> unsafeWrite marr i y >> fillFromList (i+1) ys- fillFromList 0 es- return marr+listUArrayST = newListArray -- I don't know how to write a single rule for listUArrayST, because -- the type looks like constrained over 's', which runST doesn't@@ -272,11 +273,21 @@ #-} {-# INLINE (!) #-}--- | Returns the element of an immutable array at the specified index.+-- | Returns the element of an immutable array at the specified index,+-- or throws an exception if the index is out of bounds. (!) :: (IArray a e, Ix i) => a i e -> i -> e (!) arr i = case bounds arr of (l,u) -> unsafeAt arr $ safeIndex (l,u) (numElements arr) i +{-# INLINE (!?) #-}+-- | Returns 'Just' the element of an immutable array at the specified index,+-- or 'Nothing' if the index is out of bounds.+(!?) :: (IArray a e, Ix i) => a i e -> i -> Maybe e+(!?) arr i = let b = bounds arr in+ if inRange b i+ then Just $ unsafeAt arr $ unsafeIndex b i+ else Nothing+ {-# INLINE indices #-} -- | Returns a list of all the valid indices in an array. indices :: (IArray a e, Ix i) => a i e -> [i]@@ -824,23 +835,27 @@ -} class (Monad m) => MArray a e m where - -- | Returns the bounds of the array+ -- | Returns the bounds of the array (lowest,highest) getBounds :: Ix i => a i e -> m (i,i) -- | Returns the number of elements in the array getNumElements :: Ix i => a i e -> m Int -- | Builds a new array, with every element initialised to the supplied- -- value.+ -- value. The first and second element of the tuple specifies the lowest+ -- and highest index, respectively. newArray :: Ix i => (i,i) -> e -> m (a i e) -- | Builds a new array, with every element initialised to an -- undefined value. In a monadic context in which operations must -- be deterministic (e.g. the ST monad), the array elements are -- initialised to a fixed but undefined value, such as zero.+ -- The first and second element of the tuple specifies the lowest+ -- and highest index, respectively. newArray_ :: Ix i => (i,i) -> m (a i e) -- | Builds a new array, with every element initialised to an undefined- -- value.+ -- value. The first and second element of the tuple specifies the lowest+ -- and highest index, respectively. unsafeNewArray_ :: Ix i => (i,i) -> m (a i e) unsafeRead :: Ix i => a i e -> Int -> m e@@ -886,21 +901,31 @@ unsafeRead = unsafeReadIOArray unsafeWrite = unsafeWriteIOArray -{-# INLINE newListArray #-}+{-# INLINE newListArray #-} -- See Note [Inlining and fusion] -- | Constructs a mutable array from a list of initial elements. -- The list gives the elements of the array in ascending order--- beginning with the lowest index.+-- beginning with the lowest index. The first and second element+-- of the tuple specifies the lowest and highest index, respectively. newListArray :: (MArray a e m, Ix i) => (i,i) -> [e] -> m (a i e) newListArray (l,u) es = do marr <- newArray_ (l,u) let n = safeRangeSize (l,u)- let fillFromList i xs | i == n = return ()- | otherwise = case xs of- [] -> return ()- y:ys -> unsafeWrite marr i y >> fillFromList (i+1) ys- fillFromList 0 es+ f x k i+ | i == n = return ()+ | otherwise = unsafeWrite marr i x >> k (i+1)+ foldr f (const (return ())) es 0 return marr +{-# INLINE newGenArray #-}+-- | 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@@ -917,6 +942,31 @@ 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]@@ -1349,8 +1399,15 @@ bOOL_SCALE, wORD_SCALE, dOUBLE_SCALE, fLOAT_SCALE :: Int# -> Int# bOOL_SCALE n# =- -- + 7 to handle case where n is not divisible by 8- (n# +# 7#) `uncheckedIShiftRA#` 3#+ -- Round the number of bits up to the next whole-word-aligned number+ -- of bytes to avoid ghc#23132; the addition can signed-overflow but+ -- that's OK because it will not unsigned-overflow and the logical+ -- right-shift brings us back in-bounds+#if SIZEOF_HSWORD == 4+ ((n# +# 31#) `uncheckedIShiftRL#` 5#) `uncheckedIShiftL#` 2#+#elif SIZEOF_HSWORD == 8+ ((n# +# 63#) `uncheckedIShiftRL#` 6#) `uncheckedIShiftL#` 3#+#endif wORD_SCALE n# = safe_scale scale# n# where !(I# scale#) = SIZEOF_HSWORD dOUBLE_SCALE n# = safe_scale scale# n# where !(I# scale#) = SIZEOF_HSDOUBLE fLOAT_SCALE n# = safe_scale scale# n# where !(I# scale#) = SIZEOF_HSFLOAT@@ -1580,3 +1637,13 @@ castSTUArray :: STUArray s ix a -> ST s (STUArray s ix b) castSTUArray (STUArray l u n marr#) = return (STUArray l u n marr#)++--------------------------------------------------------------------------------++-- Note [Inlining and fusion]+-- ~~~~~~~~~~~~~~~~~~~~~~~~~~+-- Many functions in this module are marked INLINE because they consume their+-- input with `foldr`. By inlining them, it is possible that the `foldr` will+-- meet a `build` from the call site, and beneficial fusion will take place.+-- That is, they become "good consumers". See array issue #8 for data showing+-- the perf improvement that comes with fusion.
Data/Array/IArray.hs view
@@ -29,9 +29,11 @@ array, -- :: (IArray a e, Ix i) => (i,i) -> [(i, e)] -> a i e listArray, -- :: (IArray a e, Ix i) => (i,i) -> [e] -> a i e accumArray, -- :: (IArray a e, Ix i) => (e -> e' -> e) -> e -> (i,i) -> [(i, e')] -> a i e+ genArray, -- :: (IArray a e, Ix i) => (i,i) -> (i -> e) -> a i e -- * Accessing arrays (!), -- :: (IArray a e, Ix i) => a i e -> i -> e+ (!?), -- :: (IArray a e, Ix i) => a i e -> i -> Maybe e bounds, -- :: (HasBounds a, Ix i) => a i e -> (i,i) indices, -- :: (HasBounds a, Ix i) => a i e -> [i] elems, -- :: (IArray a e, Ix i) => a i e -> [e]
Data/Array/IO/Internals.hs view
@@ -4,7 +4,7 @@ , RoleAnnotations #-} -{-# OPTIONS_HADDOCK hide #-}+{-# OPTIONS_HADDOCK not-home #-} ----------------------------------------------------------------------------- -- | -- Module : Data.Array.IO.Internal@@ -16,6 +16,18 @@ -- Portability : non-portable (uses Data.Array.Base) -- -- Mutable boxed and unboxed arrays in the IO monad.+--+-- = WARNING+--+-- This module is considered __internal__.+--+-- The Package Versioning Policy __does not apply__.+--+-- The contents of this module may change __in any way whatsoever__+-- and __without any warning__ between minor versions of this package.+--+-- Authors importing this module are expected to track development+-- closely. -- -----------------------------------------------------------------------------
Data/Array/MArray.hs view
@@ -27,10 +27,13 @@ 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 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)
Data/Array/MArray/Safe.hs view
@@ -29,6 +29,7 @@ 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
Data/Array/Storable/Internals.hs view
@@ -1,5 +1,5 @@ {-# LANGUAGE FlexibleInstances, MultiParamTypeClasses, RoleAnnotations #-}-{-# OPTIONS_HADDOCK hide #-}+{-# OPTIONS_HADDOCK not-home #-} ----------------------------------------------------------------------------- -- | -- Module : Data.Array.Storable.Internals@@ -13,6 +13,18 @@ -- Actual implementation of "Data.Array.Storable". -- -- @since 0.4.0.0+--+-- = WARNING+--+-- This module is considered __internal__.+--+-- The Package Versioning Policy __does not apply__.+--+-- The contents of this module may change __in any way whatsoever__+-- and __without any warning__ between minor versions of this package.+--+-- Authors importing this module are expected to track development+-- closely. ----------------------------------------------------------------------------- module Data.Array.Storable.Internals (
array.cabal view
@@ -1,6 +1,6 @@ cabal-version: >= 1.10 name: array-version: 0.5.5.0+version: 0.5.6.0 -- NOTE: Don't forget to update ./changelog.md license: BSD3@@ -36,7 +36,7 @@ Trustworthy, UnboxedTuples, UnliftedFFITypes- build-depends: base >= 4.9 && < 4.19+ build-depends: base >= 4.9 && < 4.20 ghc-options: -Wall exposed-modules: Data.Array
changelog.md view
@@ -1,5 +1,28 @@ # Changelog for [`array` package](http://hackage.haskell.org/package/array) +## 0.5.6.0 *July 2023*++### Changed++ * `listArray` and `newListArray` are now good consumers of the input list+ * Bump base bound to `<4.20`++### Added++ * Add the `genArray` and `newGenArray` function+ * 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`.+ * Add `Data.Array.IArray.(!?)`++### Fixed++ * Array docs regarding constructing arrays+ * Update note [Inlining and fusion]+ * Unboxed Bool arrays no longer cause spurious alarms+ when used with `-fcheck-prim-bounds`+ * Replace Haddock hide pragma with not-home to make the Haddocks more readable+ ## 0.5.5.0 *February 2022* * Compatibility with GHC's new JavaScript backend.