@@ -62,6 +62,7 @@ module Data.Sequence (
62
62
(><) , -- :: Seq a -> Seq a -> Seq a
63
63
fromList , -- :: [a] -> Seq a
64
64
fromFunction , -- :: Int -> (Int -> a) -> Seq a
65
+ fromArray , -- :: Ix i => Array i a -> Seq a
65
66
-- ** Repetition
66
67
replicate , -- :: Int -> a -> Seq a
67
68
replicateA , -- :: Applicative f => Int -> f a -> f (Seq a)
@@ -180,6 +181,13 @@ import Text.Read (Lexeme(Ident), lexP, parens, prec,
180
181
import Data.Data
181
182
#endif
182
183
184
+ -- Array stuff, with GHC.Arr on GHC
185
+ import Data.Array (Ix , Array )
186
+ import qualified Data.Array
187
+ #ifdef __GLASGOW_HASKELL__
188
+ import qualified GHC.Arr
189
+ #endif
190
+
183
191
-- Coercion on GHC 7.8+
184
192
#if __GLASGOW_HASKELL__ >= 708
185
193
import Data.Coerce
@@ -1399,6 +1407,17 @@ fromFunction len f | len < 0 = error "Data.Sequence.fromFunction called with neg
1399
1407
#endif
1400
1408
{-# INLINE lift_elem #-}
1401
1409
1410
+ -- | /O(n)/. Create a sequence consisting of the elements of an 'Array'.
1411
+ -- Note that the resulting sequence elements may be evaluated lazily (as on GHC),
1412
+ -- so you must force the entire structure to be sure that the original array
1413
+ -- can be garbage-collected.
1414
+ fromArray :: Ix i => Array i a -> Seq a
1415
+ #ifdef __GLASGOW_HASKELL__
1416
+ fromArray a = fromFunction (GHC.Arr. numElements a) (GHC.Arr. unsafeAt a)
1417
+ #else
1418
+ fromArray a = fromList2 (Data.Array. rangeSize (Data.Array. bounds a)) (Data.Array. elems a)
1419
+ #endif
1420
+
1402
1421
-- Splitting
1403
1422
1404
1423
-- | /O(log(min(i,n-i)))/. The first @i@ elements of a sequence.
0 commit comments