Fusilbe indexing
authorRoman Leshchinskiy <rl@cse.unsw.edu.au>
Sat, 12 Jul 2008 04:34:20 +0000 (04:34 +0000)
committerRoman Leshchinskiy <rl@cse.unsw.edu.au>
Sat, 12 Jul 2008 04:34:20 +0000 (04:34 +0000)
Data/Vector/IVector.hs

index 2e0288d..18e5dab 100644 (file)
@@ -185,20 +185,33 @@ v ++ w = unstream (stream v Stream.++ stream w)
 
 -- | Indexing
 (!) :: IVector v a => v a -> Int -> a
-{-# INLINE (!) #-}
+{-# INLINE_STREAM (!) #-}
 v ! i = assert (i >= 0 && i < length v)
       $ unsafeIndex v i id
 
 -- | First element
 head :: IVector v a => v a -> a
-{-# INLINE head #-}
+{-# INLINE_STREAM head #-}
 head v = v ! 0
 
 -- | Last element
 last :: IVector v a => v a -> a
-{-# INLINE last #-}
+{-# INLINE_STREAM last #-}
 last v = v ! (length v - 1)
 
+{-# RULES
+
+"(!)/unstream [IVector]" forall i s.
+  unstream s ! i = s Stream.!! i
+
+"head/unstream [IVector]" forall s.
+  head (unstream s) = Stream.head s
+
+"last/unstream [IVector]" forall s.
+  last (unstream s) = Stream.last s
+
+ #-}
+
 -- Subarrays
 -- ---------