Type family mapping each Vector to its MVector
authorRoman Leshchinskiy <rl@cse.unsw.edu.au>
Fri, 4 Dec 2009 15:31:52 +0000 (15:31 +0000)
committerRoman Leshchinskiy <rl@cse.unsw.edu.au>
Fri, 4 Dec 2009 15:31:52 +0000 (15:31 +0000)
Data/Vector.hs
Data/Vector/Generic.hs
Data/Vector/Primitive.hs
Data/Vector/Storable.hs

index a8832c1..62caaa0 100644 (file)
@@ -1,4 +1,4 @@
-{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}
+{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses, TypeFamilies #-}
 
 -- |
 -- Module      : Data.Vector
@@ -95,6 +95,8 @@ data Vector a = Vector {-# UNPACK #-} !Int
 instance Show a => Show (Vector a) where
     show = (Prelude.++ " :: Data.Vector.Vector") . ("fromList " Prelude.++) . show . toList
 
+type instance G.Mutable Vector = MVector
+
 instance G.Vector Vector a where
   {-# INLINE basicNew #-}
   basicNew init = runST (do
index 71f6b31..dcaf7bd 100644 (file)
@@ -1,5 +1,5 @@
 {-# LANGUAGE Rank2Types, MultiParamTypeClasses, FlexibleContexts,
-             ScopedTypeVariables #-}
+             TypeFamilies, ScopedTypeVariables #-}
 -- |
 -- Module      : Data.Vector.Generic
 -- Copyright   : (c) Roman Leshchinskiy 2008-2009
@@ -14,7 +14,7 @@
 
 module Data.Vector.Generic (
   -- * Immutable vectors
-  Vector(..),
+  Vector(..), Mutable,
 
   -- * Length information
   length, null,
@@ -104,11 +104,13 @@ import Prelude hiding ( length, null,
 
 #include "vector.h"
 
+type family Mutable (v :: * -> *) :: * -> * -> *
+
 -- | Class of immutable vectors.
 --
-class Vector v a where
+class MVector (Mutable v) a => Vector v a where
   -- | Construct a pure vector from a monadic initialiser (not fusible!)
-  basicNew     :: (forall mv s. MVector mv a => ST s (mv s a)) -> v a
+  basicNew     :: (forall s. ST s (Mutable v s a)) -> v a
 
   -- | Length of the vector (not fusible!)
   basicLength      :: v a -> Int
index ae22357..8bab50e 100644 (file)
@@ -1,4 +1,4 @@
-{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}
+{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses, TypeFamilies #-}
 
 -- |
 -- Module      : Data.Vector.Primitive
@@ -95,6 +95,8 @@ data Vector a = Vector {-# UNPACK #-} !Int
 instance (Show a, Prim a) => Show (Vector a) where
     show = (Prelude.++ " :: Data.Vector.Primitive.Vector") . ("fromList " Prelude.++) . show . toList
 
+type instance G.Mutable Vector = MVector
+
 instance Prim a => G.Vector Vector a where
   {-# INLINE basicNew #-}
   basicNew init = runST (do
index cf63af1..4a20261 100644 (file)
@@ -1,4 +1,4 @@
-{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, TypeFamilies #-}
 
 -- |
 -- Module      : Data.Vector.Storable
@@ -100,6 +100,8 @@ instance (Show a, Storable a) => Show (Vector a) where
        . show
        . toList
 
+type instance G.Mutable Vector = MVector
+
 instance Storable a => G.Vector Vector a where
   {-# INLINE basicNew #-}
   basicNew init = runST (do