Fusible length
authorRoman Leshchinskiy <rl@cse.unsw.edu.au>
Sat, 12 Jul 2008 04:32:16 +0000 (04:32 +0000)
committerRoman Leshchinskiy <rl@cse.unsw.edu.au>
Sat, 12 Jul 2008 04:32:16 +0000 (04:32 +0000)
Data/Vector.hs
Data/Vector/IVector.hs
Data/Vector/Unboxed.hs

index f661d6e..5d79a33 100644 (file)
@@ -40,8 +40,8 @@ instance IVector Vector a where
                               (# s2#, arr# #) -> (# s2#, Vector i n arr# #)
                             )
 
-  {-# INLINE length #-}
-  length (Vector _ n _) = n
+  {-# INLINE vlength #-}
+  vlength (Vector _ n _) = n
 
   {-# INLINE unsafeSlice #-}
   unsafeSlice (Vector i _ arr#) j n = Vector (i+j) n arr#
index 0f01cbc..2e0288d 100644 (file)
@@ -51,7 +51,10 @@ module Data.Vector.IVector (
   create,
 
   -- * Unsafe functions
-  unsafeSlice, unsafeIndex
+  unsafeSlice, unsafeIndex,
+
+  -- * Utility functions
+  vlength
 ) where
 
 import qualified Data.Vector.MVector as MVector
@@ -79,8 +82,8 @@ class IVector v a where
   -- | Construct a pure vector from a monadic initialiser.
   create       :: (forall mv m. MVector mv m a => m (mv m a)) -> v a
 
-  -- | Length of the vector
-  length       :: v a -> Int
+  -- | Length of the vector (not fusible!)
+  vlength      :: v a -> Int
 
   -- | Yield a part of the vector without copying it. No range checks!
   unsafeSlice  :: v a -> Int -> Int -> v a
@@ -129,6 +132,20 @@ unstream s = create (MVector.unstream s)
 
  #-}
 
+-- Length
+-- ------
+
+length :: IVector v a => v a -> Int
+{-# INLINE_STREAM length #-}
+length v = vlength v
+
+{-# RULES
+
+"length/unstream [IVector]" forall s.
+  length (unstream s) = Stream.length s
+
+  #-}
+
 -- Construction
 -- ------------
 
index 2d51f29..794c95e 100644 (file)
@@ -41,8 +41,8 @@ instance Unbox a => IVector Vector a where
                               (# s2#, arr# #) -> (# s2#, Vector i n arr# #)
                             )
 
-  {-# INLINE length #-}
-  length (Vector _ n _) = n
+  {-# INLINE vlength #-}
+  vlength (Vector _ n _) = n
 
   {-# INLINE unsafeSlice #-}
   unsafeSlice (Vector i _ arr#) j n = Vector (i+j) n arr#