Skip to content

Commit 88bb3bc

Browse files
authored
Merge pull request haskell-unordered-containers#181 from treeowl/alterF-sidetrack
Add `alterF` for `HashMap` (Matt Renaud) and optimize it with `RULES` (David Feuer).
2 parents 180891e + 2300044 commit 88bb3bc

File tree

8 files changed

+891
-69
lines changed

8 files changed

+891
-69
lines changed

CHANGES.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## next
2+
3+
* Add `HashMap.alterF`.
4+
15
## 0.2.9.0
26

37
* Add `Ord/Ord1/Ord2` instances. (Thanks, Oleg Grenrus)

Data/HashMap/Array.hs

Lines changed: 51 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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
5354
import Control.Applicative (Applicative)
5455
#endif
5556
import Control.DeepSeq
56-
import GHC.Exts(Int(..))
57+
import GHC.Exts(Int(..), Int#, reallyUnsafePtrEquality#, tagToEnum#, unsafeCoerce#, State#)
5758
import GHC.ST (ST(..))
5859

5960
#if __GLASGOW_HASKELL__ >= 709
@@ -86,16 +87,57 @@ import Data.HashMap.Unsafe (runST)
8687
type Array# a = SmallArray# a
8788
type MutableArray# a = SmallMutableArray# a
8889

90+
newArray# :: Int# -> a -> State# d -> (# State# d, SmallMutableArray# d a #)
8991
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 #)
9099
readArray# = readSmallArray#
100+
101+
writeArray# :: SmallMutableArray# d a
102+
-> Int# -> a -> State# d -> State# d
91103
writeArray# = writeSmallArray#
104+
105+
indexArray# :: SmallArray# a -> Int# -> (# a #)
92106
indexArray# = indexSmallArray#
93-
unsafeFreezeArray# = unsafeFreezeSmallArray#
107+
108+
unsafeThawArray# :: SmallArray# a
109+
-> State# d -> (# State# d, SmallMutableArray# d a #)
94110
unsafeThawArray# = unsafeThawSmallArray#
111+
112+
sizeofArray# :: SmallArray# a -> Int#
95113
sizeofArray# = sizeofSmallArray#
114+
115+
copyArray# :: SmallArray# a
116+
-> Int#
117+
-> SmallMutableArray# d a
118+
-> Int#
119+
-> Int#
120+
-> State# d
121+
-> State# d
96122
copyArray# = copySmallArray#
123+
124+
thawArray# :: SmallArray# a
125+
-> Int#
126+
-> Int#
127+
-> State# d
128+
-> (# State# d, SmallMutableArray# d a #)
97129
thawArray# = thawSmallArray#
130+
131+
sizeofMutableArray# :: SmallMutableArray# s a -> Int#
98132
sizeofMutableArray# = sizeofSmallMutableArray#
133+
134+
copyMutableArray# :: SmallMutableArray# d a
135+
-> Int#
136+
-> SmallMutableArray# d a
137+
-> Int#
138+
-> Int#
139+
-> State# d
140+
-> State# d
99141
copyMutableArray# = copySmallMutableArray#
100142
#endif
101143

@@ -126,6 +168,13 @@ data Array a = Array {
126168
instance 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+
129178
length :: Array a -> Int
130179
length ary = I# (sizeofArray# (unArray ary))
131180
{-# INLINE length #-}

0 commit comments

Comments
 (0)