{-# LANGUAGE FlexibleInstances     #-}
{-# LANGUAGE MultiParamTypeClasses #-}

module HaskellWorks.Data.Succinct.RankSelect.Internal
    ( -- * Rank & Select
      Rank(..)
    , Select(..)
    ) where

import           HaskellWorks.Data.Positioning
import           HaskellWorks.Data.Succinct.RankSelect.Binary.Basic

class Eq a => Rank v a where
  rank :: a -> v -> Count -> Count

class Eq a => Select v a where
  select :: a -> v -> Count -> Count

instance Rank [Bool] Bool where
  rank a = if a then rank1 else rank0
  {-# INLINABLE rank #-}

instance Select [Bool] Bool where
  select a = if a then select1 else select0
  {-# INLINABLE select #-}