@@ -31,6 +31,7 @@ module Data.HashMap.Array
3131
3232 , unsafeFreeze
3333 , unsafeThaw
34+ , unsafeSameArray
3435 , run
3536 , run2
3637 , copy
@@ -53,7 +54,7 @@ import qualified Data.Traversable as Traversable
5354import Control.Applicative (Applicative )
5455#endif
5556import Control.DeepSeq
56- import GHC.Exts (Int (.. ))
57+ import GHC.Exts (Int (.. ), Int #, reallyUnsafePtrEquality #, tagToEnum #, unsafeCoerce #, State # )
5758import GHC.ST (ST (.. ))
5859
5960#if __GLASGOW_HASKELL__ >= 709
@@ -86,16 +87,57 @@ import Data.HashMap.Unsafe (runST)
8687type Array # a = SmallArray # a
8788type MutableArray # a = SmallMutableArray # a
8889
90+ newArray# :: Int # -> a -> State # d -> (# State # d , SmallMutableArray # d a # )
8991newArray# = newSmallArray#
92+
93+ unsafeFreezeArray# :: SmallMutableArray # d a
94+ -> State # d -> (# State # d, SmallArray # a # )
95+ unsafeFreezeArray# = unsafeFreezeSmallArray#
96+
97+ readArray# :: SmallMutableArray # d a
98+ -> Int # -> State # d -> (# State # d, a # )
9099readArray# = readSmallArray#
100+
101+ writeArray# :: SmallMutableArray # d a
102+ -> Int # -> a -> State # d -> State # d
91103writeArray# = writeSmallArray#
104+
105+ indexArray# :: SmallArray # a -> Int # -> (# a # )
92106indexArray# = indexSmallArray#
93- unsafeFreezeArray# = unsafeFreezeSmallArray#
107+
108+ unsafeThawArray# :: SmallArray # a
109+ -> State # d -> (# State # d, SmallMutableArray # d a # )
94110unsafeThawArray# = unsafeThawSmallArray#
111+
112+ sizeofArray# :: SmallArray # a -> Int #
95113sizeofArray# = sizeofSmallArray#
114+
115+ copyArray# :: SmallArray # a
116+ -> Int #
117+ -> SmallMutableArray # d a
118+ -> Int #
119+ -> Int #
120+ -> State # d
121+ -> State # d
96122copyArray# = copySmallArray#
123+
124+ thawArray# :: SmallArray # a
125+ -> Int #
126+ -> Int #
127+ -> State # d
128+ -> (# State # d, SmallMutableArray # d a # )
97129thawArray# = thawSmallArray#
130+
131+ sizeofMutableArray# :: SmallMutableArray # s a -> Int #
98132sizeofMutableArray# = sizeofSmallMutableArray#
133+
134+ copyMutableArray# :: SmallMutableArray # d a
135+ -> Int #
136+ -> SmallMutableArray # d a
137+ -> Int #
138+ -> Int #
139+ -> State # d
140+ -> State # d
99141copyMutableArray# = copySmallMutableArray#
100142#endif
101143
@@ -126,6 +168,13 @@ data Array a = Array {
126168instance Show a => Show (Array a ) where
127169 show = show . toList
128170
171+ -- Determines whether two arrays have the same memory address.
172+ -- This is more reliable than testing pointer equality on the
173+ -- Array wrappers, but it's still somewhat bogus.
174+ unsafeSameArray :: Array a -> Array b -> Bool
175+ unsafeSameArray (Array xs) (Array ys) =
176+ tagToEnum# (unsafeCoerce# reallyUnsafePtrEquality# xs ys)
177+
129178length :: Array a -> Int
130179length ary = I # (sizeofArray# (unArray ary))
131180{-# INLINE length #-}
0 commit comments