Add function for safe indexing
authorKhudyakov Alexey <alexey.skladnoy@gmail.com>
Tue, 27 Jul 2010 21:25:32 +0000 (21:25 +0000)
committerKhudyakov Alexey <alexey.skladnoy@gmail.com>
Tue, 27 Jul 2010 21:25:32 +0000 (21:25 +0000)
Data/Vector.hs
Data/Vector/Generic.hs
Data/Vector/Primitive.hs
Data/Vector/Storable.hs
Data/Vector/Unboxed.hs

index 6899884..e48ee13 100644 (file)
@@ -32,7 +32,7 @@ module Data.Vector (
   length, null,
 
   -- ** Indexing
-  (!), head, last,
+  (!), (!?), head, last,
   unsafeIndex, unsafeHead, unsafeLast,
 
   -- ** Monadic indexing
@@ -265,6 +265,11 @@ null = G.null
 {-# INLINE (!) #-}
 (!) = (G.!)
 
+-- | O(1) Safe indexing
+(!?) :: Vector a -> Int -> Maybe a
+{-# INLINE (!?) #-}
+(!?) = (G.!?)
+
 -- | /O(1)/ First element
 head :: Vector a -> a
 {-# INLINE head #-}
index 26b3185..218efbf 100644 (file)
@@ -22,7 +22,7 @@ module Data.Vector.Generic (
   length, null,
 
   -- ** Indexing
-  (!), head, last,
+  (!), (!?), head, last,
   unsafeIndex, unsafeHead, unsafeLast,
 
   -- ** Monadic indexing
@@ -222,6 +222,12 @@ null v = basicLength v == 0
 v ! i = BOUNDS_CHECK(checkIndex) "(!)" i (length v)
       $ unId (basicUnsafeIndexM v i)
 
+-- | O(1) Safe indexing
+(!?) :: Vector v a => v a -> Int -> Maybe a
+{-# INLINE_STREAM (!?) #-}
+v !? i | i < 0 || i >= length v = Nothing
+       | otherwise              = Just $ unsafeIndex v i
+
 -- | /O(1)/ First element
 head :: Vector v a => v a -> a
 {-# INLINE_STREAM head #-}
index f642b59..99e9b86 100644 (file)
@@ -25,7 +25,7 @@ module Data.Vector.Primitive (
   length, null,
 
   -- ** Indexing
-  (!), head, last,
+  (!), (!?), head, last,
   unsafeIndex, unsafeHead, unsafeLast,
 
   -- ** Monadic indexing
@@ -265,6 +265,11 @@ null = G.null
 {-# INLINE (!) #-}
 (!) = (G.!)
 
+-- | O(1) Safe indexing
+(!?) :: Prim a => Vector a -> Int -> Maybe a
+{-# INLINE (!?) #-}
+(!?) = (G.!?)
+
 -- | /O(1)/ First element
 head :: Prim a => Vector a -> a
 {-# INLINE head #-}
index 9554cb5..499648f 100644 (file)
@@ -22,7 +22,7 @@ module Data.Vector.Storable (
   length, null,
 
   -- ** Indexing
-  (!), head, last,
+  (!), (!?), head, last,
   unsafeIndex, unsafeHead, unsafeLast,
 
   -- ** Monadic indexing
@@ -274,6 +274,11 @@ null = G.null
 {-# INLINE (!) #-}
 (!) = (G.!)
 
+-- | O(1) Safe indexing
+(!?) :: Storable a => Vector a -> Int -> Maybe a
+{-# INLINE (!?) #-}
+(!?) = (G.!?)
+
 -- | /O(1)/ First element
 head :: Storable a => Vector a -> a
 {-# INLINE head #-}
index d147e04..c3313b1 100644 (file)
@@ -45,7 +45,7 @@ module Data.Vector.Unboxed (
   length, null,
 
   -- ** Indexing
-  (!), head, last,
+  (!), (!?), head, last,
   unsafeIndex, unsafeHead, unsafeLast,
 
   -- ** Monadic indexing
@@ -241,6 +241,11 @@ null = G.null
 {-# INLINE (!) #-}
 (!) = (G.!)
 
+-- | O(1) Safe indexing
+(!?) :: Unbox a => Vector a -> Int -> Maybe a
+{-# INLINE (!?) #-}
+(!?) = (G.!?)
+
 -- | /O(1)/ First element
 head :: Unbox a => Vector a -> a
 {-# INLINE head #-}