@@ -163,7 +163,7 @@ module Data.Vector (
163
163
toList , Data.Vector. fromList , Data.Vector. fromListN ,
164
164
165
165
-- ** Arrays
166
- fromArray , toArray ,
166
+ toArray , fromArray , toArraySlice , unsafeFromArraySlice ,
167
167
168
168
-- ** Other vector types
169
169
G. convert ,
@@ -2136,16 +2136,43 @@ fromListN = G.fromListN
2136
2136
-- @since 0.12.2.0
2137
2137
fromArray :: Array a -> Vector a
2138
2138
{-# INLINE fromArray #-}
2139
- fromArray x = Vector 0 (sizeofArray x) x
2139
+ fromArray arr = Vector 0 (sizeofArray arr) arr
2140
2140
2141
2141
-- | /O(n)/ Convert a vector to an array.
2142
2142
--
2143
2143
-- @since 0.12.2.0
2144
2144
toArray :: Vector a -> Array a
2145
2145
{-# INLINE toArray #-}
2146
- toArray (Vector offset size arr)
2147
- | offset == 0 && size == sizeofArray arr = arr
2148
- | otherwise = cloneArray arr offset size
2146
+ toArray (Vector offset len arr)
2147
+ | offset == 0 && len == sizeofArray arr = arr
2148
+ | otherwise = cloneArray arr offset len
2149
+
2150
+ -- | /O(1)/ Extract the underlying `Array`, offset where vector starts and the
2151
+ -- total number of elements in the vector. Below property always holds:
2152
+ --
2153
+ -- > let (array, offset, len) = toArraySlice v
2154
+ -- > v === unsafeFromArraySlice len offset array
2155
+ --
2156
+ -- @since 0.13.0.0
2157
+ toArraySlice :: Vector a -> (Array a , Int , Int )
2158
+ {-# INLINE toArraySlice #-}
2159
+ toArraySlice (Vector offset len arr) = (arr, offset, len)
2160
+
2161
+
2162
+ -- | /O(1)/ Convert an array slice to a vector. This function is very unsafe,
2163
+ -- because constructing an invalid vector can yield almost all other safe
2164
+ -- functions in this module unsafe. These are equivalent:
2165
+ --
2166
+ -- > unsafeFromArraySlice len offset === unsafeTake len . unsafeDrop offset . fromArray
2167
+ --
2168
+ -- @since 0.13.0.0
2169
+ unsafeFromArraySlice ::
2170
+ Array a -- ^ Immutable boxed array.
2171
+ -> Int -- ^ Offset
2172
+ -> Int -- ^ Length
2173
+ -> Vector a
2174
+ {-# INLINE unsafeFromArraySlice #-}
2175
+ unsafeFromArraySlice arr offset len = Vector offset len arr
2149
2176
2150
2177
-- Conversions - Mutable vectors
2151
2178
-- -----------------------------
0 commit comments