{-# LANGUAGE BangPatterns, CPP, MagicHash, Rank2Types, UnboxedTuples #-}
{-# OPTIONS_GHC -funbox-strict-fields #-}
module Data.Vector.Persistent.Array
( Array
, MArray
, new
, new_
, empty
, singleton
, singleton'
, pair
, length
, lengthM
, read
, write
, index
, index#
, index_
, indexM_
, update
, update'
, updateWith
, unsafeUpdate'
, insert
, insert'
, delete
, delete'
, unsafeFreeze
, unsafeThaw
, run
, run2
, copy
, copyM
, foldl
, foldl'
, boundedFoldl'
, foldr
, foldr'
, boundedFoldr
, thaw
, map
, map'
, traverseArray
, filter
, fromList
, fromListRev
, toList
) where
import qualified Data.Traversable as Traversable
import qualified Control.Applicative as A
import Control.DeepSeq
import Control.Monad.ST
import qualified GHC.Exts as Ext
import GHC.ST (ST(..))
import Prelude hiding (filter, foldl, foldr, length, map, read)
import qualified Data.Foldable as F
#if !MIN_VERSION_base(4,8,0)
import Data.Monoid (mappend)
#endif
#if defined(ASSERTS)
# define CHECK_BOUNDS(_func_,_len_,_k_) \
if (_k_) < 0 || (_k_) >= (_len_) then error ("Data.HashMap.Array." ++ (_func_) ++ ": bounds error, offset " ++ show (_k_) ++ ", length " ++ show (_len_)) else
# define CHECK_OP(_func_,_op_,_lhs_,_rhs_) \
if not ((_lhs_) _op_ (_rhs_)) then error ("Data.HashMap.Array." ++ (_func_) ++ ": Check failed: _lhs_ _op_ _rhs_ (" ++ show (_lhs_) ++ " vs. " ++ show (_rhs_) ++ ")") else
# define CHECK_GT(_func_,_lhs_,_rhs_) CHECK_OP(_func_,>,_lhs_,_rhs_)
# define CHECK_GE(_func_,_lhs_,_rhs_) CHECK_OP(_func_,>=,_lhs_,_rhs_)
# define CHECK_LE(_func_,_lhs_,_rhs_) CHECK_OP(_func_,<=,_lhs_,_rhs_)
#else
# define CHECK_BOUNDS(_func_,_len_,_k_)
# define CHECK_OP(_func_,_op_,_lhs_,_rhs_)
# define CHECK_GT(_func_,_lhs_,_rhs_)
# define CHECK_GE(_func_,_lhs_,_rhs_)
# define CHECK_LE(_func_,_lhs_,_rhs_)
#endif
data Array a = Array {
Array a -> Array# a
unArray :: !(Ext.Array# a)
#if __GLASGOW_HASKELL__ < 702
, length :: !Int
#endif
}
instance Show a => Show (Array a) where
show :: Array a -> String
show = [a] -> String
forall a. Show a => a -> String
show ([a] -> String) -> (Array a -> [a]) -> Array a -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array a -> [a]
forall a. Array a -> [a]
toList
instance Eq a => Eq (Array a) where
== :: Array a -> Array a -> Bool
(==) = Array a -> Array a -> Bool
forall a. Eq a => Array a -> Array a -> Bool
arrayEq
instance Ord a => Ord (Array a) where
compare :: Array a -> Array a -> Ordering
compare = Array a -> Array a -> Ordering
forall a. Ord a => Array a -> Array a -> Ordering
arrayCompare
arrayEq :: Eq a => Array a -> Array a -> Bool
{-# INLINABLE arrayEq #-}
arrayEq :: Array a -> Array a -> Bool
arrayEq Array a
a1 Array a
a2 = Array a -> Int
forall a. Array a -> Int
length Array a
a1 Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Array a -> Int
forall a. Array a -> Int
length Array a
a2 Bool -> Bool -> Bool
&&
(Int -> Bool) -> [Int] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
F.all (\Int
i -> Array a -> Int -> a
forall a. Array a -> Int -> a
index Array a
a1 Int
i a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== Array a -> Int -> a
forall a. Array a -> Int -> a
index Array a
a2 Int
i) [Int
0..(Array a -> Int
forall a. Array a -> Int
length Array a
a1 Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)]
arrayCompare :: Ord a => Array a -> Array a -> Ordering
{-# INLINABLE arrayCompare #-}
arrayCompare :: Array a -> Array a -> Ordering
arrayCompare Array a
a1 Array a
a2 = Int -> Int -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Array a -> Int
forall a. Array a -> Int
length Array a
a1) (Array a -> Int
forall a. Array a -> Int
length Array a
a2) Ordering -> Ordering -> Ordering
forall a. Monoid a => a -> a -> a
`mappend`
(Int -> Ordering) -> [Int] -> Ordering
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
F.foldMap (\Int
i -> Array a -> Int -> a
forall a. Array a -> Int -> a
index Array a
a1 Int
i a -> a -> Ordering
forall a. Ord a => a -> a -> Ordering
`compare` Array a -> Int -> a
forall a. Array a -> Int -> a
index Array a
a2 Int
i) [Int
0..(Array a -> Int
forall a. Array a -> Int
length Array a
a1 Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)]
#if __GLASGOW_HASKELL__ >= 702
length :: Array a -> Int
length :: Array a -> Int
length Array a
ary = Int# -> Int
Ext.I# (Array# a -> Int#
forall a. Array# a -> Int#
Ext.sizeofArray# (Array a -> Array# a
forall a. Array a -> Array# a
unArray Array a
ary))
{-# INLINE length #-}
#endif
array :: Ext.Array# a -> Int -> Array a
#if __GLASGOW_HASKELL__ >= 702
array :: Array# a -> Int -> Array a
array Array# a
ary Int
_n = Array# a -> Array a
forall a. Array# a -> Array a
Array Array# a
ary
#else
array = Array
#endif
{-# INLINE array #-}
data MArray s a = MArray {
MArray s a -> MutableArray# s a
unMArray :: !(Ext.MutableArray# s a)
#if __GLASGOW_HASKELL__ < 702
, lengthM :: !Int
#endif
}
#if __GLASGOW_HASKELL__ >= 702
lengthM :: MArray s a -> Int
lengthM :: MArray s a -> Int
lengthM MArray s a
mary = Int# -> Int
Ext.I# (MutableArray# s a -> Int#
forall d a. MutableArray# d a -> Int#
Ext.sizeofMutableArray# (MArray s a -> MutableArray# s a
forall s a. MArray s a -> MutableArray# s a
unMArray MArray s a
mary))
{-# INLINE lengthM #-}
#endif
marray :: Ext.MutableArray# s a -> Int -> MArray s a
#if __GLASGOW_HASKELL__ >= 702
marray :: MutableArray# s a -> Int -> MArray s a
marray MutableArray# s a
mary Int
_n = MutableArray# s a -> MArray s a
forall s a. MutableArray# s a -> MArray s a
MArray MutableArray# s a
mary
#else
marray = MArray
#endif
{-# INLINE marray #-}
instance NFData a => NFData (Array a) where
rnf :: Array a -> ()
rnf = Array a -> ()
forall a. NFData a => Array a -> ()
rnfArray
rnfArray :: NFData a => Array a -> ()
rnfArray :: Array a -> ()
rnfArray Array a
ary0 = Array a -> Int -> Int -> ()
forall a. NFData a => Array a -> Int -> Int -> ()
go Array a
ary0 Int
n0 Int
0
where
n0 :: Int
n0 = Array a -> Int
forall a. Array a -> Int
length Array a
ary0
go :: Array a -> Int -> Int -> ()
go !Array a
ary !Int
n !Int
i
| Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
n = ()
| Bool
otherwise = a -> ()
forall a. NFData a => a -> ()
rnf (Array a -> Int -> a
forall a. Array a -> Int -> a
index Array a
ary Int
i) () -> () -> ()
`seq` Array a -> Int -> Int -> ()
go Array a
ary Int
n (Int
iInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1)
{-# INLINE rnfArray #-}
new :: Int -> a -> ST s (MArray s a)
new :: Int -> a -> ST s (MArray s a)
new n :: Int
n@(Ext.I# Int#
n#) a
b =
CHECK_GE("new",n,(0 :: Int))
STRep s (MArray s a) -> ST s (MArray s a)
forall s a. STRep s a -> ST s a
ST (STRep s (MArray s a) -> ST s (MArray s a))
-> STRep s (MArray s a) -> ST s (MArray s a)
forall a b. (a -> b) -> a -> b
$ \State# s
s ->
case Int# -> a -> State# s -> (# State# s, MutableArray# s a #)
forall a d.
Int# -> a -> State# d -> (# State# d, MutableArray# d a #)
Ext.newArray# Int#
n# a
b State# s
s of
(# State# s
s', MutableArray# s a
ary #) -> (# State# s
s', MutableArray# s a -> Int -> MArray s a
forall s a. MutableArray# s a -> Int -> MArray s a
marray MutableArray# s a
ary Int
n #)
{-# INLINE new #-}
new_ :: Int -> ST s (MArray s a)
new_ :: Int -> ST s (MArray s a)
new_ Int
n = Int -> a -> ST s (MArray s a)
forall a s. Int -> a -> ST s (MArray s a)
new Int
n a
forall a. a
undefinedElem
empty :: Array a
empty :: Array a
empty = (forall s. ST s (Array a)) -> Array a
forall a. (forall s. ST s a) -> a
runST (Int -> ST s (MArray s a)
forall s a. Int -> ST s (MArray s a)
new_ Int
0 ST s (MArray s a)
-> (MArray s a -> ST s (Array a)) -> ST s (Array a)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= MArray s a -> ST s (Array a)
forall s a. MArray s a -> ST s (Array a)
unsafeFreeze)
{-# NOINLINE empty #-}
singleton :: a -> Array a
singleton :: a -> Array a
singleton a
x = (forall s. ST s (Array a)) -> Array a
forall a. (forall s. ST s a) -> a
runST (a -> ST s (Array a)
forall a s. a -> ST s (Array a)
singleton' a
x)
{-# INLINE singleton #-}
singleton' :: a -> ST s (Array a)
singleton' :: a -> ST s (Array a)
singleton' a
x = Int -> a -> ST s (MArray s a)
forall a s. Int -> a -> ST s (MArray s a)
new Int
1 a
x ST s (MArray s a)
-> (MArray s a -> ST s (Array a)) -> ST s (Array a)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= MArray s a -> ST s (Array a)
forall s a. MArray s a -> ST s (Array a)
unsafeFreeze
{-# INLINE singleton' #-}
pair :: a -> a -> Array a
pair :: a -> a -> Array a
pair a
x a
y = (forall s. ST s (MArray s a)) -> Array a
forall e. (forall s. ST s (MArray s e)) -> Array e
run ((forall s. ST s (MArray s a)) -> Array a)
-> (forall s. ST s (MArray s a)) -> Array a
forall a b. (a -> b) -> a -> b
$ do
MArray s a
ary <- Int -> a -> ST s (MArray s a)
forall a s. Int -> a -> ST s (MArray s a)
new Int
2 a
x
MArray s a -> Int -> a -> ST s ()
forall s a. MArray s a -> Int -> a -> ST s ()
write MArray s a
ary Int
1 a
y
MArray s a -> ST s (MArray s a)
forall (m :: * -> *) a. Monad m => a -> m a
return MArray s a
ary
{-# INLINE pair #-}
read :: MArray s a -> Int -> ST s a
read :: MArray s a -> Int -> ST s a
read MArray s a
ary _i :: Int
_i@(Ext.I# Int#
i#) = STRep s a -> ST s a
forall s a. STRep s a -> ST s a
ST (STRep s a -> ST s a) -> STRep s a -> ST s a
forall a b. (a -> b) -> a -> b
$ \ State# s
s ->
CHECK_BOUNDS("read", lengthM ary, _i)
MutableArray# s a -> Int# -> STRep s a
forall d a.
MutableArray# d a -> Int# -> State# d -> (# State# d, a #)
Ext.readArray# (MArray s a -> MutableArray# s a
forall s a. MArray s a -> MutableArray# s a
unMArray MArray s a
ary) Int#
i# State# s
s
{-# INLINE read #-}
write :: MArray s a -> Int -> a -> ST s ()
write :: MArray s a -> Int -> a -> ST s ()
write MArray s a
ary _i :: Int
_i@(Ext.I# Int#
i#) a
b = STRep s () -> ST s ()
forall s a. STRep s a -> ST s a
ST (STRep s () -> ST s ()) -> STRep s () -> ST s ()
forall a b. (a -> b) -> a -> b
$ \ State# s
s ->
CHECK_BOUNDS("write", lengthM ary, _i)
case MutableArray# s a -> Int# -> a -> State# s -> State# s
forall d a. MutableArray# d a -> Int# -> a -> State# d -> State# d
Ext.writeArray# (MArray s a -> MutableArray# s a
forall s a. MArray s a -> MutableArray# s a
unMArray MArray s a
ary) Int#
i# a
b State# s
s of
State# s
s' -> (# State# s
s' , () #)
{-# INLINE write #-}
index :: Array a -> Int -> a
index :: Array a -> Int -> a
index Array a
ary _i :: Int
_i@(Ext.I# Int#
i#) =
CHECK_BOUNDS("index", length ary, _i)
case Array# a -> Int# -> (# a #)
forall a. Array# a -> Int# -> (# a #)
Ext.indexArray# (Array a -> Array# a
forall a. Array a -> Array# a
unArray Array a
ary) Int#
i# of (# a
b #) -> a
b
{-# INLINE index #-}
index# :: Array a -> Int -> (# a #)
index# :: Array a -> Int -> (# a #)
index# Array a
ary _i :: Int
_i@(Ext.I# Int#
i#) =
CHECK_BOUNDS("index", length ary, _i)
Array# a -> Int# -> (# a #)
forall a. Array# a -> Int# -> (# a #)
Ext.indexArray# (Array a -> Array# a
forall a. Array a -> Array# a
unArray Array a
ary) Int#
i#
{-# INLINE index# #-}
index_ :: Array a -> Int -> ST s a
index_ :: Array a -> Int -> ST s a
index_ Array a
ary _i :: Int
_i@(Ext.I# Int#
i#) =
CHECK_BOUNDS("index_", length ary, _i)
case Array# a -> Int# -> (# a #)
forall a. Array# a -> Int# -> (# a #)
Ext.indexArray# (Array a -> Array# a
forall a. Array a -> Array# a
unArray Array a
ary) Int#
i# of (# a
b #) -> a -> ST s a
forall (m :: * -> *) a. Monad m => a -> m a
return a
b
{-# INLINE index_ #-}
indexM_ :: MArray s a -> Int -> ST s a
indexM_ :: MArray s a -> Int -> ST s a
indexM_ MArray s a
ary _i :: Int
_i@(Ext.I# Int#
i#) =
CHECK_BOUNDS("index_", lengthM ary, _i)
STRep s a -> ST s a
forall s a. STRep s a -> ST s a
ST (STRep s a -> ST s a) -> STRep s a -> ST s a
forall a b. (a -> b) -> a -> b
$ \ State# s
s# -> MutableArray# s a -> Int# -> STRep s a
forall d a.
MutableArray# d a -> Int# -> State# d -> (# State# d, a #)
Ext.readArray# (MArray s a -> MutableArray# s a
forall s a. MArray s a -> MutableArray# s a
unMArray MArray s a
ary) Int#
i# State# s
s#
{-# INLINE indexM_ #-}
unsafeFreeze :: MArray s a -> ST s (Array a)
unsafeFreeze :: MArray s a -> ST s (Array a)
unsafeFreeze MArray s a
mary
= STRep s (Array a) -> ST s (Array a)
forall s a. STRep s a -> ST s a
ST (STRep s (Array a) -> ST s (Array a))
-> STRep s (Array a) -> ST s (Array a)
forall a b. (a -> b) -> a -> b
$ \State# s
s -> case MutableArray# s a -> State# s -> (# State# s, Array# a #)
forall d a.
MutableArray# d a -> State# d -> (# State# d, Array# a #)
Ext.unsafeFreezeArray# (MArray s a -> MutableArray# s a
forall s a. MArray s a -> MutableArray# s a
unMArray MArray s a
mary) State# s
s of
(# State# s
s', Array# a
ary #) -> (# State# s
s', Array# a -> Int -> Array a
forall a. Array# a -> Int -> Array a
array Array# a
ary (MArray s a -> Int
forall s a. MArray s a -> Int
lengthM MArray s a
mary) #)
{-# INLINE unsafeFreeze #-}
unsafeThaw :: Array a -> ST s (MArray s a)
unsafeThaw :: Array a -> ST s (MArray s a)
unsafeThaw Array a
ary
= STRep s (MArray s a) -> ST s (MArray s a)
forall s a. STRep s a -> ST s a
ST (STRep s (MArray s a) -> ST s (MArray s a))
-> STRep s (MArray s a) -> ST s (MArray s a)
forall a b. (a -> b) -> a -> b
$ \State# s
s -> case Array# a -> State# s -> (# State# s, MutableArray# s a #)
forall a d.
Array# a -> State# d -> (# State# d, MutableArray# d a #)
Ext.unsafeThawArray# (Array a -> Array# a
forall a. Array a -> Array# a
unArray Array a
ary) State# s
s of
(# State# s
s', MutableArray# s a
mary #) -> (# State# s
s', MutableArray# s a -> Int -> MArray s a
forall s a. MutableArray# s a -> Int -> MArray s a
marray MutableArray# s a
mary (Array a -> Int
forall a. Array a -> Int
length Array a
ary) #)
{-# INLINE unsafeThaw #-}
run :: (forall s . ST s (MArray s e)) -> Array e
run :: (forall s. ST s (MArray s e)) -> Array e
run forall s. ST s (MArray s e)
act = (forall s. ST s (Array e)) -> Array e
forall a. (forall s. ST s a) -> a
runST ((forall s. ST s (Array e)) -> Array e)
-> (forall s. ST s (Array e)) -> Array e
forall a b. (a -> b) -> a -> b
$ ST s (MArray s e)
forall s. ST s (MArray s e)
act ST s (MArray s e)
-> (MArray s e -> ST s (Array e)) -> ST s (Array e)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= MArray s e -> ST s (Array e)
forall s a. MArray s a -> ST s (Array a)
unsafeFreeze
{-# INLINE run #-}
run2 :: (forall s. ST s (MArray s e, a)) -> (Array e, a)
run2 :: (forall s. ST s (MArray s e, a)) -> (Array e, a)
run2 forall s. ST s (MArray s e, a)
k = (forall s. ST s (Array e, a)) -> (Array e, a)
forall a. (forall s. ST s a) -> a
runST (do
(MArray s e
marr,a
b) <- ST s (MArray s e, a)
forall s. ST s (MArray s e, a)
k
Array e
arr <- MArray s e -> ST s (Array e)
forall s a. MArray s a -> ST s (Array a)
unsafeFreeze MArray s e
marr
(Array e, a) -> ST s (Array e, a)
forall (m :: * -> *) a. Monad m => a -> m a
return (Array e
arr,a
b))
copy :: Array e -> Int -> MArray s e -> Int -> Int -> ST s ()
#if __GLASGOW_HASKELL__ >= 702
copy :: Array e -> Int -> MArray s e -> Int -> Int -> ST s ()
copy !Array e
src !_sidx :: Int
_sidx@(Ext.I# Int#
sidx#) !MArray s e
dst !_didx :: Int
_didx@(Ext.I# Int#
didx#) _n :: Int
_n@(Ext.I# Int#
n#) =
CHECK_LE("copy", _sidx + _n, length src)
CHECK_LE("copy", _didx + _n, lengthM dst)
STRep s () -> ST s ()
forall s a. STRep s a -> ST s a
ST (STRep s () -> ST s ()) -> STRep s () -> ST s ()
forall a b. (a -> b) -> a -> b
$ \ State# s
s# ->
case Array# e
-> Int#
-> MutableArray# s e
-> Int#
-> Int#
-> State# s
-> State# s
forall a d.
Array# a
-> Int#
-> MutableArray# d a
-> Int#
-> Int#
-> State# d
-> State# d
Ext.copyArray# (Array e -> Array# e
forall a. Array a -> Array# a
unArray Array e
src) Int#
sidx# (MArray s e -> MutableArray# s e
forall s a. MArray s a -> MutableArray# s a
unMArray MArray s e
dst) Int#
didx# Int#
n# State# s
s# of
State# s
s2 -> (# State# s
s2, () #)
#else
copy !src !sidx !dst !didx n =
CHECK_LE("copy", sidx + n, length src)
CHECK_LE("copy", didx + n, lengthM dst)
copy_loop sidx didx 0
where
copy_loop !i !j !c
| c >= n = return ()
| otherwise = do b <- index_ src i
write dst j b
copy_loop (i+1) (j+1) (c+1)
#endif
copyM :: MArray s e -> Int -> MArray s e -> Int -> Int -> ST s ()
#if __GLASGOW_HASKELL__ >= 702
copyM :: MArray s e -> Int -> MArray s e -> Int -> Int -> ST s ()
copyM !MArray s e
src !_sidx :: Int
_sidx@(Ext.I# Int#
sidx#) !MArray s e
dst !_didx :: Int
_didx@(Ext.I# Int#
didx#) _n :: Int
_n@(Ext.I# Int#
n#) =
CHECK_BOUNDS("copyM: src", lengthM src, _sidx + _n - 1)
CHECK_BOUNDS("copyM: dst", lengthM dst, _didx + _n - 1)
STRep s () -> ST s ()
forall s a. STRep s a -> ST s a
ST (STRep s () -> ST s ()) -> STRep s () -> ST s ()
forall a b. (a -> b) -> a -> b
$ \ State# s
s# ->
case MutableArray# s e
-> Int#
-> MutableArray# s e
-> Int#
-> Int#
-> State# s
-> State# s
forall d a.
MutableArray# d a
-> Int#
-> MutableArray# d a
-> Int#
-> Int#
-> State# d
-> State# d
Ext.copyMutableArray# (MArray s e -> MutableArray# s e
forall s a. MArray s a -> MutableArray# s a
unMArray MArray s e
src) Int#
sidx# (MArray s e -> MutableArray# s e
forall s a. MArray s a -> MutableArray# s a
unMArray MArray s e
dst) Int#
didx# Int#
n# State# s
s# of
State# s
s2 -> (# State# s
s2, () #)
#else
copyM !src !sidx !dst !didx n =
CHECK_BOUNDS("copyM: src", lengthM src, sidx + n - 1)
CHECK_BOUNDS("copyM: dst", lengthM dst, didx + n - 1)
copy_loop sidx didx 0
where
copy_loop !i !j !c
| c >= n = return ()
| otherwise = do b <- indexM_ src i
write dst j b
copy_loop (i+1) (j+1) (c+1)
#endif
insert :: Array e -> Int -> e -> Array e
insert :: Array e -> Int -> e -> Array e
insert Array e
ary Int
idx e
b = (forall s. ST s (Array e)) -> Array e
forall a. (forall s. ST s a) -> a
runST (Array e -> Int -> e -> ST s (Array e)
forall e s. Array e -> Int -> e -> ST s (Array e)
insert' Array e
ary Int
idx e
b)
{-# INLINE insert #-}
insert' :: Array e -> Int -> e -> ST s (Array e)
insert' :: Array e -> Int -> e -> ST s (Array e)
insert' Array e
ary Int
idx e
b =
CHECK_BOUNDS("insert'", count + 1, idx)
do MArray s e
mary <- Int -> ST s (MArray s e)
forall s a. Int -> ST s (MArray s a)
new_ (Int
countInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1)
Array e -> Int -> MArray s e -> Int -> Int -> ST s ()
forall e s. Array e -> Int -> MArray s e -> Int -> Int -> ST s ()
copy Array e
ary Int
0 MArray s e
mary Int
0 Int
idx
MArray s e -> Int -> e -> ST s ()
forall s a. MArray s a -> Int -> a -> ST s ()
write MArray s e
mary Int
idx e
b
Array e -> Int -> MArray s e -> Int -> Int -> ST s ()
forall e s. Array e -> Int -> MArray s e -> Int -> Int -> ST s ()
copy Array e
ary Int
idx MArray s e
mary (Int
idxInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) (Int
countInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
idx)
MArray s e -> ST s (Array e)
forall s a. MArray s a -> ST s (Array a)
unsafeFreeze MArray s e
mary
where !count :: Int
count = Array e -> Int
forall a. Array a -> Int
length Array e
ary
{-# INLINE insert' #-}
update :: Array e -> Int -> e -> Array e
update :: Array e -> Int -> e -> Array e
update Array e
ary Int
idx e
b = (forall s. ST s (Array e)) -> Array e
forall a. (forall s. ST s a) -> a
runST (Array e -> Int -> e -> ST s (Array e)
forall e s. Array e -> Int -> e -> ST s (Array e)
update' Array e
ary Int
idx e
b)
{-# INLINE update #-}
update' :: Array e -> Int -> e -> ST s (Array e)
update' :: Array e -> Int -> e -> ST s (Array e)
update' Array e
ary Int
idx e
b =
CHECK_BOUNDS("update'", count, idx)
do MArray s e
mary <- Array e -> Int -> Int -> ST s (MArray s e)
forall e s. Array e -> Int -> Int -> ST s (MArray s e)
thaw Array e
ary Int
0 Int
count
MArray s e -> Int -> e -> ST s ()
forall s a. MArray s a -> Int -> a -> ST s ()
write MArray s e
mary Int
idx e
b
MArray s e -> ST s (Array e)
forall s a. MArray s a -> ST s (Array a)
unsafeFreeze MArray s e
mary
where !count :: Int
count = Array e -> Int
forall a. Array a -> Int
length Array e
ary
{-# INLINE update' #-}
updateWith :: Array e -> Int -> (e -> e) -> Array e
updateWith :: Array e -> Int -> (e -> e) -> Array e
updateWith Array e
ary Int
idx e -> e
f = Array e -> Int -> e -> Array e
forall e. Array e -> Int -> e -> Array e
update Array e
ary Int
idx (e -> Array e) -> e -> Array e
forall a b. (a -> b) -> a -> b
$! e -> e
f (Array e -> Int -> e
forall a. Array a -> Int -> a
index Array e
ary Int
idx)
{-# INLINE updateWith #-}
unsafeUpdate' :: Array e -> Int -> e -> ST s ()
unsafeUpdate' :: Array e -> Int -> e -> ST s ()
unsafeUpdate' Array e
ary Int
idx e
b =
CHECK_BOUNDS("unsafeUpdate'", length ary, idx)
do MArray s e
mary <- Array e -> ST s (MArray s e)
forall a s. Array a -> ST s (MArray s a)
unsafeThaw Array e
ary
MArray s e -> Int -> e -> ST s ()
forall s a. MArray s a -> Int -> a -> ST s ()
write MArray s e
mary Int
idx e
b
Array e
_ <- MArray s e -> ST s (Array e)
forall s a. MArray s a -> ST s (Array a)
unsafeFreeze MArray s e
mary
() -> ST s ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
{-# INLINE unsafeUpdate' #-}
foldl' :: (b -> a -> b) -> b -> Array a -> b
foldl' :: (b -> a -> b) -> b -> Array a -> b
foldl' b -> a -> b
f !b
z0 !Array a
ary0 = Array a -> Int -> Int -> b -> b
go Array a
ary0 (Array a -> Int
forall a. Array a -> Int
length Array a
ary0) Int
0 b
z0
where
go :: Array a -> Int -> Int -> b -> b
go !Array a
ary Int
n !Int
i !b
z
| Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
n = b
z
| (# a
x #) <- Array a -> Int -> (# a #)
forall a. Array a -> Int -> (# a #)
index# Array a
ary Int
i
= Array a -> Int -> Int -> b -> b
go Array a
ary Int
n (Int
iInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) (b -> a -> b
f b
z a
x)
{-# INLINE foldl' #-}
foldl :: (b -> a -> b) -> b -> Array a -> b
foldl :: (b -> a -> b) -> b -> Array a -> b
foldl b -> a -> b
f b
z0 !Array a
ary0 = Array a -> Int -> b -> b
go Array a
ary0 (Array a -> Int
forall a. Array a -> Int
length Array a
ary0) b
z0
where
go :: Array a -> Int -> b -> b
go !Array a
ary !Int
i b
z
| Int
i Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0 = b
z
| (# a
x #) <- Array a -> Int -> (# a #)
forall a. Array a -> Int -> (# a #)
index# Array a
ary (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)
= b -> a -> b
f (Array a -> Int -> b -> b
go Array a
ary (Int
iInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1) b
z) a
x
{-# INLINE foldl #-}
boundedFoldl' :: (b -> a -> b) -> Int -> Int -> b -> Array a -> b
boundedFoldl' :: (b -> a -> b) -> Int -> Int -> b -> Array a -> b
boundedFoldl' b -> a -> b
f !Int
start !Int
end b
z0 Array a
ary0 =
Array a -> Int -> Int -> b -> b
go Array a
ary0 (Int -> Int -> Int
forall a. Ord a => a -> a -> a
min Int
end (Array a -> Int
forall a. Array a -> Int
length Array a
ary0)) (Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
0 Int
start) b
z0
where
go :: Array a -> Int -> Int -> b -> b
go Array a
ary Int
n Int
i !b
z
| Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
n = b
z
| (# a
x #) <- Array a -> Int -> (# a #)
forall a. Array a -> Int -> (# a #)
index# Array a
ary Int
i
= Array a -> Int -> Int -> b -> b
go Array a
ary Int
n (Int
iInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) (b -> a -> b
f b
z a
x)
{-# INLINE boundedFoldl' #-}
foldr :: (a -> b -> b) -> b -> Array a -> b
foldr :: (a -> b -> b) -> b -> Array a -> b
foldr a -> b -> b
f b
z0 !Array a
ary0 = Array a -> Int -> Int -> b -> b
go Array a
ary0 (Array a -> Int
forall a. Array a -> Int
length Array a
ary0) Int
0 b
z0
where
go :: Array a -> Int -> Int -> b -> b
go !Array a
ary !Int
n !Int
i b
z
| Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
n = b
z
| (# a
x #) <- Array a -> Int -> (# a #)
forall a. Array a -> Int -> (# a #)
index# Array a
ary Int
i
= a -> b -> b
f a
x (Array a -> Int -> Int -> b -> b
go Array a
ary Int
n (Int
iInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) b
z)
{-# INLINE foldr #-}
foldr' :: (a -> b -> b) -> b -> Array a -> b
foldr' :: (a -> b -> b) -> b -> Array a -> b
foldr' a -> b -> b
f !b
z0 !Array a
ary0 = Array a -> Int -> b -> b
go Array a
ary0 (Array a -> Int
forall a. Array a -> Int
length Array a
ary0) b
z0
where
go :: Array a -> Int -> b -> b
go !Array a
ary !Int
i !b
z
| Int
i Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0 = b
z
| (# a
x #) <- Array a -> Int -> (# a #)
forall a. Array a -> Int -> (# a #)
index# Array a
ary (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)
= Array a -> Int -> b -> b
go Array a
ary (Int
iInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1) (a -> b -> b
f a
x b
z)
{-# INLINE foldr' #-}
boundedFoldr :: (a -> b -> b) -> Int -> Int -> b -> Array a -> b
boundedFoldr :: (a -> b -> b) -> Int -> Int -> b -> Array a -> b
boundedFoldr a -> b -> b
f !Int
start !Int
end b
z0 !Array a
ary0 =
Array a -> Int -> Int -> b -> b
go Array a
ary0 (Int -> Int -> Int
forall a. Ord a => a -> a -> a
min Int
end (Array a -> Int
forall a. Array a -> Int
length Array a
ary0)) (Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
0 Int
start) b
z0
where
go :: Array a -> Int -> Int -> b -> b
go !Array a
ary !Int
n !Int
i b
z
| Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
n = b
z
| (# a
x #) <- Array a -> Int -> (# a #)
forall a. Array a -> Int -> (# a #)
index# Array a
ary Int
i
= a -> b -> b
f a
x (Array a -> Int -> Int -> b -> b
go Array a
ary Int
n (Int
iInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) b
z)
{-# INLINE boundedFoldr #-}
undefinedElem :: a
undefinedElem :: a
undefinedElem = String -> a
forall a. HasCallStack => String -> a
error String
"Data.HashMap.Array: Undefined element"
{-# NOINLINE undefinedElem #-}
thaw :: Array e -> Int -> Int -> ST s (MArray s e)
#if __GLASGOW_HASKELL__ >= 702
thaw :: Array e -> Int -> Int -> ST s (MArray s e)
thaw !Array e
ary !_o :: Int
_o@(Ext.I# Int#
o#) !n :: Int
n@(Ext.I# Int#
n#) =
CHECK_LE("thaw", _o + n, length ary)
STRep s (MArray s e) -> ST s (MArray s e)
forall s a. STRep s a -> ST s a
ST (STRep s (MArray s e) -> ST s (MArray s e))
-> STRep s (MArray s e) -> ST s (MArray s e)
forall a b. (a -> b) -> a -> b
$ \ State# s
s -> case Array# e
-> Int# -> Int# -> State# s -> (# State# s, MutableArray# s e #)
forall a d.
Array# a
-> Int# -> Int# -> State# d -> (# State# d, MutableArray# d a #)
Ext.thawArray# (Array e -> Array# e
forall a. Array a -> Array# a
unArray Array e
ary) Int#
o# Int#
n# State# s
s of
(# State# s
s2, MutableArray# s e
mary# #) -> (# State# s
s2, MutableArray# s e -> Int -> MArray s e
forall s a. MutableArray# s a -> Int -> MArray s a
marray MutableArray# s e
mary# Int
n #)
#else
thaw !ary !o !n =
CHECK_LE("thaw", o + n, length ary)
do mary <- new_ n
copy ary o mary 0 n
return mary
#endif
{-# INLINE thaw #-}
delete :: Array e -> Int -> Array e
delete :: Array e -> Int -> Array e
delete Array e
ary Int
idx = (forall s. ST s (Array e)) -> Array e
forall a. (forall s. ST s a) -> a
runST (Array e -> Int -> ST s (Array e)
forall e s. Array e -> Int -> ST s (Array e)
delete' Array e
ary Int
idx)
{-# INLINE delete #-}
delete' :: Array e -> Int -> ST s (Array e)
delete' :: Array e -> Int -> ST s (Array e)
delete' Array e
ary Int
idx = do
MArray s e
mary <- Int -> ST s (MArray s e)
forall s a. Int -> ST s (MArray s a)
new_ (Int
countInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1)
Array e -> Int -> MArray s e -> Int -> Int -> ST s ()
forall e s. Array e -> Int -> MArray s e -> Int -> Int -> ST s ()
copy Array e
ary Int
0 MArray s e
mary Int
0 Int
idx
Array e -> Int -> MArray s e -> Int -> Int -> ST s ()
forall e s. Array e -> Int -> MArray s e -> Int -> Int -> ST s ()
copy Array e
ary (Int
idxInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) MArray s e
mary Int
idx (Int
countInt -> Int -> Int
forall a. Num a => a -> a -> a
-(Int
idxInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1))
MArray s e -> ST s (Array e)
forall s a. MArray s a -> ST s (Array a)
unsafeFreeze MArray s e
mary
where !count :: Int
count = Array e -> Int
forall a. Array a -> Int
length Array e
ary
{-# INLINE delete' #-}
map :: (a -> b) -> Array a -> Array b
map :: (a -> b) -> Array a -> Array b
map a -> b
f = \ Array a
ary ->
let !n :: Int
n = Array a -> Int
forall a. Array a -> Int
length Array a
ary
in (forall s. ST s (MArray s b)) -> Array b
forall e. (forall s. ST s (MArray s e)) -> Array e
run ((forall s. ST s (MArray s b)) -> Array b)
-> (forall s. ST s (MArray s b)) -> Array b
forall a b. (a -> b) -> a -> b
$ do
MArray s b
mary <- Int -> ST s (MArray s b)
forall s a. Int -> ST s (MArray s a)
new_ Int
n
Array a -> MArray s b -> Int -> Int -> ST s (MArray s b)
forall s. Array a -> MArray s b -> Int -> Int -> ST s (MArray s b)
go Array a
ary MArray s b
mary Int
0 Int
n
where
go :: Array a -> MArray s b -> Int -> Int -> ST s (MArray s b)
go Array a
ary MArray s b
mary Int
i Int
n
| Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
n = MArray s b -> ST s (MArray s b)
forall (m :: * -> *) a. Monad m => a -> m a
return MArray s b
mary
| Bool
otherwise = do
MArray s b -> Int -> b -> ST s ()
forall s a. MArray s a -> Int -> a -> ST s ()
write MArray s b
mary Int
i (b -> ST s ()) -> b -> ST s ()
forall a b. (a -> b) -> a -> b
$ a -> b
f (Array a -> Int -> a
forall a. Array a -> Int -> a
index Array a
ary Int
i)
Array a -> MArray s b -> Int -> Int -> ST s (MArray s b)
go Array a
ary MArray s b
mary (Int
iInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) Int
n
{-# INLINE map #-}
map' :: (a -> b) -> Array a -> Array b
map' :: (a -> b) -> Array a -> Array b
map' a -> b
f = \ Array a
ary ->
let !n :: Int
n = Array a -> Int
forall a. Array a -> Int
length Array a
ary
in (forall s. ST s (MArray s b)) -> Array b
forall e. (forall s. ST s (MArray s e)) -> Array e
run ((forall s. ST s (MArray s b)) -> Array b)
-> (forall s. ST s (MArray s b)) -> Array b
forall a b. (a -> b) -> a -> b
$ do
MArray s b
mary <- Int -> ST s (MArray s b)
forall s a. Int -> ST s (MArray s a)
new_ Int
n
Array a -> MArray s b -> Int -> Int -> ST s (MArray s b)
forall s. Array a -> MArray s b -> Int -> Int -> ST s (MArray s b)
go Array a
ary MArray s b
mary Int
0 Int
n
where
go :: Array a -> MArray s b -> Int -> Int -> ST s (MArray s b)
go Array a
ary MArray s b
mary Int
i Int
n
| Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
n = MArray s b -> ST s (MArray s b)
forall (m :: * -> *) a. Monad m => a -> m a
return MArray s b
mary
| Bool
otherwise = do
MArray s b -> Int -> b -> ST s ()
forall s a. MArray s a -> Int -> a -> ST s ()
write MArray s b
mary Int
i (b -> ST s ()) -> b -> ST s ()
forall a b. (a -> b) -> a -> b
$! a -> b
f (Array a -> Int -> a
forall a. Array a -> Int -> a
index Array a
ary Int
i)
Array a -> MArray s b -> Int -> Int -> ST s (MArray s b)
go Array a
ary MArray s b
mary (Int
iInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) Int
n
{-# INLINE map' #-}
fromList :: Int -> [a] -> Array a
fromList :: Int -> [a] -> Array a
fromList Int
n [a]
xs0 = (forall s. ST s (MArray s a)) -> Array a
forall e. (forall s. ST s (MArray s e)) -> Array e
run ((forall s. ST s (MArray s a)) -> Array a)
-> (forall s. ST s (MArray s a)) -> Array a
forall a b. (a -> b) -> a -> b
$ do
MArray s a
mary <- Int -> ST s (MArray s a)
forall s a. Int -> ST s (MArray s a)
new_ Int
n
[a] -> MArray s a -> Int -> ST s (MArray s a)
forall a s. [a] -> MArray s a -> Int -> ST s (MArray s a)
go [a]
xs0 MArray s a
mary Int
0
where
go :: [a] -> MArray s a -> Int -> ST s (MArray s a)
go [] !MArray s a
mary !Int
_ = MArray s a -> ST s (MArray s a)
forall (m :: * -> *) a. Monad m => a -> m a
return MArray s a
mary
go (a
x:[a]
xs) !MArray s a
mary !Int
i = do MArray s a -> Int -> a -> ST s ()
forall s a. MArray s a -> Int -> a -> ST s ()
write MArray s a
mary Int
i a
x
[a] -> MArray s a -> Int -> ST s (MArray s a)
go [a]
xs MArray s a
mary (Int
iInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1)
fromListRev :: Int -> [a] -> Array a
fromListRev :: Int -> [a] -> Array a
fromListRev Int
n [a]
xs0 = (forall s. ST s (MArray s a)) -> Array a
forall e. (forall s. ST s (MArray s e)) -> Array e
run ((forall s. ST s (MArray s a)) -> Array a)
-> (forall s. ST s (MArray s a)) -> Array a
forall a b. (a -> b) -> a -> b
$ do
MArray s a
mary <- Int -> ST s (MArray s a)
forall s a. Int -> ST s (MArray s a)
new_ Int
n
[a] -> MArray s a -> Int -> ST s (MArray s a)
forall a s. [a] -> MArray s a -> Int -> ST s (MArray s a)
go [a]
xs0 MArray s a
mary (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)
where
go :: [a] -> MArray s a -> Int -> ST s (MArray s a)
go [] !MArray s a
mary !Int
_ = MArray s a -> ST s (MArray s a)
forall (m :: * -> *) a. Monad m => a -> m a
return MArray s a
mary
go (a
x:[a]
xs) !MArray s a
mary !Int
i = do MArray s a -> Int -> a -> ST s ()
forall s a. MArray s a -> Int -> a -> ST s ()
write MArray s a
mary Int
i a
x
[a] -> MArray s a -> Int -> ST s (MArray s a)
go [a]
xs MArray s a
mary (Int
iInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1)
toList :: Array a -> [a]
toList :: Array a -> [a]
toList = (a -> [a] -> [a]) -> [a] -> Array a -> [a]
forall a b. (a -> b -> b) -> b -> Array a -> b
foldr (:) []
traverseArray :: A.Applicative f => (a -> f b) -> Array a -> f (Array b)
traverseArray :: (a -> f b) -> Array a -> f (Array b)
traverseArray a -> f b
f = \ Array a
ary -> Int -> [b] -> Array b
forall a. Int -> [a] -> Array a
fromList (Array a -> Int
forall a. Array a -> Int
length Array a
ary) ([b] -> Array b) -> f [b] -> f (Array b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap`
(a -> f b) -> [a] -> f [b]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
Traversable.traverse a -> f b
f (Array a -> [a]
forall a. Array a -> [a]
toList Array a
ary)
{-# INLINE traverseArray #-}
filter :: (a -> Bool) -> Array a -> Array a
filter :: (a -> Bool) -> Array a -> Array a
filter a -> Bool
p = \ Array a
ary ->
let !n :: Int
n = Array a -> Int
forall a. Array a -> Int
length Array a
ary
in (forall s. ST s (MArray s a)) -> Array a
forall e. (forall s. ST s (MArray s e)) -> Array e
run ((forall s. ST s (MArray s a)) -> Array a)
-> (forall s. ST s (MArray s a)) -> Array a
forall a b. (a -> b) -> a -> b
$ do
MArray s a
mary <- Int -> ST s (MArray s a)
forall s a. Int -> ST s (MArray s a)
new_ Int
n
Array a -> MArray s a -> Int -> Int -> Int -> ST s (MArray s a)
forall s.
Array a -> MArray s a -> Int -> Int -> Int -> ST s (MArray s a)
go Array a
ary MArray s a
mary Int
0 Int
0 Int
n
where
go :: Array a -> MArray s a -> Int -> Int -> Int -> ST s (MArray s a)
go Array a
ary MArray s a
mary Int
i Int
j Int
n
| Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
n = if Int
i Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
j
then MArray s a -> ST s (MArray s a)
forall (m :: * -> *) a. Monad m => a -> m a
return MArray s a
mary
else do MArray s a
mary2 <- Int -> ST s (MArray s a)
forall s a. Int -> ST s (MArray s a)
new_ Int
j
MArray s a -> Int -> MArray s a -> Int -> Int -> ST s ()
forall s e.
MArray s e -> Int -> MArray s e -> Int -> Int -> ST s ()
copyM MArray s a
mary Int
0 MArray s a
mary2 Int
0 Int
j
MArray s a -> ST s (MArray s a)
forall (m :: * -> *) a. Monad m => a -> m a
return MArray s a
mary2
| a -> Bool
p a
el = MArray s a -> Int -> a -> ST s ()
forall s a. MArray s a -> Int -> a -> ST s ()
write MArray s a
mary Int
j a
el ST s () -> ST s (MArray s a) -> ST s (MArray s a)
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Array a -> MArray s a -> Int -> Int -> Int -> ST s (MArray s a)
go Array a
ary MArray s a
mary (Int
iInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) (Int
jInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) Int
n
| Bool
otherwise = Array a -> MArray s a -> Int -> Int -> Int -> ST s (MArray s a)
go Array a
ary MArray s a
mary (Int
iInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) Int
j Int
n
where el :: a
el = Array a -> Int -> a
forall a. Array a -> Int -> a
index Array a
ary Int
i
{-# INLINE filter #-}