{-# LANGUAGE FlexibleInstances #-}

module HaskellWorks.Data.Excess.Excess1
    ( Excess1(..)
    ) where

import Data.Word
import HaskellWorks.Data.Positioning
import HaskellWorks.Data.RankSelect.Base.Rank0
import HaskellWorks.Data.RankSelect.Base.Rank1

import qualified Data.Vector.Storable as DVS

class Excess1 v where
  excess1 :: v -> Count -> Int

instance Excess1 Word8 where
  excess1 v c = fromIntegral (rank1 v c) - fromIntegral (rank0 v c)
  {-# INLINE excess1 #-}

instance Excess1 Word16 where
  excess1 v c = fromIntegral (rank1 v c) - fromIntegral (rank0 v c)
  {-# INLINE excess1 #-}

instance Excess1 Word32 where
  excess1 v c = fromIntegral (rank1 v c) - fromIntegral (rank0 v c)
  {-# INLINE excess1 #-}

instance Excess1 Word64 where
  excess1 v c = fromIntegral (rank1 v c) - fromIntegral (rank0 v c)
  {-# INLINE excess1 #-}

instance Excess1 (DVS.Vector Word8) where
  excess1 v c = fromIntegral (rank1 v c) - fromIntegral (rank0 v c)
  {-# INLINE excess1 #-}

instance Excess1 (DVS.Vector Word16) where
  excess1 v c = fromIntegral (rank1 v c) - fromIntegral (rank0 v c)
  {-# INLINE excess1 #-}

instance Excess1 (DVS.Vector Word32) where
  excess1 v c = fromIntegral (rank1 v c) - fromIntegral (rank0 v c)
  {-# INLINE excess1 #-}

instance Excess1 (DVS.Vector Word64) where
  excess1 v c = fromIntegral (rank1 v c) - fromIntegral (rank0 v c)
  {-# INLINE excess1 #-}