{-# LANGUAGE CPP, MagicHash, UnboxedTuples, DeriveDataTypeable, BangPatterns #-}{-# LANGUAGE RankNTypes #-}{-# LANGUAGE TypeFamilies #-}{-# LANGUAGE TemplateHaskellQuotes #-}-- |-- Module : Data.Primitive.Array-- Copyright : (c) Roman Leshchinskiy 2009-2012-- License : BSD-style---- Maintainer : Roman Leshchinskiy <rl@cse.unsw.edu.au>-- Portability : non-portable---- Primitive arrays of boxed values.moduleData.Primitive.Array(Array (..),MutableArray (..),newArray ,readArray ,writeArray ,indexArray ,indexArrayM ,indexArray## ,freezeArray ,thawArray ,runArray ,createArray ,unsafeFreezeArray ,unsafeThawArray ,sameMutableArray ,copyArray ,copyMutableArray ,cloneArray ,cloneMutableArray ,sizeofArray ,sizeofMutableArray ,emptyArray ,fromListN,fromList,arrayFromListN ,arrayFromList ,mapArray' ,traverseArrayP )whereimportControl.DeepSeqimportControl.Monad.Primitive importGHC.Extshiding(toList)importqualifiedGHC.ExtsasExtsimportData.Typeable(Typeable)importData.Data(Data(..),DataType,mkDataType,mkNoRepType,Constr,mkConstr,Fixity(..),constrIndex)importControl.Monad.ST(ST,runST)importControl.ApplicativeimportControl.Monad(MonadPlus(..),when,liftM2)importqualifiedControl.Monad.FailasFailimportControl.Monad.FiximportqualifiedData.FoldableasFoldableimportControl.Monad.ZipimportData.Foldable(Foldable(..),toList)importqualifiedGHC.STasGHCSTimportqualifiedData.FoldableasFimportData.SemigroupimportData.Functor.Identity #if !MIN_VERSION_base(4,10,0) importGHC.Base(runRW#) #endif importText.Read(Read(..),parens,prec)importText.ParserCombinators.ReadPrec(ReadPrec)importqualifiedText.ParserCombinators.ReadPrecasRdPrcimportText.ParserCombinators.ReadPimportData.Functor.Classes(Eq1(..),Ord1(..),Show1(..),Read1(..))importLanguage.Haskell.TH.Syntax(Lift(..))-- | Boxed arrays.dataArray a =Array {forall a. Array a -> Array# a array# ::Array#a }deriving(Typeable)instanceLifta =>Lift(Array a )where #if MIN_VERSION_template_haskell(2,16,0) liftTyped :: forall (m :: * -> *). Quote m => Array a -> Code m (Array a) liftTypedArray a ary =case[a] lst of[]->[||Array(emptyArray#(##))||][a x ]->[||pure$!x||]a x :[a] xs ->[||unsafeArrayFromListN'lenxxs||] #else liftary=caselstof[]->[|Array(emptyArray#(##))|][x]->[|pure$!x|]x:xs->[|unsafeArrayFromListN'lenxxs|] #endif wherelen :: Int len =forall (t :: * -> *) a. Foldable t => t a -> Int lengthArray a ary lst :: [a] lst =forall (t :: * -> *) a. Foldable t => t a -> [a] toListArray a ary -- | Strictly create an array from a nonempty list (represented as-- a first element and a list of the rest) of a known length. If the length-- of the list does not match the given length, this makes demons fly-- out of your nose. We use it in the 'Lift' instance. If you edit the-- splice and break it, you get to keep both pieces.unsafeArrayFromListN' ::Int->a ->[a ]->Array a unsafeArrayFromListN' :: forall a. Int -> a -> [a] -> Array a unsafeArrayFromListN' Int n a y [a] ys =forall a. Int -> a -> (forall s. MutableArray s a -> ST s ()) -> Array a createArray Int n a y forall a b. (a -> b) -> a -> b $\MutableArray s a ma ->letgo :: Int -> [a] -> ST s () go !Int _ix []=forall (m :: * -> *) a. Monad m => a -> m a return()go !Int ix (!a x :[a] xs )=doforall (m :: * -> *) a. PrimMonad m => MutableArray (PrimState m) a -> Int -> a -> m () writeArray MutableArray s a ma Int ix a x Int -> [a] -> ST s () go (Int ix forall a. Num a => a -> a -> a +Int 1)[a] xs inInt -> [a] -> ST s () go Int 1[a] ys #if MIN_VERSION_deepseq(1,4,3) instanceNFData1Array whereliftRnf :: forall a. (a -> ()) -> Array a -> () liftRnfa -> () r =forall (t :: * -> *) b a. Foldable t => (b -> a -> b) -> b -> t a -> b Foldable.foldl'(\() _->a -> () r )() #endif instanceNFDataa =>NFData(Array a )wherernf :: Array a -> () rnf=forall (t :: * -> *) b a. Foldable t => (b -> a -> b) -> b -> t a -> b Foldable.foldl'(\() _->forall a. NFData a => a -> () rnf)()-- | Mutable boxed arrays associated with a primitive state token.dataMutableArray s a =MutableArray {forall s a. MutableArray s a -> MutableArray# s a marray# ::MutableArray#s a }deriving(Typeable)-- | The number of elements in an immutable array.sizeofArray ::Array a ->IntsizeofArray :: forall a. Array a -> Int sizeofArray Array a a =Int# -> Int I#(forall a. Array# a -> Int# sizeofArray#(forall a. Array a -> Array# a array# Array a a )){-# INLINEsizeofArray #-}-- | The number of elements in a mutable array.sizeofMutableArray ::MutableArray s a ->IntsizeofMutableArray :: forall s a. MutableArray s a -> Int sizeofMutableArray MutableArray s a a =Int# -> Int I#(forall d a. MutableArray# d a -> Int# sizeofMutableArray#(forall s a. MutableArray s a -> MutableArray# s a marray# MutableArray s a a )){-# INLINEsizeofMutableArray #-}-- | Create a new mutable array of the specified size and initialise all-- elements with the given value.---- /Note:/ this function does not check if the input is non-negative.newArray ::PrimMonad m =>Int->a ->m (MutableArray (PrimState m )a ){-# INLINEnewArray #-}newArray :: forall (m :: * -> *) a. PrimMonad m => Int -> a -> m (MutableArray (PrimState m) a) newArray (I#Int# n# )a x =forall (m :: * -> *) a. PrimMonad m => (State# (PrimState m) -> (# State# (PrimState m), a #)) -> m a primitive (\State# (PrimState m) s# ->caseforall a d. Int# -> a -> State# d -> (# State# d, MutableArray# d a #) newArray#Int# n# a x State# (PrimState m) s# of(#State# (PrimState m) s'# ,MutableArray# (PrimState m) a arr# #)->letma :: MutableArray (PrimState m) a ma =forall s a. MutableArray# s a -> MutableArray s a MutableArray MutableArray# (PrimState m) a arr# in(#State# (PrimState m) s'# ,MutableArray (PrimState m) a ma #))-- | Read a value from the array at the given index.---- /Note:/ this function does not do bounds checking.readArray ::PrimMonad m =>MutableArray (PrimState m )a ->Int->m a {-# INLINEreadArray #-}readArray :: forall (m :: * -> *) a. PrimMonad m => MutableArray (PrimState m) a -> Int -> m a readArray MutableArray (PrimState m) a arr (I#Int# i# )=forall (m :: * -> *) a. PrimMonad m => (State# (PrimState m) -> (# State# (PrimState m), a #)) -> m a primitive (forall d a. MutableArray# d a -> Int# -> State# d -> (# State# d, a #) readArray#(forall s a. MutableArray s a -> MutableArray# s a marray# MutableArray (PrimState m) a arr )Int# i# )-- | Write a value to the array at the given index.---- /Note:/ this function does not do bounds checking.writeArray ::PrimMonad m =>MutableArray (PrimState m )a ->Int->a ->m (){-# INLINEwriteArray #-}writeArray :: forall (m :: * -> *) a. PrimMonad m => MutableArray (PrimState m) a -> Int -> a -> m () writeArray MutableArray (PrimState m) a arr (I#Int# i# )a x =forall (m :: * -> *). PrimMonad m => (State# (PrimState m) -> State# (PrimState m)) -> m () primitive_ (forall d a. MutableArray# d a -> Int# -> a -> State# d -> State# d writeArray#(forall s a. MutableArray s a -> MutableArray# s a marray# MutableArray (PrimState m) a arr )Int# i# a x )-- | Read a value from the immutable array at the given index.---- /Note:/ this function does not do bounds checking.indexArray ::Array a ->Int->a {-# INLINEindexArray #-}indexArray :: forall a. Array a -> Int -> a indexArray Array a arr (I#Int# i# )=caseforall a. Array# a -> Int# -> (# a #) indexArray#(forall a. Array a -> Array# a array# Array a arr )Int# i# of(#a x #)->a x -- | Read a value from the immutable array at the given index, returning-- the result in an unboxed unary tuple. This is currently used to implement-- folds.---- /Note:/ this function does not do bounds checking.indexArray## ::Array a ->Int->(#a #)indexArray## :: forall a. Array a -> Int -> (# a #) indexArray## Array a arr (I#Int# i )=forall a. Array# a -> Int# -> (# a #) indexArray#(forall a. Array a -> Array# a array# Array a arr )Int# i {-# INLINEindexArray## #-}-- | Monadically read a value from the immutable array at the given index.-- This allows us to be strict in the array while remaining lazy in the read-- element which is very useful for collective operations. Suppose we want to-- copy an array. We could do something like this:---- > copy marr arr ... = do ...-- > writeArray marr i (indexArray arr i) ...-- > ...---- But since the arrays are lazy, the calls to 'indexArray' will not be-- evaluated. Rather, @marr@ will be filled with thunks each of which would-- retain a reference to @arr@. This is definitely not what we want!---- With 'indexArrayM', we can instead write---- > copy marr arr ... = do ...-- > x <- indexArrayM arr i-- > writeArray marr i x-- > ...---- Now, indexing is executed immediately although the returned element is-- still not evaluated.---- /Note:/ this function does not do bounds checking.indexArrayM ::Monadm =>Array a ->Int->m a {-# INLINEindexArrayM #-}indexArrayM :: forall (m :: * -> *) a. Monad m => Array a -> Int -> m a indexArrayM Array a arr (I#Int# i# )=caseforall a. Array# a -> Int# -> (# a #) indexArray#(forall a. Array a -> Array# a array# Array a arr )Int# i# of(#a x #)->forall (m :: * -> *) a. Monad m => a -> m a returna x -- | Create an immutable copy of a slice of an array.---- This operation makes a copy of the specified section, so it is safe to-- continue using the mutable array afterward.---- /Note:/ The provided array should contain the full subrange-- specified by the two Ints, but this is not checked.freezeArray ::PrimMonad m =>MutableArray (PrimState m )a -- ^ source->Int-- ^ offset->Int-- ^ length->m (Array a ){-# INLINEfreezeArray #-}freezeArray :: forall (m :: * -> *) a. PrimMonad m => MutableArray (PrimState m) a -> Int -> Int -> m (Array a) freezeArray (MutableArray MutableArray# (PrimState m) a ma# )(I#Int# off# )(I#Int# len# )=forall (m :: * -> *) a. PrimMonad m => (State# (PrimState m) -> (# State# (PrimState m), a #)) -> m a primitive forall a b. (a -> b) -> a -> b $\State# (PrimState m) s ->caseforall d a. MutableArray# d a -> Int# -> Int# -> State# d -> (# State# d, Array# a #) freezeArray#MutableArray# (PrimState m) a ma# Int# off# Int# len# State# (PrimState m) s of(#State# (PrimState m) s' ,Array# a a# #)->(#State# (PrimState m) s' ,forall a. Array# a -> Array a Array Array# a a# #)-- | Convert a mutable array to an immutable one without copying. The-- array should not be modified after the conversion.unsafeFreezeArray ::PrimMonad m =>MutableArray (PrimState m )a ->m (Array a ){-# INLINEunsafeFreezeArray #-}unsafeFreezeArray :: forall (m :: * -> *) a. PrimMonad m => MutableArray (PrimState m) a -> m (Array a) unsafeFreezeArray MutableArray (PrimState m) a arr =forall (m :: * -> *) a. PrimMonad m => (State# (PrimState m) -> (# State# (PrimState m), a #)) -> m a primitive (\State# (PrimState m) s# ->caseforall d a. MutableArray# d a -> State# d -> (# State# d, Array# a #) unsafeFreezeArray#(forall s a. MutableArray s a -> MutableArray# s a marray# MutableArray (PrimState m) a arr )State# (PrimState m) s# of(#State# (PrimState m) s'# ,Array# a arr'# #)->leta :: Array a a =forall a. Array# a -> Array a Array Array# a arr'# in(#State# (PrimState m) s'# ,Array a a #))-- | Create a mutable array from a slice of an immutable array.---- This operation makes a copy of the specified slice, so it is safe to use the-- immutable array afterward.---- /Note:/ The provided array should contain the full subrange-- specified by the two Ints, but this is not checked.thawArray ::PrimMonad m =>Array a -- ^ source->Int-- ^ offset->Int-- ^ length->m (MutableArray (PrimState m )a ){-# INLINEthawArray #-}thawArray :: forall (m :: * -> *) a. PrimMonad m => Array a -> Int -> Int -> m (MutableArray (PrimState m) a) thawArray (Array Array# a a# )(I#Int# off# )(I#Int# len# )=forall (m :: * -> *) a. PrimMonad m => (State# (PrimState m) -> (# State# (PrimState m), a #)) -> m a primitive forall a b. (a -> b) -> a -> b $\State# (PrimState m) s ->caseforall a d. Array# a -> Int# -> Int# -> State# d -> (# State# d, MutableArray# d a #) thawArray#Array# a a# Int# off# Int# len# State# (PrimState m) s of(#State# (PrimState m) s' ,MutableArray# (PrimState m) a ma# #)->(#State# (PrimState m) s' ,forall s a. MutableArray# s a -> MutableArray s a MutableArray MutableArray# (PrimState m) a ma# #)-- | Convert an immutable array to an mutable one without copying. The-- immutable array should not be used after the conversion.unsafeThawArray ::PrimMonad m =>Array a ->m (MutableArray (PrimState m )a ){-# INLINEunsafeThawArray #-}unsafeThawArray :: forall (m :: * -> *) a. PrimMonad m => Array a -> m (MutableArray (PrimState m) a) unsafeThawArray Array a a =forall (m :: * -> *) a. PrimMonad m => (State# (PrimState m) -> (# State# (PrimState m), a #)) -> m a primitive (\State# (PrimState m) s# ->caseforall a d. Array# a -> State# d -> (# State# d, MutableArray# d a #) unsafeThawArray#(forall a. Array a -> Array# a array# Array a a )State# (PrimState m) s# of(#State# (PrimState m) s'# ,MutableArray# (PrimState m) a arr'# #)->letma :: MutableArray (PrimState m) a ma =forall s a. MutableArray# s a -> MutableArray s a MutableArray MutableArray# (PrimState m) a arr'# in(#State# (PrimState m) s'# ,MutableArray (PrimState m) a ma #))-- | Check whether the two arrays refer to the same memory block.sameMutableArray ::MutableArray s a ->MutableArray s a ->Bool{-# INLINEsameMutableArray #-}sameMutableArray :: forall s a. MutableArray s a -> MutableArray s a -> Bool sameMutableArray MutableArray s a arr MutableArray s a brr =Int# -> Bool isTrue#(forall d a. MutableArray# d a -> MutableArray# d a -> Int# sameMutableArray#(forall s a. MutableArray s a -> MutableArray# s a marray# MutableArray s a arr )(forall s a. MutableArray s a -> MutableArray# s a marray# MutableArray s a brr ))-- | Copy a slice of an immutable array to a mutable array.---- /Note:/ this function does not do bounds or overlap checking.copyArray ::PrimMonad m =>MutableArray (PrimState m )a -- ^ destination array->Int-- ^ offset into destination array->Array a -- ^ source array->Int-- ^ offset into source array->Int-- ^ number of elements to copy->m (){-# INLINEcopyArray #-}copyArray :: forall (m :: * -> *) a. PrimMonad m => MutableArray (PrimState m) a -> Int -> Array a -> Int -> Int -> m () copyArray (MutableArray MutableArray# (PrimState m) a dst# )(I#Int# doff# )(Array Array# a src# )(I#Int# soff# )(I#Int# len# )=forall (m :: * -> *). PrimMonad m => (State# (PrimState m) -> State# (PrimState m)) -> m () primitive_ (forall a d. Array# a -> Int# -> MutableArray# d a -> Int# -> Int# -> State# d -> State# d copyArray#Array# a src# Int# soff# MutableArray# (PrimState m) a dst# Int# doff# Int# len# )-- | Copy a slice of a mutable array to another array. The two arrays may overlap.---- /Note:/ this function does not do bounds or overlap checking.copyMutableArray ::PrimMonad m =>MutableArray (PrimState m )a -- ^ destination array->Int-- ^ offset into destination array->MutableArray (PrimState m )a -- ^ source array->Int-- ^ offset into source array->Int-- ^ number of elements to copy->m (){-# INLINEcopyMutableArray #-}copyMutableArray :: forall (m :: * -> *) a. PrimMonad m => MutableArray (PrimState m) a -> Int -> MutableArray (PrimState m) a -> Int -> Int -> m () copyMutableArray (MutableArray MutableArray# (PrimState m) a dst# )(I#Int# doff# )(MutableArray MutableArray# (PrimState m) a src# )(I#Int# soff# )(I#Int# len# )=forall (m :: * -> *). PrimMonad m => (State# (PrimState m) -> State# (PrimState m)) -> m () primitive_ (forall d a. MutableArray# d a -> Int# -> MutableArray# d a -> Int# -> Int# -> State# d -> State# d copyMutableArray#MutableArray# (PrimState m) a src# Int# soff# MutableArray# (PrimState m) a dst# Int# doff# Int# len# )-- | Return a newly allocated 'Array' with the specified subrange of the-- provided 'Array'.---- /Note:/ The provided array should contain the full subrange-- specified by the two Ints, but this is not checked.cloneArray ::Array a -- ^ source array->Int-- ^ offset into destination array->Int-- ^ number of elements to copy->Array a {-# INLINEcloneArray #-}cloneArray :: forall a. Array a -> Int -> Int -> Array a cloneArray (Array Array# a arr# )(I#Int# off# )(I#Int# len# )=caseforall a. Array# a -> Int# -> Int# -> Array# a cloneArray#Array# a arr# Int# off# Int# len# ofArray# a arr'# ->forall a. Array# a -> Array a Array Array# a arr'# -- | Return a newly allocated 'MutableArray'. with the specified subrange of-- the provided 'MutableArray'. The provided 'MutableArray' should contain the-- full subrange specified by the two Ints, but this is not checked.---- /Note:/ The provided array should contain the full subrange-- specified by the two Ints, but this is not checked.cloneMutableArray ::PrimMonad m =>MutableArray (PrimState m )a -- ^ source array->Int-- ^ offset into destination array->Int-- ^ number of elements to copy->m (MutableArray (PrimState m )a ){-# INLINEcloneMutableArray #-}cloneMutableArray :: forall (m :: * -> *) a. PrimMonad m => MutableArray (PrimState m) a -> Int -> Int -> m (MutableArray (PrimState m) a) cloneMutableArray (MutableArray MutableArray# (PrimState m) a arr# )(I#Int# off# )(I#Int# len# )=forall (m :: * -> *) a. PrimMonad m => (State# (PrimState m) -> (# State# (PrimState m), a #)) -> m a primitive (\State# (PrimState m) s# ->caseforall d a. MutableArray# d a -> Int# -> Int# -> State# d -> (# State# d, MutableArray# d a #) cloneMutableArray#MutableArray# (PrimState m) a arr# Int# off# Int# len# State# (PrimState m) s# of(#State# (PrimState m) s'# ,MutableArray# (PrimState m) a arr'# #)->(#State# (PrimState m) s'# ,forall s a. MutableArray# s a -> MutableArray s a MutableArray MutableArray# (PrimState m) a arr'# #))-- | The empty 'Array'.emptyArray ::Array a emptyArray :: forall a. Array a emptyArray =forall a. (forall s. ST s a) -> a runSTforall a b. (a -> b) -> a -> b $forall (m :: * -> *) a. PrimMonad m => Int -> a -> m (MutableArray (PrimState m) a) newArray Int 0(forall a. String -> String -> a die String "emptyArray"String "impossible")forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b >>=forall (m :: * -> *) a. PrimMonad m => MutableArray (PrimState m) a -> m (Array a) unsafeFreezeArray {-# NOINLINEemptyArray #-}-- | Execute the monadic action and freeze the resulting array.---- > runArray m = runST $ m >>= unsafeFreezeArrayrunArray ::(foralls .STs (MutableArray s a ))->Array a runArray :: forall a. (forall s. ST s (MutableArray s a)) -> Array a runArray forall s. ST s (MutableArray s a) m =forall a. Array# a -> Array a Array (forall a. (forall s. ST s (MutableArray s a)) -> Array# a runArray# forall s. ST s (MutableArray s a) m )runArray# ::(foralls .STs (MutableArray s a ))->Array#a runArray# :: forall a. (forall s. ST s (MutableArray s a)) -> Array# a runArray# forall s. ST s (MutableArray s a) m =caseforall o. (State# RealWorld -> o) -> o runRW#forall a b. (a -> b) -> a -> b $\State# RealWorld s ->caseforall s a. ST s a -> State# s -> (# State# s, a #) unST forall s. ST s (MutableArray s a) m State# RealWorld s of{(#State# RealWorld s' ,MutableArray MutableArray# RealWorld a mary# #)->forall d a. MutableArray# d a -> State# d -> (# State# d, Array# a #) unsafeFreezeArray#MutableArray# RealWorld a mary# State# RealWorld s' }of(#State# RealWorld _,Array# a ary# #)->Array# a ary# unST ::STs a ->State#s ->(#State#s ,a #)unST :: forall s a. ST s a -> State# s -> (# State# s, a #) unST (GHCST.STSTRep s a f )=STRep s a f emptyArray# ::(##)->Array#a emptyArray# :: forall a. (# #) -> Array# a emptyArray# (# #) _=caseforall a. Array a emptyArray ofArray Array# a ar ->Array# a ar {-# NOINLINEemptyArray# #-}-- | Create an array of the given size with a default value,-- apply the monadic function and freeze the result. If the-- size is 0, return 'emptyArray' (rather than a new copy thereof).---- > createArray 0 _ _ = emptyArray-- > createArray n x f = runArray $ do-- > mary <- newArray n x-- > f mary-- > pure marycreateArray ::Int->a ->(foralls .MutableArray s a ->STs ())->Array a -- This low-level business is designed to work with GHC's worker-wrapper-- transformation. A lot of the time, we don't actually need an Array-- constructor. By putting it on the outside, and being careful about-- how we special-case the empty array, we can make GHC smarter about this.-- The only downside is that separately created 0-length arrays won't share-- their Array constructors, although they'll share their underlying-- Array#s.createArray :: forall a. Int -> a -> (forall s. MutableArray s a -> ST s ()) -> Array a createArray Int 0a _forall s. MutableArray s a -> ST s () _=forall a. Array# a -> Array a Array (forall a. (# #) -> Array# a emptyArray# (##))createArray Int n a x forall s. MutableArray s a -> ST s () f =forall a. (forall s. ST s (MutableArray s a)) -> Array a runArray forall a b. (a -> b) -> a -> b $doMutableArray s a mary <-forall (m :: * -> *) a. PrimMonad m => Int -> a -> m (MutableArray (PrimState m) a) newArray Int n a x forall s. MutableArray s a -> ST s () f MutableArray s a mary forall (f :: * -> *) a. Applicative f => a -> f a pureMutableArray s a mary die ::String->String->a die :: forall a. String -> String -> a die String fun String problem =forall a. HasCallStack => String -> a errorforall a b. (a -> b) -> a -> b $String "Data.Primitive.Array."forall a. [a] -> [a] -> [a] ++String fun forall a. [a] -> [a] -> [a] ++String ": "forall a. [a] -> [a] -> [a] ++String problem arrayLiftEq ::(a ->b ->Bool)->Array a ->Array b ->BoolarrayLiftEq :: forall a b. (a -> b -> Bool) -> Array a -> Array b -> Bool arrayLiftEq a -> b -> Bool p Array a a1 Array b a2 =forall a. Array a -> Int sizeofArray Array a a1 forall a. Eq a => a -> a -> Bool ==forall a. Array a -> Int sizeofArray Array b a2 Bool -> Bool -> Bool &&Int -> Bool loop (forall a. Array a -> Int sizeofArray Array a a1 forall a. Num a => a -> a -> a -Int 1)whereloop :: Int -> Bool loop Int i |Int i forall a. Ord a => a -> a -> Bool <Int 0=Bool True|(#a x1 #)<-forall a. Array a -> Int -> (# a #) indexArray## Array a a1 Int i ,(#b x2 #)<-forall a. Array a -> Int -> (# a #) indexArray## Array b a2 Int i ,Bool otherwise=a -> b -> Bool p a x1 b x2 Bool -> Bool -> Bool &&Int -> Bool loop (Int i forall a. Num a => a -> a -> a -Int 1)instanceEqa =>Eq(Array a )whereArray a a1 == :: Array a -> Array a -> Bool ==Array a a2 =forall a b. (a -> b -> Bool) -> Array a -> Array b -> Bool arrayLiftEq forall a. Eq a => a -> a -> Bool (==)Array a a1 Array a a2 -- | @since 0.6.4.0instanceEq1Array whereliftEq :: forall a b. (a -> b -> Bool) -> Array a -> Array b -> Bool liftEq=forall a b. (a -> b -> Bool) -> Array a -> Array b -> Bool arrayLiftEq instanceEq(MutableArray s a )whereMutableArray s a ma1 == :: MutableArray s a -> MutableArray s a -> Bool ==MutableArray s a ma2 =Int# -> Bool isTrue#(forall d a. MutableArray# d a -> MutableArray# d a -> Int# sameMutableArray#(forall s a. MutableArray s a -> MutableArray# s a marray# MutableArray s a ma1 )(forall s a. MutableArray s a -> MutableArray# s a marray# MutableArray s a ma2 ))arrayLiftCompare ::(a ->b ->Ordering)->Array a ->Array b ->OrderingarrayLiftCompare :: forall a b. (a -> b -> Ordering) -> Array a -> Array b -> Ordering arrayLiftCompare a -> b -> Ordering elemCompare Array a a1 Array b a2 =Int -> Ordering loop Int 0wheremn :: Int mn =forall a. Array a -> Int sizeofArray Array a a1 forall a. Ord a => a -> a -> a `min`forall a. Array a -> Int sizeofArray Array b a2 loop :: Int -> Ordering loop Int i |Int i forall a. Ord a => a -> a -> Bool <Int mn ,(#a x1 #)<-forall a. Array a -> Int -> (# a #) indexArray## Array a a1 Int i ,(#b x2 #)<-forall a. Array a -> Int -> (# a #) indexArray## Array b a2 Int i =a -> b -> Ordering elemCompare a x1 b x2 forall a. Monoid a => a -> a -> a `mappend`Int -> Ordering loop (Int i forall a. Num a => a -> a -> a +Int 1)|Bool otherwise=forall a. Ord a => a -> a -> Ordering compare(forall a. Array a -> Int sizeofArray Array a a1 )(forall a. Array a -> Int sizeofArray Array b a2 )-- | Lexicographic ordering. Subject to change between major versions.instanceOrda =>Ord(Array a )wherecompare :: Array a -> Array a -> Ordering compare Array a a1 Array a a2 =forall a b. (a -> b -> Ordering) -> Array a -> Array b -> Ordering arrayLiftCompare forall a. Ord a => a -> a -> Ordering compareArray a a1 Array a a2 -- | @since 0.6.4.0instanceOrd1Array whereliftCompare :: forall a b. (a -> b -> Ordering) -> Array a -> Array b -> Ordering liftCompare=forall a b. (a -> b -> Ordering) -> Array a -> Array b -> Ordering arrayLiftCompare instanceFoldableArray where-- Note: we perform the array lookups eagerly so we won't-- create thunks to perform lookups even if GHC can't see-- that the folding function is strict.foldr :: forall a b. (a -> b -> b) -> b -> Array a -> b foldra -> b -> b f =\b z !Array a ary ->let!sz :: Int sz =forall a. Array a -> Int sizeofArray Array a ary go :: Int -> b go Int i |Int i forall a. Eq a => a -> a -> Bool ==Int sz =b z |(#a x #)<-forall a. Array a -> Int -> (# a #) indexArray## Array a ary Int i =a -> b -> b f a x (Int -> b go (Int i forall a. Num a => a -> a -> a +Int 1))inInt -> b go Int 0{-# INLINEfoldr#-}foldl :: forall b a. (b -> a -> b) -> b -> Array a -> b foldlb -> a -> b f =\b z !Array a ary ->letgo :: Int -> b go Int i |Int i forall a. Ord a => a -> a -> Bool <Int 0=b z |(#a x #)<-forall a. Array a -> Int -> (# a #) indexArray## Array a ary Int i =b -> a -> b f (Int -> b go (Int i forall a. Num a => a -> a -> a -Int 1))a x inInt -> b go (forall a. Array a -> Int sizeofArray Array a ary forall a. Num a => a -> a -> a -Int 1){-# INLINEfoldl#-}foldr1 :: forall a. (a -> a -> a) -> Array a -> a foldr1a -> a -> a f =\!Array a ary ->let!sz :: Int sz =forall a. Array a -> Int sizeofArray Array a ary forall a. Num a => a -> a -> a -Int 1go :: Int -> a go Int i =caseforall a. Array a -> Int -> (# a #) indexArray## Array a ary Int i of(#a x #)|Int i forall a. Eq a => a -> a -> Bool ==Int sz ->a x |Bool otherwise->a -> a -> a f a x (Int -> a go (Int i forall a. Num a => a -> a -> a +Int 1))inifInt sz forall a. Ord a => a -> a -> Bool <Int 0thenforall a. String -> String -> a die String "foldr1"String "empty array"elseInt -> a go Int 0{-# INLINEfoldr1#-}foldl1 :: forall a. (a -> a -> a) -> Array a -> a foldl1a -> a -> a f =\!Array a ary ->let!sz :: Int sz =forall a. Array a -> Int sizeofArray Array a ary forall a. Num a => a -> a -> a -Int 1go :: Int -> a go Int i =caseforall a. Array a -> Int -> (# a #) indexArray## Array a ary Int i of(#a x #)|Int i forall a. Eq a => a -> a -> Bool ==Int 0->a x |Bool otherwise->a -> a -> a f (Int -> a go (Int i forall a. Num a => a -> a -> a -Int 1))a x inifInt sz forall a. Ord a => a -> a -> Bool <Int 0thenforall a. String -> String -> a die String "foldl1"String "empty array"elseInt -> a go Int sz {-# INLINEfoldl1#-}foldr' :: forall a b. (a -> b -> b) -> b -> Array a -> b foldr'a -> b -> b f =\b z !Array a ary ->letgo :: Int -> b -> b go Int i !b acc |Int i forall a. Eq a => a -> a -> Bool ==-Int 1=b acc |(#a x #)<-forall a. Array a -> Int -> (# a #) indexArray## Array a ary Int i =Int -> b -> b go (Int i forall a. Num a => a -> a -> a -Int 1)(a -> b -> b f a x b acc )inInt -> b -> b go (forall a. Array a -> Int sizeofArray Array a ary forall a. Num a => a -> a -> a -Int 1)b z {-# INLINEfoldr'#-}foldl' :: forall b a. (b -> a -> b) -> b -> Array a -> b foldl' b -> a -> b f =\b z !Array a ary ->let!sz :: Int sz =forall a. Array a -> Int sizeofArray Array a ary go :: Int -> b -> b go Int i !b acc |Int i forall a. Eq a => a -> a -> Bool ==Int sz =b acc |(#a x #)<-forall a. Array a -> Int -> (# a #) indexArray## Array a ary Int i =Int -> b -> b go (Int i forall a. Num a => a -> a -> a +Int 1)(b -> a -> b f b acc a x )inInt -> b -> b go Int 0b z {-# INLINEfoldl'#-}null :: forall a. Array a -> Bool nullArray a a =forall a. Array a -> Int sizeofArray Array a a forall a. Eq a => a -> a -> Bool ==Int 0{-# INLINEnull#-}length :: forall a. Array a -> Int length =forall a. Array a -> Int sizeofArray {-# INLINElength#-}maximum :: forall a. Ord a => Array a -> a maximumArray a ary |Int sz forall a. Eq a => a -> a -> Bool ==Int 0=forall a. String -> String -> a die String "maximum"String "empty array"|(#a frst #)<-forall a. Array a -> Int -> (# a #) indexArray## Array a ary Int 0=Int -> a -> a go Int 1a frst wheresz :: Int sz =forall a. Array a -> Int sizeofArray Array a ary go :: Int -> a -> a go Int i !a e |Int i forall a. Eq a => a -> a -> Bool ==Int sz =a e |(#a x #)<-forall a. Array a -> Int -> (# a #) indexArray## Array a ary Int i =Int -> a -> a go (Int i forall a. Num a => a -> a -> a +Int 1)(forall a. Ord a => a -> a -> a maxa e a x ){-# INLINEmaximum#-}minimum :: forall a. Ord a => Array a -> a minimumArray a ary |Int sz forall a. Eq a => a -> a -> Bool ==Int 0=forall a. String -> String -> a die String "minimum"String "empty array"|(#a frst #)<-forall a. Array a -> Int -> (# a #) indexArray## Array a ary Int 0=Int -> a -> a go Int 1a frst wheresz :: Int sz =forall a. Array a -> Int sizeofArray Array a ary go :: Int -> a -> a go Int i !a e |Int i forall a. Eq a => a -> a -> Bool ==Int sz =a e |(#a x #)<-forall a. Array a -> Int -> (# a #) indexArray## Array a ary Int i =Int -> a -> a go (Int i forall a. Num a => a -> a -> a +Int 1)(forall a. Ord a => a -> a -> a mina e a x ){-# INLINEminimum#-}sum :: forall a. Num a => Array a -> a sum=forall (t :: * -> *) b a. Foldable t => (b -> a -> b) -> b -> t a -> b foldl'forall a. Num a => a -> a -> a (+)a 0{-# INLINEsum#-}product :: forall a. Num a => Array a -> a product=forall (t :: * -> *) b a. Foldable t => (b -> a -> b) -> b -> t a -> b foldl'forall a. Num a => a -> a -> a (*)a 1{-# INLINEproduct#-}newtypeSTA a =STA {forall a. STA a -> forall s. MutableArray# s a -> ST s (Array a) _runSTA ::foralls .MutableArray#s a ->STs (Array a )}runSTA ::Int->STA a ->Array a runSTA :: forall a. Int -> STA a -> Array a runSTA !Int sz =\(STA forall s. MutableArray# s a -> ST s (Array a) m )->forall a. (forall s. ST s a) -> a runSTforall a b. (a -> b) -> a -> b $forall s a. Int -> ST s (MutableArray s a) newArray_ Int sz forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b >>=\MutableArray s a ar ->forall s. MutableArray# s a -> ST s (Array a) m (forall s a. MutableArray s a -> MutableArray# s a marray# MutableArray s a ar ){-# INLINErunSTA #-}newArray_ ::Int->STs (MutableArray s a )newArray_ :: forall s a. Int -> ST s (MutableArray s a) newArray_ !Int n =forall (m :: * -> *) a. PrimMonad m => Int -> a -> m (MutableArray (PrimState m) a) newArray Int n forall a. a badTraverseValue badTraverseValue ::a badTraverseValue :: forall a. a badTraverseValue =forall a. String -> String -> a die String "traverse"String "bad indexing"{-# NOINLINEbadTraverseValue #-}instanceTraversableArray wheretraverse :: forall (f :: * -> *) a b. Applicative f => (a -> f b) -> Array a -> f (Array b) traversea -> f b f =forall (f :: * -> *) a b. Applicative f => (a -> f b) -> Array a -> f (Array b) traverseArray a -> f b f {-# INLINEtraverse#-}traverseArray ::Applicativef =>(a ->f b )->Array a ->f (Array b )traverseArray :: forall (f :: * -> *) a b. Applicative f => (a -> f b) -> Array a -> f (Array b) traverseArray a -> f b f =\!Array a ary ->let!len :: Int len =forall a. Array a -> Int sizeofArray Array a ary go :: Int -> f (STA b) go !Int i |Int i forall a. Eq a => a -> a -> Bool ==Int len =forall (f :: * -> *) a. Applicative f => a -> f a pureforall a b. (a -> b) -> a -> b $forall a. (forall s. MutableArray# s a -> ST s (Array a)) -> STA a STA forall a b. (a -> b) -> a -> b $\MutableArray# s b mary ->forall (m :: * -> *) a. PrimMonad m => MutableArray (PrimState m) a -> m (Array a) unsafeFreezeArray (forall s a. MutableArray# s a -> MutableArray s a MutableArray MutableArray# s b mary )|(#a x #)<-forall a. Array a -> Int -> (# a #) indexArray## Array a ary Int i =forall (f :: * -> *) a b c. Applicative f => (a -> b -> c) -> f a -> f b -> f c liftA2(\b b (STA forall s. MutableArray# s b -> ST s (Array b) m )->forall a. (forall s. MutableArray# s a -> ST s (Array a)) -> STA a STA forall a b. (a -> b) -> a -> b $\MutableArray# s b mary ->forall (m :: * -> *) a. PrimMonad m => MutableArray (PrimState m) a -> Int -> a -> m () writeArray (forall s a. MutableArray# s a -> MutableArray s a MutableArray MutableArray# s b mary )Int i b b forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >>forall s. MutableArray# s b -> ST s (Array b) m MutableArray# s b mary )(a -> f b f a x )(Int -> f (STA b) go (Int i forall a. Num a => a -> a -> a +Int 1))inifInt len forall a. Eq a => a -> a -> Bool ==Int 0thenforall (f :: * -> *) a. Applicative f => a -> f a pureforall a. Array a emptyArray elseforall a. Int -> STA a -> Array a runSTA Int len forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$>Int -> f (STA b) go Int 0{-# INLINE[1]traverseArray #-}{-# RULES"traverse/ST"forall(f ::a ->STs b ).traverseArray f =traverseArrayP f "traverse/IO"forall(f ::a ->IOb ).traverseArray f =traverseArrayP f "traverse/Id"forall(f ::a ->Identityb ).traverseArray f =(coerce::(Array a ->Array (Identityb ))->Array a ->Identity(Array b ))(fmapf )#-}-- | This is the fastest, most straightforward way to traverse-- an array, but it only works correctly with a sufficiently-- "affine" 'PrimMonad' instance. In particular, it must only produce-- /one/ result array. 'Control.Monad.Trans.List.ListT'-transformed-- monads, for example, will not work right at all.traverseArrayP ::PrimMonad m =>(a ->m b )->Array a ->m (Array b )traverseArrayP :: forall (m :: * -> *) a b. PrimMonad m => (a -> m b) -> Array a -> m (Array b) traverseArrayP a -> m b f =\!Array a ary ->let!sz :: Int sz =forall a. Array a -> Int sizeofArray Array a ary go :: Int -> MutableArray (PrimState m) b -> m (Array b) go !Int i !MutableArray (PrimState m) b mary |Int i forall a. Eq a => a -> a -> Bool ==Int sz =forall (m :: * -> *) a. PrimMonad m => MutableArray (PrimState m) a -> m (Array a) unsafeFreezeArray MutableArray (PrimState m) b mary |Bool otherwise=doa a <-forall (m :: * -> *) a. Monad m => Array a -> Int -> m a indexArrayM Array a ary Int i b b <-a -> m b f a a forall (m :: * -> *) a. PrimMonad m => MutableArray (PrimState m) a -> Int -> a -> m () writeArray MutableArray (PrimState m) b mary Int i b b Int -> MutableArray (PrimState m) b -> m (Array b) go (Int i forall a. Num a => a -> a -> a +Int 1)MutableArray (PrimState m) b mary indoMutableArray (PrimState m) b mary <-forall (m :: * -> *) a. PrimMonad m => Int -> a -> m (MutableArray (PrimState m) a) newArray Int sz forall a. a badTraverseValue Int -> MutableArray (PrimState m) b -> m (Array b) go Int 0MutableArray (PrimState m) b mary {-# INLINEtraverseArrayP #-}-- | Strict map over the elements of the array.mapArray' ::(a ->b )->Array a ->Array b mapArray' :: forall a b. (a -> b) -> Array a -> Array b mapArray' a -> b f Array a a =forall a. Int -> a -> (forall s. MutableArray s a -> ST s ()) -> Array a createArray (forall a. Array a -> Int sizeofArray Array a a )(forall a. String -> String -> a die String "mapArray'"String "impossible")forall a b. (a -> b) -> a -> b $\MutableArray s b mb ->letgo :: Int -> ST s () go Int i |Int i forall a. Eq a => a -> a -> Bool ==forall a. Array a -> Int sizeofArray Array a a =forall (m :: * -> *) a. Monad m => a -> m a return()|Bool otherwise=doa x <-forall (m :: * -> *) a. Monad m => Array a -> Int -> m a indexArrayM Array a a Int i -- We use indexArrayM here so that we will perform the-- indexing eagerly even if f is lazy.let!y :: b y =a -> b f a x forall (m :: * -> *) a. PrimMonad m => MutableArray (PrimState m) a -> Int -> a -> m () writeArray MutableArray s b mb Int i b y forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >>Int -> ST s () go (Int i forall a. Num a => a -> a -> a +Int 1)inInt -> ST s () go Int 0{-# INLINEmapArray' #-}-- | Create an array from a list of a known length. If the length-- of the list does not match the given length, this throws an exception.arrayFromListN ::Int->[a ]->Array a arrayFromListN :: forall a. Int -> [a] -> Array a arrayFromListN Int n [a] l =forall a. Int -> a -> (forall s. MutableArray s a -> ST s ()) -> Array a createArray Int n (forall a. String -> String -> a die String "fromListN"String "uninitialized element")forall a b. (a -> b) -> a -> b $\MutableArray s a sma ->letgo :: Int -> [a] -> ST s () go !Int ix []=ifInt ix forall a. Eq a => a -> a -> Bool ==Int n thenforall (m :: * -> *) a. Monad m => a -> m a return()elseforall a. String -> String -> a die String "fromListN"String "list length less than specified size"go !Int ix (a x :[a] xs )=ifInt ix forall a. Ord a => a -> a -> Bool <Int n thendoforall (m :: * -> *) a. PrimMonad m => MutableArray (PrimState m) a -> Int -> a -> m () writeArray MutableArray s a sma Int ix a x Int -> [a] -> ST s () go (Int ix forall a. Num a => a -> a -> a +Int 1)[a] xs elseforall a. String -> String -> a die String "fromListN"String "list length greater than specified size"inInt -> [a] -> ST s () go Int 0[a] l -- | Create an array from a list.arrayFromList ::[a ]->Array a arrayFromList :: forall a. [a] -> Array a arrayFromList [a] l =forall a. Int -> [a] -> Array a arrayFromListN (forall (t :: * -> *) a. Foldable t => t a -> Int length[a] l )[a] l instanceExts.IsList(Array a )wheretypeItem(Array a )=a fromListN :: Int -> [Item (Array a)] -> Array a fromListN=forall a. Int -> [a] -> Array a arrayFromListN fromList :: [Item (Array a)] -> Array a fromList=forall a. [a] -> Array a arrayFromList toList :: Array a -> [Item (Array a)] toList=forall (t :: * -> *) a. Foldable t => t a -> [a] toListinstanceFunctorArray wherefmap :: forall a b. (a -> b) -> Array a -> Array b fmapa -> b f Array a a =forall a. Int -> a -> (forall s. MutableArray s a -> ST s ()) -> Array a createArray (forall a. Array a -> Int sizeofArray Array a a )(forall a. String -> String -> a die String "fmap"String "impossible")forall a b. (a -> b) -> a -> b $\MutableArray s b mb ->letgo :: Int -> ST s () go Int i |Int i forall a. Eq a => a -> a -> Bool ==forall a. Array a -> Int sizeofArray Array a a =forall (m :: * -> *) a. Monad m => a -> m a return()|Bool otherwise=doa x <-forall (m :: * -> *) a. Monad m => Array a -> Int -> m a indexArrayM Array a a Int i forall (m :: * -> *) a. PrimMonad m => MutableArray (PrimState m) a -> Int -> a -> m () writeArray MutableArray s b mb Int i (a -> b f a x )forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >>Int -> ST s () go (Int i forall a. Num a => a -> a -> a +Int 1)inInt -> ST s () go Int 0a e <$ :: forall a b. a -> Array b -> Array a <$Array b a =forall a. Int -> a -> (forall s. MutableArray s a -> ST s ()) -> Array a createArray (forall a. Array a -> Int sizeofArray Array b a )a e (\!MutableArray s a _->forall (f :: * -> *) a. Applicative f => a -> f a pure())instanceApplicativeArray wherepure :: forall a. a -> Array a purea x =forall a. (forall s. ST s (MutableArray s a)) -> Array a runArray forall a b. (a -> b) -> a -> b $forall (m :: * -> *) a. PrimMonad m => Int -> a -> m (MutableArray (PrimState m) a) newArray Int 1a x Array (a -> b) ab <*> :: forall a b. Array (a -> b) -> Array a -> Array b <*>Array a a =forall a. Int -> a -> (forall s. MutableArray s a -> ST s ()) -> Array a createArray (Int szab forall a. Num a => a -> a -> a *Int sza )(forall a. String -> String -> a die String "<*>"String "impossible")forall a b. (a -> b) -> a -> b $\MutableArray s b mb ->letgo1 :: Int -> ST s () go1 Int i =forall (f :: * -> *). Applicative f => Bool -> f () -> f () when(Int i forall a. Ord a => a -> a -> Bool <Int szab )forall a b. (a -> b) -> a -> b $doa -> b f <-forall (m :: * -> *) a. Monad m => Array a -> Int -> m a indexArrayM Array (a -> b) ab Int i Int -> (a -> b) -> Int -> ST s () go2 (Int i forall a. Num a => a -> a -> a *Int sza )a -> b f Int 0Int -> ST s () go1 (Int i forall a. Num a => a -> a -> a +Int 1)go2 :: Int -> (a -> b) -> Int -> ST s () go2 Int off a -> b f Int j =forall (f :: * -> *). Applicative f => Bool -> f () -> f () when(Int j forall a. Ord a => a -> a -> Bool <Int sza )forall a b. (a -> b) -> a -> b $doa x <-forall (m :: * -> *) a. Monad m => Array a -> Int -> m a indexArrayM Array a a Int j forall (m :: * -> *) a. PrimMonad m => MutableArray (PrimState m) a -> Int -> a -> m () writeArray MutableArray s b mb (Int off forall a. Num a => a -> a -> a +Int j )(a -> b f a x )Int -> (a -> b) -> Int -> ST s () go2 Int off a -> b f (Int j forall a. Num a => a -> a -> a +Int 1)inInt -> ST s () go1 Int 0whereszab :: Int szab =forall a. Array a -> Int sizeofArray Array (a -> b) ab ;sza :: Int sza =forall a. Array a -> Int sizeofArray Array a a Array a a *> :: forall a b. Array a -> Array b -> Array b *>Array b b =forall a. Int -> a -> (forall s. MutableArray s a -> ST s ()) -> Array a createArray (Int sza forall a. Num a => a -> a -> a *Int szb )(forall a. String -> String -> a die String "*>"String "impossible")forall a b. (a -> b) -> a -> b $\MutableArray s b mb ->letgo :: Int -> ST s () go Int i |Int i forall a. Ord a => a -> a -> Bool <Int sza =forall (m :: * -> *) a. PrimMonad m => MutableArray (PrimState m) a -> Int -> Array a -> Int -> Int -> m () copyArray MutableArray s b mb (Int i forall a. Num a => a -> a -> a *Int szb )Array b b Int 0Int szb forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b *>Int -> ST s () go (Int i forall a. Num a => a -> a -> a +Int 1)|Bool otherwise=forall (m :: * -> *) a. Monad m => a -> m a return()inInt -> ST s () go Int 0wheresza :: Int sza =forall a. Array a -> Int sizeofArray Array a a ;szb :: Int szb =forall a. Array a -> Int sizeofArray Array b b Array a a <* :: forall a b. Array a -> Array b -> Array a <*Array b b =forall a. Int -> a -> (forall s. MutableArray s a -> ST s ()) -> Array a createArray (Int sza forall a. Num a => a -> a -> a *Int szb )(forall a. String -> String -> a die String "<*"String "impossible")forall a b. (a -> b) -> a -> b $\MutableArray s a ma ->letfill :: Int -> Int -> a -> ST s () fill Int off Int i a e |Int i forall a. Ord a => a -> a -> Bool <Int szb =forall (m :: * -> *) a. PrimMonad m => MutableArray (PrimState m) a -> Int -> a -> m () writeArray MutableArray s a ma (Int off forall a. Num a => a -> a -> a +Int i )a e forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >>Int -> Int -> a -> ST s () fill Int off (Int i forall a. Num a => a -> a -> a +Int 1)a e |Bool otherwise=forall (m :: * -> *) a. Monad m => a -> m a return()go :: Int -> ST s () go Int i |Int i forall a. Ord a => a -> a -> Bool <Int sza =doa x <-forall (m :: * -> *) a. Monad m => Array a -> Int -> m a indexArrayM Array a a Int i Int -> Int -> a -> ST s () fill (Int i forall a. Num a => a -> a -> a *Int szb )Int 0a x forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >>Int -> ST s () go (Int i forall a. Num a => a -> a -> a +Int 1)|Bool otherwise=forall (m :: * -> *) a. Monad m => a -> m a return()inInt -> ST s () go Int 0wheresza :: Int sza =forall a. Array a -> Int sizeofArray Array a a ;szb :: Int szb =forall a. Array a -> Int sizeofArray Array b b instanceAlternativeArray whereempty :: forall a. Array a empty=forall a. Array a emptyArray Array a a1 <|> :: forall a. Array a -> Array a -> Array a <|>Array a a2 =forall a. Int -> a -> (forall s. MutableArray s a -> ST s ()) -> Array a createArray (Int sza1 forall a. Num a => a -> a -> a +Int sza2 )(forall a. String -> String -> a die String "<|>"String "impossible")forall a b. (a -> b) -> a -> b $\MutableArray s a ma ->forall (m :: * -> *) a. PrimMonad m => MutableArray (PrimState m) a -> Int -> Array a -> Int -> Int -> m () copyArray MutableArray s a ma Int 0Array a a1 Int 0Int sza1 forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >>forall (m :: * -> *) a. PrimMonad m => MutableArray (PrimState m) a -> Int -> Array a -> Int -> Int -> m () copyArray MutableArray s a ma Int sza1 Array a a2 Int 0Int sza2 wheresza1 :: Int sza1 =forall a. Array a -> Int sizeofArray Array a a1 ;sza2 :: Int sza2 =forall a. Array a -> Int sizeofArray Array a a2 some :: forall a. Array a -> Array [a] someArray a a |forall a. Array a -> Int sizeofArray Array a a forall a. Eq a => a -> a -> Bool ==Int 0=forall a. Array a emptyArray |Bool otherwise=forall a. String -> String -> a die String "some"String "infinite arrays are not well defined"many :: forall a. Array a -> Array [a] manyArray a a |forall a. Array a -> Int sizeofArray Array a a forall a. Eq a => a -> a -> Bool ==Int 0=forall (f :: * -> *) a. Applicative f => a -> f a pure[]|Bool otherwise=forall a. String -> String -> a die String "many"String "infinite arrays are not well defined"dataArrayStack a =PushArray !(Array a )!(ArrayStack a )|EmptyStack -- See the note in SmallArray about how we might improve this.instanceMonadArray wherereturn :: forall a. a -> Array a return=forall (f :: * -> *) a. Applicative f => a -> f a pure>> :: forall a b. Array a -> Array b -> Array b (>>)=forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b (*>)Array a ary >>= :: forall a b. Array a -> (a -> Array b) -> Array b >>=a -> Array b f =Int -> ArrayStack b -> Int -> Array b collect Int 0forall a. ArrayStack a EmptyStack (Int la forall a. Num a => a -> a -> a -Int 1)wherela :: Int la =forall a. Array a -> Int sizeofArray Array a ary collect :: Int -> ArrayStack b -> Int -> Array b collect Int sz ArrayStack b stk Int i |Int i forall a. Ord a => a -> a -> Bool <Int 0=forall a. Int -> a -> (forall s. MutableArray s a -> ST s ()) -> Array a createArray Int sz (forall a. String -> String -> a die String ">>="String "impossible")forall a b. (a -> b) -> a -> b $forall {m :: * -> *} {a}. PrimMonad m => Int -> ArrayStack a -> MutableArray (PrimState m) a -> m () fill Int 0ArrayStack b stk |(#a x #)<-forall a. Array a -> Int -> (# a #) indexArray## Array a ary Int i ,letsb :: Array b sb =a -> Array b f a x lsb :: Int lsb =forall a. Array a -> Int sizeofArray Array b sb -- If we don't perform this check, we could end up allocating-- a stack full of empty arrays if someone is filtering most-- things out. So we refrain from pushing empty arrays.=ifInt lsb forall a. Eq a => a -> a -> Bool ==Int 0thenInt -> ArrayStack b -> Int -> Array b collect Int sz ArrayStack b stk (Int i forall a. Num a => a -> a -> a -Int 1)elseInt -> ArrayStack b -> Int -> Array b collect (Int sz forall a. Num a => a -> a -> a +Int lsb )(forall a. Array a -> ArrayStack a -> ArrayStack a PushArray Array b sb ArrayStack b stk )(Int i forall a. Num a => a -> a -> a -Int 1)fill :: Int -> ArrayStack a -> MutableArray (PrimState m) a -> m () fill Int _ArrayStack a EmptyStack MutableArray (PrimState m) a _=forall (m :: * -> *) a. Monad m => a -> m a return()fill Int off (PushArray Array a sb ArrayStack a sbs )MutableArray (PrimState m) a smb |letlsb :: Int lsb =forall a. Array a -> Int sizeofArray Array a sb =forall (m :: * -> *) a. PrimMonad m => MutableArray (PrimState m) a -> Int -> Array a -> Int -> Int -> m () copyArray MutableArray (PrimState m) a smb Int off Array a sb Int 0Int lsb forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b *>Int -> ArrayStack a -> MutableArray (PrimState m) a -> m () fill (Int off forall a. Num a => a -> a -> a +Int lsb )ArrayStack a sbs MutableArray (PrimState m) a smb #if !(MIN_VERSION_base(4,13,0)) fail=Fail.fail #endif instanceFail.MonadFailArray wherefail :: forall a. String -> Array a failString _=forall (f :: * -> *) a. Alternative f => f a emptyinstanceMonadPlusArray wheremzero :: forall a. Array a mzero=forall (f :: * -> *) a. Alternative f => f a emptymplus :: forall a. Array a -> Array a -> Array a mplus=forall (f :: * -> *) a. Alternative f => f a -> f a -> f a (<|>)zipW ::String->(a ->b ->c )->Array a ->Array b ->Array c zipW :: forall a b c. String -> (a -> b -> c) -> Array a -> Array b -> Array c zipW String s a -> b -> c f Array a aa Array b ab =forall a. Int -> a -> (forall s. MutableArray s a -> ST s ()) -> Array a createArray Int mn (forall a. String -> String -> a die String s String "impossible")forall a b. (a -> b) -> a -> b $\MutableArray s c mc ->letgo :: Int -> ST s () go Int i |Int i forall a. Ord a => a -> a -> Bool <Int mn =doa x <-forall (m :: * -> *) a. Monad m => Array a -> Int -> m a indexArrayM Array a aa Int i b y <-forall (m :: * -> *) a. Monad m => Array a -> Int -> m a indexArrayM Array b ab Int i forall (m :: * -> *) a. PrimMonad m => MutableArray (PrimState m) a -> Int -> a -> m () writeArray MutableArray s c mc Int i (a -> b -> c f a x b y )Int -> ST s () go (Int i forall a. Num a => a -> a -> a +Int 1)|Bool otherwise=forall (m :: * -> *) a. Monad m => a -> m a return()inInt -> ST s () go Int 0wheremn :: Int mn =forall a. Array a -> Int sizeofArray Array a aa forall a. Ord a => a -> a -> a `min`forall a. Array a -> Int sizeofArray Array b ab {-# INLINEzipW #-}instanceMonadZipArray wheremzip :: forall a b. Array a -> Array b -> Array (a, b) mzipArray a aa Array b ab =forall a b c. String -> (a -> b -> c) -> Array a -> Array b -> Array c zipW String "mzip"(,)Array a aa Array b ab mzipWith :: forall a b c. (a -> b -> c) -> Array a -> Array b -> Array c mzipWitha -> b -> c f Array a aa Array b ab =forall a b c. String -> (a -> b -> c) -> Array a -> Array b -> Array c zipW String "mzipWith"a -> b -> c f Array a aa Array b ab munzip :: forall a b. Array (a, b) -> (Array a, Array b) munzipArray (a, b) aab =forall a. (forall s. ST s a) -> a runSTforall a b. (a -> b) -> a -> b $doletsz :: Int sz =forall a. Array a -> Int sizeofArray Array (a, b) aab MutableArray s a ma <-forall (m :: * -> *) a. PrimMonad m => Int -> a -> m (MutableArray (PrimState m) a) newArray Int sz (forall a. String -> String -> a die String "munzip"String "impossible")MutableArray s b mb <-forall (m :: * -> *) a. PrimMonad m => Int -> a -> m (MutableArray (PrimState m) a) newArray Int sz (forall a. String -> String -> a die String "munzip"String "impossible")letgo :: Int -> ST s () go Int i |Int i forall a. Ord a => a -> a -> Bool <Int sz =do(a a ,b b )<-forall (m :: * -> *) a. Monad m => Array a -> Int -> m a indexArrayM Array (a, b) aab Int i forall (m :: * -> *) a. PrimMonad m => MutableArray (PrimState m) a -> Int -> a -> m () writeArray MutableArray s a ma Int i a a forall (m :: * -> *) a. PrimMonad m => MutableArray (PrimState m) a -> Int -> a -> m () writeArray MutableArray s b mb Int i b b Int -> ST s () go (Int i forall a. Num a => a -> a -> a +Int 1)go Int _=forall (m :: * -> *) a. Monad m => a -> m a return()Int -> ST s () go Int 0(,)forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$>forall (m :: * -> *) a. PrimMonad m => MutableArray (PrimState m) a -> m (Array a) unsafeFreezeArray MutableArray s a ma forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b <*>forall (m :: * -> *) a. PrimMonad m => MutableArray (PrimState m) a -> m (Array a) unsafeFreezeArray MutableArray s b mb instanceMonadFixArray wheremfix :: forall a. (a -> Array a) -> Array a mfixa -> Array a f =forall a. Int -> a -> (forall s. MutableArray s a -> ST s ()) -> Array a createArray (forall a. Array a -> Int sizeofArray (a -> Array a f forall a. a err ))(forall a. String -> String -> a die String "mfix"String "impossible")forall a b. (a -> b) -> a -> b $forall a b c. (a -> b -> c) -> b -> a -> c flipforall a. (a -> a) -> a fixInt 0forall a b. (a -> b) -> a -> b $\Int -> MutableArray s a -> ST s () r !Int i !MutableArray s a mary ->forall (f :: * -> *). Applicative f => Bool -> f () -> f () when(Int i forall a. Ord a => a -> a -> Bool <Int sz )forall a b. (a -> b) -> a -> b $doforall (m :: * -> *) a. PrimMonad m => MutableArray (PrimState m) a -> Int -> a -> m () writeArray MutableArray s a mary Int i (forall a. (a -> a) -> a fix(\a xi ->a -> Array a f a xi forall a. Array a -> Int -> a `indexArray` Int i ))Int -> MutableArray s a -> ST s () r (Int i forall a. Num a => a -> a -> a +Int 1)MutableArray s a mary wheresz :: Int sz =forall a. Array a -> Int sizeofArray (a -> Array a f forall a. a err )err :: a err =forall a. HasCallStack => String -> a errorString "mfix for Data.Primitive.Array applied to strict function."-- | @since 0.6.3.0instanceSemigroup(Array a )where<> :: Array a -> Array a -> Array a (<>)=forall (f :: * -> *) a. Alternative f => f a -> f a -> f a (<|>)sconcat :: NonEmpty (Array a) -> Array a sconcat=forall a. Monoid a => [a] -> a mconcatforall b c a. (b -> c) -> (a -> b) -> a -> c .forall (t :: * -> *) a. Foldable t => t a -> [a] F.toListstimes :: forall b. Integral b => b -> Array a -> Array a stimesb n Array a arr =caseforall a. Ord a => a -> a -> Ordering compareb n b 0ofOrdering LT->forall a. String -> String -> a die String "stimes"String "negative multiplier"Ordering EQ->forall (f :: * -> *) a. Alternative f => f a emptyOrdering GT->forall a. Int -> a -> (forall s. MutableArray s a -> ST s ()) -> Array a createArray (Int n' forall a. Num a => a -> a -> a *forall a. Array a -> Int sizeofArray Array a arr )(forall a. String -> String -> a die String "stimes"String "impossible")forall a b. (a -> b) -> a -> b $\MutableArray s a ma ->letgo :: Int -> ST s () go Int i =ifInt i forall a. Ord a => a -> a -> Bool <Int n' thendoforall (m :: * -> *) a. PrimMonad m => MutableArray (PrimState m) a -> Int -> Array a -> Int -> Int -> m () copyArray MutableArray s a ma (Int i forall a. Num a => a -> a -> a *forall a. Array a -> Int sizeofArray Array a arr )Array a arr Int 0(forall a. Array a -> Int sizeofArray Array a arr )Int -> ST s () go (Int i forall a. Num a => a -> a -> a +Int 1)elseforall (m :: * -> *) a. Monad m => a -> m a return()inInt -> ST s () go Int 0wheren' :: Int n' =forall a b. (Integral a, Num b) => a -> b fromIntegralb n ::IntinstanceMonoid(Array a )wheremempty :: Array a mempty=forall (f :: * -> *) a. Alternative f => f a empty #if !(MIN_VERSION_base(4,11,0)) mappend=(<>) #endif mconcat :: [Array a] -> Array a mconcat[Array a] l =forall a. Int -> a -> (forall s. MutableArray s a -> ST s ()) -> Array a createArray Int sz (forall a. String -> String -> a die String "mconcat"String "impossible")forall a b. (a -> b) -> a -> b $\MutableArray s a ma ->letgo :: Int -> [Array a] -> ST s () go !Int _[]=forall (m :: * -> *) a. Monad m => a -> m a return()go Int off (Array a a :[Array a] as )=forall (m :: * -> *) a. PrimMonad m => MutableArray (PrimState m) a -> Int -> Array a -> Int -> Int -> m () copyArray MutableArray s a ma Int off Array a a Int 0(forall a. Array a -> Int sizeofArray Array a a )forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >>Int -> [Array a] -> ST s () go (Int off forall a. Num a => a -> a -> a +forall a. Array a -> Int sizeofArray Array a a )[Array a] as inInt -> [Array a] -> ST s () go Int 0[Array a] l wheresz :: Int sz =forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a sumforall b c a. (b -> c) -> (a -> b) -> a -> c .forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmapforall a. Array a -> Int sizeofArray forall a b. (a -> b) -> a -> b $[Array a] l arrayLiftShowsPrec ::(Int->a ->ShowS)->([a ]->ShowS)->Int->Array a ->ShowSarrayLiftShowsPrec :: forall a. (Int -> a -> ShowS) -> ([a] -> ShowS) -> Int -> Array a -> ShowS arrayLiftShowsPrec Int -> a -> ShowS elemShowsPrec [a] -> ShowS elemListShowsPrec Int p Array a a =Bool -> ShowS -> ShowS showParen(Int p forall a. Ord a => a -> a -> Bool >Int 10)forall a b. (a -> b) -> a -> b $String -> ShowS showStringString "fromListN "forall b c a. (b -> c) -> (a -> b) -> a -> c .forall a. Show a => a -> ShowS shows(forall a. Array a -> Int sizeofArray Array a a )forall b c a. (b -> c) -> (a -> b) -> a -> c .String -> ShowS showStringString " "forall b c a. (b -> c) -> (a -> b) -> a -> c .forall a. (Int -> a -> ShowS) -> ([a] -> ShowS) -> Int -> [a] -> ShowS listLiftShowsPrec Int -> a -> ShowS elemShowsPrec [a] -> ShowS elemListShowsPrec Int 11(forall (t :: * -> *) a. Foldable t => t a -> [a] toListArray a a )-- this need to be included for older ghcslistLiftShowsPrec ::(Int->a ->ShowS)->([a ]->ShowS)->Int->[a ]->ShowSlistLiftShowsPrec :: forall a. (Int -> a -> ShowS) -> ([a] -> ShowS) -> Int -> [a] -> ShowS listLiftShowsPrec Int -> a -> ShowS _[a] -> ShowS sl Int _=[a] -> ShowS sl instanceShowa =>Show(Array a )whereshowsPrec :: Int -> Array a -> ShowS showsPrecInt p Array a a =forall a. (Int -> a -> ShowS) -> ([a] -> ShowS) -> Int -> Array a -> ShowS arrayLiftShowsPrec forall a. Show a => Int -> a -> ShowS showsPrecforall a. Show a => [a] -> ShowS showListInt p Array a a -- | @since 0.6.4.0instanceShow1Array whereliftShowsPrec :: forall a. (Int -> a -> ShowS) -> ([a] -> ShowS) -> Int -> Array a -> ShowS liftShowsPrec=forall a. (Int -> a -> ShowS) -> ([a] -> ShowS) -> Int -> Array a -> ShowS arrayLiftShowsPrec instanceReada =>Read(Array a )wherereadPrec :: ReadPrec (Array a) readPrec=forall a. ReadPrec a -> ReadPrec [a] -> ReadPrec (Array a) arrayLiftReadPrec forall a. Read a => ReadPrec a readPrecforall a. Read a => ReadPrec [a] readListPrec-- | @since 0.6.4.0instanceRead1Array where #if MIN_VERSION_base(4,10,0) liftReadPrec :: forall a. ReadPrec a -> ReadPrec [a] -> ReadPrec (Array a) liftReadPrec=forall a. ReadPrec a -> ReadPrec [a] -> ReadPrec (Array a) arrayLiftReadPrec #else liftReadsPrec=arrayLiftReadsPrec #endif -- We're really forgiving here. We accept-- "[1,2,3]", "fromList [1,2,3]", and "fromListN 3 [1,2,3]".-- We consider fromListN with an invalid length to be an-- error, rather than a parse failure, because doing otherwise-- seems weird and likely to make debugging difficult.arrayLiftReadPrec ::ReadPreca ->ReadPrec[a ]->ReadPrec(Array a )arrayLiftReadPrec :: forall a. ReadPrec a -> ReadPrec [a] -> ReadPrec (Array a) arrayLiftReadPrec ReadPrec a _ReadPrec [a] read_list =forall a. ReadPrec a -> ReadPrec a parensforall a b. (a -> b) -> a -> b $forall a. Int -> ReadPrec a -> ReadPrec a precInt app_prec forall a b. (a -> b) -> a -> b $forall a. ReadP a -> ReadPrec a RdPrc.liftReadP () skipSpacesforall (m :: * -> *) a b. Monad m => m a -> m b -> m b >>((forall l. IsList l => [Item l] -> l fromListforall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$>ReadPrec [a] read_list )forall a. ReadPrec a -> ReadPrec a -> ReadPrec a RdPrc.+++doTag tag <-forall a. ReadP a -> ReadPrec a RdPrc.liftReadP Tag lexTag caseTag tag ofTag FromListTag ->forall l. IsList l => [Item l] -> l fromListforall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$>ReadPrec [a] read_list Tag FromListNTag ->forall (m :: * -> *) a1 a2 r. Monad m => (a1 -> a2 -> r) -> m a1 -> m a2 -> m r liftM2forall l. IsList l => Int -> [Item l] -> l fromListNforall a. Read a => ReadPrec a readPrecReadPrec [a] read_list )whereapp_prec :: Int app_prec =Int 10dataTag =FromListTag |FromListNTag -- Why don't we just use lexP? The general problem with lexP is that-- it doesn't always fail as fast as we might like. It will-- happily read to the end of an absurdly long lexeme (e.g., a 200MB string-- literal) before returning, at which point we'll immediately discard-- the result because it's not an identifier. Doing the job ourselves, we-- can see very quickly when we've run into a problem. We should also get-- a slight efficiency boost by going through the string just once.lexTag ::ReadPTag lexTag :: ReadP Tag lexTag =doString _<-String -> ReadP String stringString "fromList"String s <-ReadP String lookcaseString s ofChar 'N':Char c :String _|Char '0'forall a. Ord a => a -> a -> Bool <=Char c Bool -> Bool -> Bool &&Char c forall a. Ord a => a -> a -> Bool <=Char '9'->forall (m :: * -> *) a. MonadFail m => String -> m a failString ""-- We have fromListN3 or similar|Bool otherwise->Tag FromListNTag forall (f :: * -> *) a b. Functor f => a -> f b -> f a <$ReadP Char get-- Skip the 'N'String _->forall (m :: * -> *) a. Monad m => a -> m a returnTag FromListTag #if !MIN_VERSION_base(4,10,0) arrayLiftReadsPrec::(Int->ReadSa)->ReadS[a]->Int->ReadS(Arraya)arrayLiftReadsPrecreads_preclist_reads_prec=RdPrc.readPrec_to_S$arrayLiftReadPrec(RdPrc.readS_to_Precreads_prec)(RdPrc.readS_to_Prec(constlist_reads_prec)) #endif arrayDataType ::DataTypearrayDataType :: DataType arrayDataType =String -> [Constr] -> DataType mkDataTypeString "Data.Primitive.Array.Array"[Constr fromListConstr ]fromListConstr ::ConstrfromListConstr :: Constr fromListConstr =DataType -> String -> [String] -> Fixity -> Constr mkConstrDataType arrayDataType String "fromList"[]Fixity PrefixinstanceDataa =>Data(Array a )wheretoConstr :: Array a -> Constr toConstrArray a _=Constr fromListConstr dataTypeOf :: Array a -> DataType dataTypeOfArray a _=DataType arrayDataType gunfold :: forall (c :: * -> *). (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (Array a) gunfoldforall b r. Data b => c (b -> r) -> c r k forall r. r -> c r z Constr c =caseConstr -> Int constrIndexConstr c ofInt 1->forall b r. Data b => c (b -> r) -> c r k (forall r. r -> c r z forall l. IsList l => [Item l] -> l fromList)Int _->forall a. HasCallStack => String -> a errorString "gunfold"gfoldl :: forall (c :: * -> *). (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Array a -> c (Array a) gfoldlforall d b. Data d => c (d -> b) -> d -> c b f forall g. g -> c g z Array a m =forall g. g -> c g z forall l. IsList l => [Item l] -> l fromListforall d b. Data d => c (d -> b) -> d -> c b `f` forall (t :: * -> *) a. Foldable t => t a -> [a] toListArray a m instance(Typeables ,Typeablea )=>Data(MutableArray s a )wheretoConstr :: MutableArray s a -> Constr toConstr MutableArray s a _=forall a. HasCallStack => String -> a errorString "toConstr"gunfold :: forall (c :: * -> *). (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (MutableArray s a) gunfold forall b r. Data b => c (b -> r) -> c r _forall r. r -> c r _=forall a. HasCallStack => String -> a errorString "gunfold"dataTypeOf :: MutableArray s a -> DataType dataTypeOf MutableArray s a _=String -> DataType mkNoRepTypeString "Data.Primitive.Array.MutableArray"