module HaskellWorks.Data.RankSelect.CsPoppy.Internal.Vector
  ( indexOrZero
  , lastOrZero
  ) where

import Data.Word
import HaskellWorks.Data.AtIndex
import HaskellWorks.Data.Positioning

import qualified Data.Vector.Storable as DVS

indexOrZero :: DVS.Vector Word64 -> Position -> Word64
indexOrZero :: Vector Word64 -> Position -> Word64
indexOrZero Vector Word64
_ Position
i | Position
i Position -> Position -> Bool
forall a. Ord a => a -> a -> Bool
< Position
0     = Word64
0
indexOrZero Vector Word64
v Position
i | Position
i Position -> Position -> Bool
forall a. Ord a => a -> a -> Bool
< Vector Word64 -> Position
forall v. Length v => v -> Position
end Vector Word64
v = Vector Word64
v Vector Word64 -> Position -> Elem (Vector Word64)
forall v. AtIndex v => v -> Position -> Elem v
!!! Position
i
indexOrZero Vector Word64
_ Position
_ = Word64
0
{-# INLINE indexOrZero #-}

lastOrZero :: DVS.Vector Word64 -> Word64
lastOrZero :: Vector Word64 -> Word64
lastOrZero Vector Word64
v | Position
0 Position -> Position -> Bool
forall a. Ord a => a -> a -> Bool
< Vector Word64 -> Position
forall v. Length v => v -> Position
end Vector Word64
v  = Vector Word64 -> Word64
forall a. Storable a => Vector a -> a
DVS.last Vector Word64
v
lastOrZero Vector Word64
_ = Word64
0
{-# INLINE lastOrZero #-}