From 54a23e67a2f9d1225ad3f13f55a38bb145acfaba Mon Sep 17 00:00:00 2001 From: David Feuer Date: Tue, 12 Jan 2021 18:41:14 -0500 Subject: [PATCH] Use eager indexing for !? * Make `(!?)` extract a value from the vector eagerly. * Make the range check for `(!?)` use one comparison instead of two. --- Data/Vector/Generic.hs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Data/Vector/Generic.hs b/Data/Vector/Generic.hs index 507bf7d5..099e0534 100644 --- a/Data/Vector/Generic.hs +++ b/Data/Vector/Generic.hs @@ -241,8 +241,13 @@ infixl 9 !? -- | O(1) Safe indexing (!?) :: Vector v a => v a -> Int -> Maybe a {-# INLINE_FUSED (!?) #-} -v !? i | i < 0 || i >= length v = Nothing - | otherwise = Just $ unsafeIndex v i +-- Lengths are never negative, so we can check 0 <= i < length v +-- using one unsigned comparison. +v !? i | (fromIntegral i :: Word) >= fromIntegral (length v) + = Nothing + | otherwise + -- Use basicUnsafeIndexM @Maybe to perform the indexing eagerly. + = basicUnsafeIndexM v i -- | /O(1)/ First element head :: Vector v a => v a -> a