@@ -29,6 +29,7 @@ module Data.HashMap.Array
29
29
, insertM
30
30
, delete
31
31
, sameArray1
32
+ , trim
32
33
33
34
, unsafeFreeze
34
35
, unsafeThaw
@@ -70,13 +71,13 @@ import Prelude hiding (filter, foldr, length, map, read)
70
71
import GHC.Exts (SmallArray #, newSmallArray #, readSmallArray #, writeSmallArray #,
71
72
indexSmallArray #, unsafeFreezeSmallArray #, unsafeThawSmallArray #,
72
73
SmallMutableArray #, sizeofSmallArray #, copySmallArray #, thawSmallArray #,
73
- sizeofSmallMutableArray #, copySmallMutableArray #)
74
+ sizeofSmallMutableArray #, copySmallMutableArray #, cloneSmallMutableArray # )
74
75
75
76
#else
76
77
import GHC.Exts (Array #, newArray #, readArray #, writeArray #,
77
78
indexArray #, unsafeFreezeArray #, unsafeThawArray #,
78
79
MutableArray #, sizeofArray #, copyArray #, thawArray #,
79
- sizeofMutableArray #, copyMutableArray #)
80
+ sizeofMutableArray #, copyMutableArray #, cloneMutableArray # )
80
81
#endif
81
82
82
83
#if defined(ASSERTS)
@@ -125,6 +126,13 @@ copyArray# :: SmallArray# a
125
126
-> State # d
126
127
copyArray# = copySmallArray#
127
128
129
+ cloneMutableArray# :: SmallMutableArray # s a
130
+ -> Int #
131
+ -> Int #
132
+ -> State # s
133
+ -> (# State # s, SmallMutableArray # s a # )
134
+ cloneMutableArray# = cloneSmallMutableArray#
135
+
128
136
thawArray# :: SmallArray # a
129
137
-> Int #
130
138
-> Int #
@@ -329,6 +337,19 @@ copyM !src !_sidx@(I# sidx#) !dst !_didx@(I# didx#) _n@(I# n#) =
329
337
case copyMutableArray# (unMArray src) sidx# (unMArray dst) didx# n# s# of
330
338
s2 -> (# s2, () # )
331
339
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
+
332
353
-- | /O(n)/ Insert an element at the given position in this array,
333
354
-- increasing its size by one.
334
355
insert :: Array e -> Int -> e -> Array e
0 commit comments