packages feed

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 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.