Change handling of Monad in MVector and get rid of GADTs
[darcs-mirrors/vector.git] / Data / Vector / Unboxed / Mutable.hs
index 2dacab0..56e647f 100644 (file)
@@ -1,4 +1,4 @@
-{-# LANGUAGE MagicHash, UnboxedTuples, MultiParamTypeClasses, FlexibleInstances, GADTs, ScopedTypeVariables #-}
+{-# LANGUAGE MagicHash, UnboxedTuples, MultiParamTypeClasses, FlexibleInstances, ScopedTypeVariables #-}
 
 -- |
 -- Module      : Data.Vector.Unboxed.Mutable
@@ -16,7 +16,7 @@ module Data.Vector.Unboxed.Mutable ( Vector(..) )
 where
 
 import qualified Data.Vector.MVector as MVector
-import           Data.Vector.MVector ( MVector )
+import           Data.Vector.MVector ( MVector, MVectorPure )
 import           Data.Vector.Unboxed.Unbox
 
 import GHC.Prim ( MutableByteArray#,
@@ -26,25 +26,24 @@ import GHC.ST   ( ST(..) )
 
 import GHC.Base ( Int(..) )
 
-#ifndef __HADDOCK__
-data Vector m a where
-   Vector :: {-# UNPACK #-} !Int
-          -> {-# UNPACK #-} !Int
-          -> MutableByteArray# s
-          -> Vector (ST s) a
-#else
--- | Type of mutable unboxed vectors. This is actually a GADT:
---
--- > data Vector m a where
--- >   Vector :: !Int -> !Int -> MutableByteArray# s -> Vector (ST s) a
---
-data Vector m a = forall s. Vector !Int !Int (MutableByteArray# s)
-#endif
+-- | Mutable unboxed vectors. They live in the 'ST' monad.
+data Vector s a = Vector {-# UNPACK #-} !Int
+                         {-# UNPACK #-} !Int
+                                        (MutableByteArray# s)
 
-instance Unbox a => MVector Vector (ST s) a where
+instance Unbox a => MVectorPure (Vector s) a where
   length (Vector _ n _) = n
   unsafeSlice (Vector i _ arr#) j m = Vector (i+j) m arr#
 
+  {-# INLINE overlaps #-}
+  overlaps (Vector i m arr1#) (Vector j n arr2#)
+    = sameMutableByteArray# arr1# arr2#
+      && (between i j (j+n) || between j i (i+m))
+    where
+      between x y z = x >= y && x < z
+
+
+instance Unbox a => MVector (Vector s) (ST s) a where
   {-# INLINE unsafeNew #-}
   unsafeNew (I# n#) = ST (\s# ->
       case newByteArray# (size# (undefined :: a) n#) s# of
@@ -59,10 +58,4 @@ instance Unbox a => MVector Vector (ST s) a where
       case write# arr# (i# +# j#) x s# of s2# -> (# s2#, () #)
     )
 
-  {-# INLINE overlaps #-}
-  overlaps (Vector i m arr1#) (Vector j n arr2#)
-    = sameMutableByteArray# arr1# arr2#
-      && (between i j (j+n) || between j i (i+m))
-    where
-      between x y z = x >= y && x < z