diff --git a/bench/Main.hs b/bench/Main.hs
--- a/bench/Main.hs
+++ b/bench/Main.hs
@@ -11,7 +11,6 @@
 import qualified Data.ByteString          as BS
 import qualified Data.ByteString.Internal as BSI
 import qualified Data.Vector.Storable     as DVS
-import qualified System.IO                as IO
 import qualified System.IO.MMap           as IO
 
 setupEnvByteString :: FilePath -> IO BS.ByteString
@@ -29,14 +28,12 @@
 sumFileByteString :: FilePath -> IO ()
 sumFileByteString filePath = do
   !(bs :: BS.ByteString) <- mmapVectorLike filePath
-  IO.hPutStrLn IO.stderr $ "Length ByteString: " <> show (BS.length bs)
   let !_ = BS.foldl' (+) 0 bs
   return ()
 
 sumFileVectorWord64 :: FilePath -> IO ()
 sumFileVectorWord64 filePath = do
   !(v :: DVS.Vector Word64) <- mmapVectorLike filePath
-  IO.hPutStrLn IO.stderr $ "Length Vector: " <> show (DVS.length v)
   let !_ = DVS.foldl' (+) 0 v
   return ()
 
diff --git a/hw-prim.cabal b/hw-prim.cabal
--- a/hw-prim.cabal
+++ b/hw-prim.cabal
@@ -2,10 +2,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 7744d3568e3de865cd0c785d38ad2c2519a9b44316d31e88a922d3802c35aa05
+-- hash: 9557d04243ece405165f6a9004bb89861952430c1af773a2563ac554b528a5f5
 
 name:           hw-prim
-version:        0.5.0.3
+version:        0.5.0.4
 synopsis:       Primitive functions and data types
 description:    Please see README.md
 category:       Data
diff --git a/src/HaskellWorks/Data/AtIndex.hs b/src/HaskellWorks/Data/AtIndex.hs
--- a/src/HaskellWorks/Data/AtIndex.hs
+++ b/src/HaskellWorks/Data/AtIndex.hs
@@ -7,6 +7,7 @@
     , AtIndex(..)
     , Length(..)
     , atIndexOr
+    , atIndexOrLastOr
     ) where
 
 import Data.Int
@@ -138,5 +139,15 @@
   {-# INLINE atIndex #-}
 
 atIndexOr :: AtIndex v => Elem v -> v -> Position -> Elem v
-atIndexOr d v p = if p < fromIntegral (HW.length v) then v !!! p else d
+atIndexOr d v vi = if vi >= 0 && vi < end v
+  then v !!! vi
+  else d
 {-# INLINE atIndexOr #-}
+
+atIndexOrLastOr :: AtIndex v => Elem v -> v -> Position -> Elem v
+atIndexOrLastOr d v vi = if vi >= 0 && HW.length v > 0
+  then if vi < end v
+    then v !!! vi
+    else v !!! (end v - 1)
+  else d
+{-# INLINE atIndexOrLastOr #-}
