Be explicitly strict in vector lengths more often to avoid triggering LiberateCase
authorRoman Leshchinskiy <rl@cse.unsw.edu.au>
Mon, 24 May 2010 03:22:22 +0000 (03:22 +0000)
committerRoman Leshchinskiy <rl@cse.unsw.edu.au>
Mon, 24 May 2010 03:22:22 +0000 (03:22 +0000)
Data/Vector/Generic.hs
Data/Vector/Generic/Mutable.hs

index c26bc9b..d97d66a 100644 (file)
@@ -1660,7 +1660,7 @@ unstream s = new (New.unstream s)
 -- | /O(1)/ Convert a vector to a 'Stream', proceeding from right to left
 streamR :: Vector v a => v a -> Stream a
 {-# INLINE_STREAM streamR #-}
 -- | /O(1)/ Convert a vector to a 'Stream', proceeding from right to left
 streamR :: Vector v a => v a -> Stream a
 {-# INLINE_STREAM streamR #-}
-streamR v = v `seq` (Stream.unfoldr get n `Stream.sized` Exact n)
+streamR v = v `seq` n `seq` (Stream.unfoldr get n `Stream.sized` Exact n)
   where
     n = length v
 
   where
     n = length v
 
index 1c056a5..bf00b10 100644 (file)
@@ -213,7 +213,7 @@ unsafePrepend1 v i x
 
 mstream :: (PrimMonad m, MVector v a) => v (PrimState m) a -> MStream m a
 {-# INLINE mstream #-}
 
 mstream :: (PrimMonad m, MVector v a) => v (PrimState m) a -> MStream m a
 {-# INLINE mstream #-}
-mstream v = v `seq` (MStream.unfoldrM get 0 `MStream.sized` Exact n)
+mstream v = v `seq` n `seq` (MStream.unfoldrM get 0 `MStream.sized` Exact n)
   where
     n = length v
 
   where
     n = length v
 
@@ -242,7 +242,7 @@ transform f v = fill v (f (mstream v))
 
 mstreamR :: (PrimMonad m, MVector v a) => v (PrimState m) a -> MStream m a
 {-# INLINE mstreamR #-}
 
 mstreamR :: (PrimMonad m, MVector v a) => v (PrimState m) a -> MStream m a
 {-# INLINE mstreamR #-}
-mstreamR v = v `seq` (MStream.unfoldrM get n `MStream.sized` Exact n)
+mstreamR v = v `seq` n `seq` (MStream.unfoldrM get n `MStream.sized` Exact n)
   where
     n = length v
 
   where
     n = length v
 
@@ -641,19 +641,23 @@ accum f !v s = Stream.mapM_ upd s
   where
     {-# INLINE_INNER upd #-}
     upd (i,b) = do
   where
     {-# INLINE_INNER upd #-}
     upd (i,b) = do
-                  a <- BOUNDS_CHECK(checkIndex) "accum" i (length v)
+                  a <- BOUNDS_CHECK(checkIndex) "accum" i n
                      $ unsafeRead v i
                   unsafeWrite v i (f a b)
 
                      $ unsafeRead v i
                   unsafeWrite v i (f a b)
 
+    !n = length v
+
 update :: (PrimMonad m, MVector v a)
                         => v (PrimState m) a -> Stream (Int, a) -> m ()
 {-# INLINE update #-}
 update !v s = Stream.mapM_ upd s
   where
     {-# INLINE_INNER upd #-}
 update :: (PrimMonad m, MVector v a)
                         => v (PrimState m) a -> Stream (Int, a) -> m ()
 {-# INLINE update #-}
 update !v s = Stream.mapM_ upd s
   where
     {-# INLINE_INNER upd #-}
-    upd (i,b) = BOUNDS_CHECK(checkIndex) "update" i (length v)
+    upd (i,b) = BOUNDS_CHECK(checkIndex) "update" i n
               $ unsafeWrite v i b
 
               $ unsafeWrite v i b
 
+    !n = length v
+
 unsafeAccum :: (PrimMonad m, MVector v a)
             => (a -> b -> a) -> v (PrimState m) a -> Stream (Int, b) -> m ()
 {-# INLINE unsafeAccum #-}
 unsafeAccum :: (PrimMonad m, MVector v a)
             => (a -> b -> a) -> v (PrimState m) a -> Stream (Int, b) -> m ()
 {-# INLINE unsafeAccum #-}
@@ -661,19 +665,23 @@ unsafeAccum f !v s = Stream.mapM_ upd s
   where
     {-# INLINE_INNER upd #-}
     upd (i,b) = do
   where
     {-# INLINE_INNER upd #-}
     upd (i,b) = do
-                  a <- UNSAFE_CHECK(checkIndex) "accum" i (length v)
+                  a <- UNSAFE_CHECK(checkIndex) "accum" i n
                      $ unsafeRead v i
                   unsafeWrite v i (f a b)
 
                      $ unsafeRead v i
                   unsafeWrite v i (f a b)
 
+    !n = length v
+
 unsafeUpdate :: (PrimMonad m, MVector v a)
                         => v (PrimState m) a -> Stream (Int, a) -> m ()
 {-# INLINE unsafeUpdate #-}
 unsafeUpdate !v s = Stream.mapM_ upd s
   where
     {-# INLINE_INNER upd #-}
 unsafeUpdate :: (PrimMonad m, MVector v a)
                         => v (PrimState m) a -> Stream (Int, a) -> m ()
 {-# INLINE unsafeUpdate #-}
 unsafeUpdate !v s = Stream.mapM_ upd s
   where
     {-# INLINE_INNER upd #-}
-    upd (i,b) = UNSAFE_CHECK(checkIndex) "accum" i (length v)
+    upd (i,b) = UNSAFE_CHECK(checkIndex) "accum" i n
                   $ unsafeWrite v i b
 
                   $ unsafeWrite v i b
 
+    !n = length v
+
 reverse :: (PrimMonad m, MVector v a) => v (PrimState m) a -> m ()
 {-# INLINE reverse #-}
 reverse !v = reverse_loop 0 (length v - 1)
 reverse :: (PrimMonad m, MVector v a) => v (PrimState m) a -> m ()
 {-# INLINE reverse #-}
 reverse !v = reverse_loop 0 (length v - 1)