Split Unboxed.Unbox and rename stuff
[darcs-mirrors/vector.git] / Data / Vector / Unboxed / Prim.hs
1 {-# LANGUAGE MagicHash, UnboxedTuples, ScopedTypeVariables #-}
2
3 module Data.Vector.Unboxed.Prim (
4 Unbox(..), Vector, MutableVector,
5
6 size, new, unsafeFreeze, at, read, write
7 ) where
8
9 import Data.Vector.Unboxed.Unbox
10
11 import GHC.Prim (
12 ByteArray#, MutableByteArray#,
13 newByteArray#, unsafeFreezeByteArray#,
14 )
15 import GHC.ST (
16 ST(..)
17 )
18 import GHC.Base (
19 Int(..)
20 )
21
22 import Prelude hiding ( read )
23
24 data Vector a = Vector ByteArray#
25 data MutableVector s a = MutableVector (MutableByteArray# s)
26
27 size :: Unbox a => a -> Int -> Int
28 {-# INLINE size #-}
29 size a (I# i#) = I# (size# a i#)
30
31 new :: forall s a. Unbox a => Int -> ST s (MutableVector s a)
32 {-# INLINE new #-}
33 new (I# n#) = ST $ \s# ->
34 case newByteArray# (size# (undefined :: a) n#) s# of
35 (# s2#, arr# #) -> (# s2#, MutableVector arr# #)
36
37 unsafeFreeze :: Unbox a => MutableVector s a -> ST s (Vector a)
38 {-# INLINE unsafeFreeze #-}
39 unsafeFreeze (MutableVector arr#) = ST $ \s# ->
40 case unsafeFreezeByteArray# arr# s# of
41 (# s2, frozen# #) -> (# s2, Vector frozen# #)
42
43 at :: Unbox a => Vector a -> Int -> a
44 {-# INLINE at #-}
45 at (Vector arr#) (I# i#) = at# arr# i#
46
47 read :: Unbox a => MutableVector s a -> Int -> ST s a
48 {-# INLINE read #-}
49 read (MutableVector arr#) (I# i#) = ST $ read# arr# i#
50
51 write :: Unbox a => MutableVector s a -> Int -> a -> ST s ()
52 {-# INLINE write #-}
53 write (MutableVector arr#) (I# i#) x = ST $ \s# ->
54 case write# arr# i# x s# of s2# -> (# s2#, () #)
55