new -> vnew
authorRoman Leshchinskiy <rl@cse.unsw.edu.au>
Sat, 12 Jul 2008 07:45:02 +0000 (07:45 +0000)
committerRoman Leshchinskiy <rl@cse.unsw.edu.au>
Sat, 12 Jul 2008 07:45:02 +0000 (07:45 +0000)
Data/Vector.hs
Data/Vector/IVector.hs
Data/Vector/Unboxed.hs

index 8537a49..78355d2 100644 (file)
@@ -30,12 +30,11 @@ data Vector a = Vector {-# UNPACK #-} !Int
                                       (Array# a)
 
 instance IVector Vector a where
                                       (Array# a)
 
 instance IVector Vector a where
-  {-# INLINE new #-}
-  new init = runST (do
-                      Mut.Vector i n marr# <- init
-                      ST (\s# -> case unsafeFreezeArray# marr# s# of
-                              (# s2#, arr# #) -> (# s2#, Vector i n arr# #)
-                            ))
+  {-# INLINE vnew #-}
+  vnew init = runST (do
+                       Mut.Vector i n marr# <- init
+                       ST (\s# -> case unsafeFreezeArray# marr# s# of
+                               (# s2#, arr# #) -> (# s2#, Vector i n arr# #)))
 
   {-# INLINE vlength #-}
   vlength (Vector _ n _) = n
 
   {-# INLINE vlength #-}
   vlength (Vector _ n _) = n
index 4c9fe2c..89b4e7a 100644 (file)
@@ -54,7 +54,7 @@ module Data.Vector.IVector (
   unsafeSlice, unsafeIndex,
 
   -- * Utility functions
   unsafeSlice, unsafeIndex,
 
   -- * Utility functions
-  vlength
+  vlength, vnew
 ) where
 
 import qualified Data.Vector.MVector as MVector
 ) where
 
 import qualified Data.Vector.MVector as MVector
@@ -78,8 +78,8 @@ import Prelude hiding ( length,
 -- | Class of immutable vectors.
 --
 class IVector v a where
 -- | Class of immutable vectors.
 --
 class IVector v a where
-  -- | Construct a pure vector from a monadic initialiser.
-  new       :: (forall mv m. MVector mv m a => m (mv a)) -> v a
+  -- | Construct a pure vector from a monadic initialiser (not fusible!)
+  vnew         :: (forall mv m. MVector mv m a => m (mv a)) -> v a
 
   -- | Length of the vector (not fusible!)
   vlength      :: v a -> Int
 
   -- | Length of the vector (not fusible!)
   vlength      :: v a -> Int
@@ -108,6 +108,14 @@ class IVector v a where
   --
   unsafeIndex  :: v a -> Int -> (a -> b) -> b
 
   --
   unsafeIndex  :: v a -> Int -> (a -> b) -> b
 
+-- Fusion
+-- ------
+
+-- | Construct a pure vector from a monadic initialiser 
+new :: IVector v a => (forall mv m. MVector mv m a => m (mv a)) -> v a
+{-# INLINE_STREAM new #-}
+new init = vnew init
+
 -- | Convert a vector to a 'Stream'
 stream :: IVector v a => v a -> Stream a
 {-# INLINE_STREAM stream #-}
 -- | Convert a vector to a 'Stream'
 stream :: IVector v a => v a -> Stream a
 {-# INLINE_STREAM stream #-}
index 022f1ab..fffada5 100644 (file)
@@ -31,12 +31,11 @@ data Vector a = Vector {-# UNPACK #-} !Int
                                       ByteArray#
 
 instance Unbox a => IVector Vector a where
                                       ByteArray#
 
 instance Unbox a => IVector Vector a where
-  {-# INLINE new #-}
-  new init = runST (do
-                      Mut.Vector i n marr# <- init
-                      ST (\s# -> case unsafeFreezeByteArray# marr# s# of
-                           (# s2#, arr# #) -> (# s2#, Vector i n arr# #)
-                         ))
+  {-# INLINE vnew #-}
+  vnew init = runST (do
+                       Mut.Vector i n marr# <- init
+                       ST (\s# -> case unsafeFreezeByteArray# marr# s# of
+                            (# s2#, arr# #) -> (# s2#, Vector i n arr# #)))
 
   {-# INLINE vlength #-}
   vlength (Vector _ n _) = n
 
   {-# INLINE vlength #-}
   vlength (Vector _ n _) = n