df5c68fa68a82ffccd9071a50880ee5579478e6f
[darcs-mirrors/vector.git] / Data / Vector / Prim.hs
1 {-# LANGUAGE MagicHash, UnboxedTuples #-}
2
3 module Data.Vector.Prim (
4 Vector, MutableVector,
5 new, new', unsafeFreeze, at, at', read, write
6 ) where
7
8 import GHC.Prim (
9 Array#, MutableArray#,
10 newArray#, readArray#, writeArray#, indexArray#, unsafeFreezeArray#
11 )
12 import GHC.ST (
13 ST(..)
14 )
15 import GHC.Base (
16 Int(..)
17 )
18
19 import Prelude hiding ( read )
20
21 data Vector a = Vector (Array# a)
22 data MutableVector s a = MutableVector (MutableArray# s a)
23
24 new :: Int -> ST s (MutableVector s a)
25 {-# INLINE new #-}
26 new n = new' n (error "Data.Vector: uninitialised element")
27
28 new' :: Int -> a -> ST s (MutableVector s a)
29 {-# INLINE new' #-}
30 new' (I# n#) x = ST $ \s# ->
31 case newArray# n# x s# of
32 (# s2#, arr# #) -> (# s2#, MutableVector arr# #)
33
34 unsafeFreeze :: MutableVector s a -> ST s (Vector a)
35 {-# INLINE unsafeFreeze #-}
36 unsafeFreeze (MutableVector arr#) = ST $ \s# ->
37 case unsafeFreezeArray# arr# s# of
38 (# s2, frozen# #) -> (# s2, Vector frozen# #)
39
40 at :: Vector a -> Int -> a
41 {-# INLINE at #-}
42 at v i = at' v i id
43
44 at' :: Vector a -> Int -> (a -> b) -> b
45 {-# INLINE at' #-}
46 at' (Vector arr#) (I# n#) f = case indexArray# arr# n# of (# x #) -> f x
47
48 read :: MutableVector s a -> Int -> ST s a
49 {-# INLINE read #-}
50 read (MutableVector arr#) (I# n#) = ST $ readArray# arr# n#
51
52 write :: MutableVector s a -> Int -> a -> ST s ()
53 {-# INLINE write #-}
54 write (MutableVector arr#) (I# n#) x = ST $ \s# ->
55 case writeArray# arr# n# x s# of s2# -> (# s2#, () #)
56