Replace basicNew by unsafeFreeze
authorRoman Leshchinskiy <rl@cse.unsw.edu.au>
Fri, 4 Dec 2009 15:55:45 +0000 (15:55 +0000)
committerRoman Leshchinskiy <rl@cse.unsw.edu.au>
Fri, 4 Dec 2009 15:55:45 +0000 (15:55 +0000)
Data/Vector.hs
Data/Vector/Generic.hs
Data/Vector/Primitive.hs
Data/Vector/Storable.hs

index 62caaa0..9fe6f6b 100644 (file)
@@ -71,7 +71,7 @@ import qualified Data.Vector.Generic as G
 import           Data.Vector.Mutable  ( MVector(..) )
 import           Data.Primitive.Array
 
-import Control.Monad.ST ( runST )
+import Control.Monad ( liftM )
 
 import Prelude hiding ( length, null,
                         replicate, (++),
@@ -98,11 +98,9 @@ instance Show a => Show (Vector a) where
 type instance G.Mutable Vector = MVector
 
 instance G.Vector Vector a where
-  {-# INLINE basicNew #-}
-  basicNew init = runST (do
-                           MVector i n marr <- init
-                           arr <- unsafeFreezeArray marr
-                           return (Vector i n arr))
+  {-# INLINE unsafeFreeze #-}
+  unsafeFreeze (MVector i n marr)
+    = Vector i n `liftM` unsafeFreezeArray marr
 
   {-# INLINE basicLength #-}
   basicLength (Vector _ n _) = n
index dcaf7bd..1f20186 100644 (file)
@@ -88,7 +88,8 @@ import qualified Data.Vector.Fusion.Stream.Monadic as MStream
 import           Data.Vector.Fusion.Stream.Size
 import           Data.Vector.Fusion.Util
 
-import Control.Monad.ST ( ST )
+import Control.Monad.ST ( runST )
+import Control.Monad.Primitive
 import Prelude hiding ( length, null,
                         replicate, (++),
                         head, last,
@@ -109,8 +110,10 @@ type family Mutable (v :: * -> *) :: * -> * -> *
 -- | Class of immutable vectors.
 --
 class MVector (Mutable v) a => Vector v a where
-  -- | Construct a pure vector from a monadic initialiser (not fusible!)
-  basicNew     :: (forall s. ST s (Mutable v s a)) -> v a
+  -- | Unsafely convert a mutable vector to its immutable version
+  -- without copying. The mutable vector may not be used after
+  -- this operation.
+  unsafeFreeze :: PrimMonad m => Mutable v (PrimState m) a -> m (v a)
 
   -- | Length of the vector (not fusible!)
   basicLength      :: v a -> Int
@@ -155,7 +158,9 @@ new m = new' undefined m
 -- See http://hackage.haskell.org/trac/ghc/ticket/2600
 new' :: Vector v a => v a -> New a -> v a
 {-# INLINE_STREAM new' #-}
-new' _ m = basicNew (New.run m)
+new' _ m = runST (do
+                    mv <- New.run m
+                    unsafeFreeze mv)
 
 -- | Convert a vector to a 'Stream'
 stream :: Vector v a => v a -> Stream a
index 8bab50e..6356ec4 100644 (file)
@@ -70,7 +70,7 @@ import           Data.Vector.Primitive.Mutable ( MVector(..) )
 import           Data.Primitive.ByteArray
 import           Data.Primitive ( Prim )
 
-import Control.Monad.ST ( runST )
+import Control.Monad ( liftM )
 
 import Prelude hiding ( length, null,
                         replicate, (++),
@@ -98,11 +98,9 @@ instance (Show a, Prim a) => Show (Vector a) where
 type instance G.Mutable Vector = MVector
 
 instance Prim a => G.Vector Vector a where
-  {-# INLINE basicNew #-}
-  basicNew init = runST (do
-                           MVector i n marr <- init
-                           arr <- unsafeFreezeByteArray marr
-                           return (Vector i n arr))
+  {-# INLINE unsafeFreeze #-}
+  unsafeFreeze (MVector i n marr)
+    = Vector i n `liftM` unsafeFreezeByteArray marr
 
   {-# INLINE basicLength #-}
   basicLength (Vector _ n _) = n
index 4a20261..e312e27 100644 (file)
@@ -103,10 +103,8 @@ instance (Show a, Storable a) => Show (Vector a) where
 type instance G.Mutable Vector = MVector
 
 instance Storable a => G.Vector Vector a where
-  {-# INLINE basicNew #-}
-  basicNew init = runST (do
-                           MVector i n p <- (id :: ST s (MVector s a) -> ST s (MVector s a)) init
-                           return (Vector i n p))
+  {-# INLINE unsafeFreeze #-}
+  unsafeFreeze (MVector i n p) = return $ Vector i n p
 
   {-# INLINE basicLength #-}
   basicLength (Vector _ n _) = n