hw-rankselect-0.13.0.0: src/HaskellWorks/Data/RankSelect/CsPoppy0.hs
{-# OPTIONS_GHC-funbox-strict-fields #-}
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiWayIf #-}
{-# LANGUAGE Rank2Types #-}
{-# LANGUAGE ScopedTypeVariables #-}
module HaskellWorks.Data.RankSelect.CsPoppy0
( CsPoppy0(..)
, makeCsPoppy0
) where
import Control.DeepSeq
import Data.Word
import GHC.Generics
import HaskellWorks.Data.BalancedParens.BalancedParens
import HaskellWorks.Data.BalancedParens.CloseAt
import HaskellWorks.Data.BalancedParens.Enclose
import HaskellWorks.Data.BalancedParens.FindClose
import HaskellWorks.Data.BalancedParens.FindCloseN
import HaskellWorks.Data.BalancedParens.FindOpen
import HaskellWorks.Data.BalancedParens.FindOpenN
import HaskellWorks.Data.BalancedParens.NewCloseAt
import HaskellWorks.Data.BalancedParens.OpenAt
import HaskellWorks.Data.Bits.BitLength
import HaskellWorks.Data.Bits.BitRead
import HaskellWorks.Data.Bits.BitWise
import HaskellWorks.Data.Bits.PopCount.PopCount0
import HaskellWorks.Data.FromForeignRegion
import HaskellWorks.Data.RankSelect.Base.Rank0
import HaskellWorks.Data.RankSelect.Base.Rank1
import HaskellWorks.Data.RankSelect.Base.Select0
import HaskellWorks.Data.RankSelect.CsPoppy.Internal.CsInterleaved
import HaskellWorks.Data.RankSelect.CsPoppy.Internal.Vector
import HaskellWorks.Data.Vector.AsVector64
import Prelude hiding (drop, length, pi, take)
import qualified Data.Vector.Storable as DVS
import qualified HaskellWorks.Data.RankSelect.CsPoppy.Internal.Alpha0 as A0
data CsPoppy0 = CsPoppy0
{ csPoppy0Bits :: !(DVS.Vector Word64)
, csPoppy0Index0 :: !A0.CsPoppyIndex
} deriving (Eq, Show, NFData, Generic)
instance FromForeignRegion CsPoppy0 where
fromForeignRegion = makeCsPoppy0 . fromForeignRegion
instance AsVector64 CsPoppy0 where
asVector64 = asVector64 . csPoppy0Bits
{-# INLINE asVector64 #-}
instance BitLength CsPoppy0 where
bitLength = bitLength . csPoppy0Bits
{-# INLINE bitLength #-}
instance PopCount0 CsPoppy0 where
popCount0 v = getCsiTotal (CsInterleaved (lastOrZero (A0.csPoppyLayerM (csPoppy0Index0 v))))
{-# INLINE popCount0 #-}
makeCsPoppy0 :: DVS.Vector Word64 -> CsPoppy0
makeCsPoppy0 v = CsPoppy0
{ csPoppy0Bits = v
, csPoppy0Index0 = A0.makeCsPoppyIndex v
}
instance TestBit CsPoppy0 where
(.?.) = (.?.) . csPoppy0Bits
{-# INLINE (.?.) #-}
instance BitRead CsPoppy0 where
bitRead = fmap makeCsPoppy0 . bitRead
instance Rank1 CsPoppy0 where
rank1 rsbs p = p - rank0 rsbs p
{-# INLINE rank1 #-}
instance Rank0 CsPoppy0 where
rank0 (CsPoppy0 !v i) = A0.rank0On v i
{-# INLINE rank0 #-}
instance Select0 CsPoppy0 where
select0 (CsPoppy0 !v i) = A0.select0On v i
{-# INLINE select0 #-}
instance OpenAt CsPoppy0 where
openAt = openAt . csPoppy0Bits
{-# INLINE openAt #-}
instance CloseAt CsPoppy0 where
closeAt = closeAt . csPoppy0Bits
{-# INLINE closeAt #-}
instance NewCloseAt CsPoppy0 where
newCloseAt = newCloseAt . csPoppy0Bits
{-# INLINE newCloseAt #-}
instance FindOpenN CsPoppy0 where
findOpenN = findOpenN . csPoppy0Bits
{-# INLINE findOpenN #-}
instance FindOpen CsPoppy0 where
findOpen = findOpen . csPoppy0Bits
{-# INLINE findOpen #-}
instance FindClose CsPoppy0 where
findClose = findClose . csPoppy0Bits
{-# INLINE findClose #-}
instance FindCloseN CsPoppy0 where
findCloseN = findCloseN . csPoppy0Bits
{-# INLINE findCloseN #-}
instance Enclose CsPoppy0 where
enclose = enclose . csPoppy0Bits
{-# INLINE enclose #-}
instance BalancedParens CsPoppy0 where
firstChild = firstChild . csPoppy0Bits
nextSibling = nextSibling . csPoppy0Bits
parent = parent . csPoppy0Bits
{-# INLINE firstChild #-}
{-# INLINE nextSibling #-}
{-# INLINE parent #-}