@@ -29,6 +29,7 @@ module Data.HashMap.Array
2929 , insertM
3030 , delete
3131 , sameArray1
32+ , trim
3233
3334 , unsafeFreeze
3435 , unsafeThaw
@@ -70,13 +71,13 @@ import Prelude hiding (filter, foldr, length, map, read)
7071import GHC.Exts (SmallArray #, newSmallArray #, readSmallArray #, writeSmallArray #,
7172 indexSmallArray #, unsafeFreezeSmallArray #, unsafeThawSmallArray #,
7273 SmallMutableArray #, sizeofSmallArray #, copySmallArray #, thawSmallArray #,
73- sizeofSmallMutableArray #, copySmallMutableArray #)
74+ sizeofSmallMutableArray #, copySmallMutableArray #, cloneSmallMutableArray # )
7475
7576#else
7677import GHC.Exts (Array #, newArray #, readArray #, writeArray #,
7778 indexArray #, unsafeFreezeArray #, unsafeThawArray #,
7879 MutableArray #, sizeofArray #, copyArray #, thawArray #,
79- sizeofMutableArray #, copyMutableArray #)
80+ sizeofMutableArray #, copyMutableArray #, cloneMutableArray # )
8081#endif
8182
8283#if defined(ASSERTS)
@@ -125,6 +126,13 @@ copyArray# :: SmallArray# a
125126 -> State # d
126127copyArray# = copySmallArray#
127128
129+ cloneMutableArray# :: SmallMutableArray # s a
130+ -> Int #
131+ -> Int #
132+ -> State # s
133+ -> (# State # s, SmallMutableArray # s a # )
134+ cloneMutableArray# = cloneSmallMutableArray#
135+
128136thawArray# :: SmallArray # a
129137 -> Int #
130138 -> Int #
@@ -329,6 +337,19 @@ copyM !src !_sidx@(I# sidx#) !dst !_didx@(I# didx#) _n@(I# n#) =
329337 case copyMutableArray# (unMArray src) sidx# (unMArray dst) didx# n# s# of
330338 s2 -> (# s2, () # )
331339
340+ cloneM :: MArray s a -> Int -> Int -> ST s (MArray s a )
341+ cloneM _mary@ (MArray mary# ) _off@ (I # off# ) _len@ (I # len# ) =
342+ CHECK_BOUNDS (" cloneM_off" , lengthM _mary, _off - 1 )
343+ CHECK_BOUNDS (" cloneM_end" , lengthM _mary, _off + _len - 1 )
344+ ST $ \ s ->
345+ case cloneMutableArray# mary# off# len# s of
346+ (# s', mary'# # ) -> (# s', MArray mary'# # )
347+
348+ -- | Create a new array of the @n@ first elements of @mary@.
349+ trim :: MArray s a -> Int -> ST s (Array a )
350+ trim mary n = cloneM mary 0 n >>= unsafeFreeze
351+ {-# INLINE trim #-}
352+
332353-- | /O(n)/ Insert an element at the given position in this array,
333354-- increasing its size by one.
334355insert :: Array e -> Int -> e -> Array e
0 commit comments