@@ -31,6 +31,7 @@ module Data.HashMap.Array
31
31
32
32
, unsafeFreeze
33
33
, unsafeThaw
34
+ , unsafeSameArray
34
35
, run
35
36
, run2
36
37
, copy
@@ -53,7 +54,7 @@ import qualified Data.Traversable as Traversable
53
54
import Control.Applicative (Applicative )
54
55
#endif
55
56
import Control.DeepSeq
56
- import GHC.Exts (Int (.. ))
57
+ import GHC.Exts (Int (.. ), Int #, reallyUnsafePtrEquality #, tagToEnum #, unsafeCoerce #, State # )
57
58
import GHC.ST (ST (.. ))
58
59
59
60
#if __GLASGOW_HASKELL__ >= 709
@@ -86,16 +87,57 @@ import Data.HashMap.Unsafe (runST)
86
87
type Array # a = SmallArray # a
87
88
type MutableArray # a = SmallMutableArray # a
88
89
90
+ newArray# :: Int # -> a -> State # d -> (# State # d , SmallMutableArray # d a # )
89
91
newArray# = 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 # )
90
99
readArray# = readSmallArray#
100
+
101
+ writeArray# :: SmallMutableArray # d a
102
+ -> Int # -> a -> State # d -> State # d
91
103
writeArray# = writeSmallArray#
104
+
105
+ indexArray# :: SmallArray # a -> Int # -> (# a # )
92
106
indexArray# = indexSmallArray#
93
- unsafeFreezeArray# = unsafeFreezeSmallArray#
107
+
108
+ unsafeThawArray# :: SmallArray # a
109
+ -> State # d -> (# State # d, SmallMutableArray # d a # )
94
110
unsafeThawArray# = unsafeThawSmallArray#
111
+
112
+ sizeofArray# :: SmallArray # a -> Int #
95
113
sizeofArray# = sizeofSmallArray#
114
+
115
+ copyArray# :: SmallArray # a
116
+ -> Int #
117
+ -> SmallMutableArray # d a
118
+ -> Int #
119
+ -> Int #
120
+ -> State # d
121
+ -> State # d
96
122
copyArray# = copySmallArray#
123
+
124
+ thawArray# :: SmallArray # a
125
+ -> Int #
126
+ -> Int #
127
+ -> State # d
128
+ -> (# State # d, SmallMutableArray # d a # )
97
129
thawArray# = thawSmallArray#
130
+
131
+ sizeofMutableArray# :: SmallMutableArray # s a -> Int #
98
132
sizeofMutableArray# = sizeofSmallMutableArray#
133
+
134
+ copyMutableArray# :: SmallMutableArray # d a
135
+ -> Int #
136
+ -> SmallMutableArray # d a
137
+ -> Int #
138
+ -> Int #
139
+ -> State # d
140
+ -> State # d
99
141
copyMutableArray# = copySmallMutableArray#
100
142
#endif
101
143
@@ -126,6 +168,13 @@ data Array a = Array {
126
168
instance Show a => Show (Array a ) where
127
169
show = show . toList
128
170
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
+
129
178
length :: Array a -> Int
130
179
length ary = I # (sizeofArray# (unArray ary))
131
180
{-# INLINE length #-}
0 commit comments