Add unsafeInit and unsafeTail
authorRoman Leshchinskiy <rl@cse.unsw.edu.au>
Wed, 9 Dec 2009 14:21:11 +0000 (14:21 +0000)
committerRoman Leshchinskiy <rl@cse.unsw.edu.au>
Wed, 9 Dec 2009 14:21:11 +0000 (14:21 +0000)
Data/Vector.hs
Data/Vector/Generic.hs
Data/Vector/Primitive.hs
Data/Vector/Storable.hs
Data/Vector/Unboxed.hs

index 4e6a96f..b51f0bc 100644 (file)
@@ -28,7 +28,7 @@ module Data.Vector (
 
   -- * Subvectors
   slice, init, tail, take, drop,
-  unsafeSlice,
+  unsafeSlice, unsafeInit, unsafeTail,
 
   -- * Permutations
   accum, accumulate, accumulate_,
@@ -262,15 +262,6 @@ slice :: Int   -- ^ starting index
 {-# INLINE slice #-}
 slice = G.slice
 
--- | Unsafely yield a part of the vector without copying it and without
--- performing bounds checks.
-unsafeSlice :: Int   -- ^ starting index
-            -> Int   -- ^ length
-            -> Vector a
-            -> Vector a
-{-# INLINE unsafeSlice #-}
-unsafeSlice = G.unsafeSlice
-
 -- | Yield all but the last element without copying.
 init :: Vector a -> Vector a
 {-# INLINE init #-}
@@ -291,6 +282,23 @@ drop :: Int -> Vector a -> Vector a
 {-# INLINE drop #-}
 drop = G.drop
 
+unsafeInit :: Vector a -> Vector a
+{-# INLINE unsafeInit #-}
+unsafeInit = G.unsafeInit
+
+unsafeTail :: Vector a -> Vector a
+{-# INLINE unsafeTail #-}
+unsafeTail = G.unsafeTail
+
+-- | Unsafely yield a part of the vector without copying it and without
+-- performing bounds checks.
+unsafeSlice :: Int   -- ^ starting index
+            -> Int   -- ^ length
+            -> Vector a
+            -> Vector a
+{-# INLINE unsafeSlice #-}
+unsafeSlice = G.unsafeSlice
+
 -- Permutations
 -- ------------
 
index 6c1b112..788dc93 100644 (file)
@@ -29,7 +29,7 @@ module Data.Vector.Generic (
 
   -- * Subvectors
   slice, init, tail, take, drop,
-  unsafeSlice,
+  unsafeSlice, unsafeInit, unsafeTail,
 
   -- * Permutations
   accum, accumulate, accumulate_,
@@ -415,16 +415,6 @@ slice :: Vector v a => Int   -- ^ starting index
 slice i n v = BOUNDS_CHECK(checkSlice) "slice" i n (length v)
             $ basicUnsafeSlice i n v
 
--- | Unsafely yield a part of the vector without copying it and without
--- performing bounds checks.
-unsafeSlice :: Vector v a => Int   -- ^ starting index
-                          -> Int   -- ^ length
-                          -> v a
-                          -> v a
-{-# INLINE_STREAM unsafeSlice #-}
-unsafeSlice i n v = UNSAFE_CHECK(checkSlice) "unsafeSlice" i n (length v)
-                  $ basicUnsafeSlice i n v
-
 -- | Yield all but the last element without copying.
 init :: Vector v a => v a -> v a
 {-# INLINE_STREAM init #-}
@@ -448,14 +438,29 @@ drop n v = slice (min n' len) (max 0 (len - n')) v
   where n' = max n 0
         len = length v
 
+-- | Unsafely yield a part of the vector without copying it and without
+-- performing bounds checks.
+unsafeSlice :: Vector v a => Int   -- ^ starting index
+                          -> Int   -- ^ length
+                          -> v a
+                          -> v a
+{-# INLINE_STREAM unsafeSlice #-}
+unsafeSlice i n v = UNSAFE_CHECK(checkSlice) "unsafeSlice" i n (length v)
+                  $ basicUnsafeSlice i n v
+
+unsafeInit :: Vector v a => v a -> v a
+{-# INLINE_STREAM unsafeInit #-}
+unsafeInit v = unsafeSlice 0 (length v - 1) v
+
+unsafeTail :: Vector v a => v a -> v a
+{-# INLINE_STREAM unsafeTail #-}
+unsafeTail v = unsafeSlice 1 (length v - 1) v
+
 {-# RULES
 
 "slice/new [Vector]" forall i n v p.
   slice i n (new' v p) = new' v (New.slice i n p)
 
-"unsafeSlice/new [Vector]" forall i n v p.
-  unsafeSlice i n (new' v p) = new' v (New.unsafeSlice i n p)
-
 "init/new [Vector]" forall v p.
   init (new' v p) = new' v (New.init p)
 
@@ -468,6 +473,15 @@ drop n v = slice (min n' len) (max 0 (len - n')) v
 "drop/new [Vector]" forall n v p.
   drop n (new' v p) = new' v (New.drop n p)
 
+"unsafeSlice/new [Vector]" forall i n v p.
+  unsafeSlice i n (new' v p) = new' v (New.unsafeSlice i n p)
+
+"unsafeInit/new [Vector]" forall v p.
+  unsafeInit (new' v p) = new' v (New.unsafeInit p)
+
+"unsafeTail/new [Vector]" forall v p.
+  unsafeTail (new' v p) = new' v (New.unsafeTail p)
+
   #-}
 
 -- Permutations
index f570478..ad2cb8f 100644 (file)
@@ -28,7 +28,7 @@ module Data.Vector.Primitive (
 
   -- * Subvectors
   slice, init, tail, take, drop,
-  unsafeSlice,
+  unsafeSlice, unsafeInit, unsafeTail,
 
   -- * Permutations
   accum, accumulate_, (//), update_, backpermute, reverse,
@@ -263,15 +263,6 @@ slice :: Prim a => Int   -- ^ starting index
 {-# INLINE slice #-}
 slice = G.slice
 
--- | Unsafely yield a part of the vector without copying it and without
--- performing bounds checks.
-unsafeSlice :: Prim a => Int   -- ^ starting index
-                      -> Int   -- ^ length
-                      -> Vector a
-                      -> Vector a
-{-# INLINE unsafeSlice #-}
-unsafeSlice = G.unsafeSlice
-
 -- | Yield all but the last element without copying.
 init :: Prim a => Vector a -> Vector a
 {-# INLINE init #-}
@@ -292,6 +283,23 @@ drop :: Prim a => Int -> Vector a -> Vector a
 {-# INLINE drop #-}
 drop = G.drop
 
+-- | Unsafely yield a part of the vector without copying it and without
+-- performing bounds checks.
+unsafeSlice :: Prim a => Int   -- ^ starting index
+                      -> Int   -- ^ length
+                      -> Vector a
+                      -> Vector a
+{-# INLINE unsafeSlice #-}
+unsafeSlice = G.unsafeSlice
+
+unsafeInit :: Prim a => Vector a -> Vector a
+{-# INLINE unsafeInit #-}
+unsafeInit = G.unsafeInit
+
+unsafeTail :: Prim a => Vector a -> Vector a
+{-# INLINE unsafeTail #-}
+unsafeTail = G.unsafeTail
+
 -- Permutations
 -- ------------
 
index e3c5ba5..3bc333f 100644 (file)
@@ -28,7 +28,7 @@ module Data.Vector.Storable (
 
   -- * Subvectors
   slice, init, tail, take, drop,
-  unsafeSlice,
+  unsafeSlice, unsafeInit, unsafeTail,
 
   -- * Permutations
   accum, accumulate_, (//), update_, backpermute, reverse,
@@ -294,15 +294,6 @@ slice :: Storable a => Int   -- ^ starting index
 {-# INLINE slice #-}
 slice = G.slice
 
--- | Unsafely yield a part of the vector without copying it and without
--- performing bounds checks.
-unsafeSlice :: Storable a => Int   -- ^ starting index
-                          -> Int   -- ^ length
-                          -> Vector a
-                          -> Vector a
-{-# INLINE unsafeSlice #-}
-unsafeSlice = G.unsafeSlice
-
 -- | Yield all but the last element without copying.
 init :: Storable a => Vector a -> Vector a
 {-# INLINE init #-}
@@ -323,6 +314,23 @@ drop :: Storable a => Int -> Vector a -> Vector a
 {-# INLINE drop #-}
 drop = G.drop
 
+-- | Unsafely yield a part of the vector without copying it and without
+-- performing bounds checks.
+unsafeSlice :: Storable a => Int   -- ^ starting index
+                          -> Int   -- ^ length
+                          -> Vector a
+                          -> Vector a
+{-# INLINE unsafeSlice #-}
+unsafeSlice = G.unsafeSlice
+
+unsafeInit :: Storable a => Vector a -> Vector a
+{-# INLINE unsafeInit #-}
+unsafeInit = G.unsafeInit
+
+unsafeTail :: Storable a => Vector a -> Vector a
+{-# INLINE unsafeTail #-}
+unsafeTail = G.unsafeTail
+
 -- Permutations
 -- ------------
 
index 054b3da..5703ecd 100644 (file)
@@ -26,7 +26,7 @@ module Data.Vector.Unboxed (
 
   -- * Subvectors
   slice, init, tail, take, drop,
-  unsafeSlice,
+  unsafeSlice, unsafeInit, unsafeTail,
 
   -- * Permutations
   accum, accumulate, accumulate_,
@@ -235,15 +235,6 @@ slice :: Unbox a => Int   -- ^ starting index
 {-# INLINE slice #-}
 slice = G.slice
 
--- | Unsafely yield a part of the vector without copying it and without
--- performing bounds checks.
-unsafeSlice :: Unbox a => Int   -- ^ starting index
-                       -> Int   -- ^ length
-                       -> Vector a
-                       -> Vector a
-{-# INLINE unsafeSlice #-}
-unsafeSlice = G.unsafeSlice
-
 -- | Yield all but the last element without copying.
 init :: Unbox a => Vector a -> Vector a
 {-# INLINE init #-}
@@ -264,6 +255,23 @@ drop :: Unbox a => Int -> Vector a -> Vector a
 {-# INLINE drop #-}
 drop = G.drop
 
+-- | Unsafely yield a part of the vector without copying it and without
+-- performing bounds checks.
+unsafeSlice :: Unbox a => Int   -- ^ starting index
+                       -> Int   -- ^ length
+                       -> Vector a
+                       -> Vector a
+{-# INLINE unsafeSlice #-}
+unsafeSlice = G.unsafeSlice
+
+unsafeInit :: Unbox a => Vector a -> Vector a
+{-# INLINE unsafeInit #-}
+unsafeInit = G.unsafeInit
+
+unsafeTail :: Unbox a => Vector a -> Vector a
+{-# INLINE unsafeTail #-}
+unsafeTail = G.unsafeTail
+
 -- Permutations
 -- ------------