hw-rankselect-0.13.0.0: src/HaskellWorks/Data/RankSelect/CsPoppy1.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.CsPoppy1
( CsPoppy1(..)
, makeCsPoppy
) 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.PopCount1
import HaskellWorks.Data.FromForeignRegion
import HaskellWorks.Data.RankSelect.Base.Rank0
import HaskellWorks.Data.RankSelect.Base.Rank1
import HaskellWorks.Data.RankSelect.Base.Select1
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.Alpha1 as A1
data CsPoppy1 = CsPoppy1
{ csPoppy1Bits :: !(DVS.Vector Word64)
, csPoppy1Index1 :: !A1.CsPoppyIndex
} deriving (Eq, Show, NFData, Generic)
instance FromForeignRegion CsPoppy1 where
fromForeignRegion = makeCsPoppy . fromForeignRegion
instance AsVector64 CsPoppy1 where
asVector64 = asVector64 . csPoppy1Bits
{-# INLINE asVector64 #-}
instance BitLength CsPoppy1 where
bitLength = bitLength . csPoppy1Bits
{-# INLINE bitLength #-}
instance PopCount1 CsPoppy1 where
popCount1 v = getCsiTotal (CsInterleaved (lastOrZero (A1.csPoppyLayerM (csPoppy1Index1 v))))
{-# INLINE popCount1 #-}
makeCsPoppy :: DVS.Vector Word64 -> CsPoppy1
makeCsPoppy v = CsPoppy1
{ csPoppy1Bits = v
, csPoppy1Index1 = A1.makeCsPoppyIndex v
}
instance TestBit CsPoppy1 where
(.?.) = (.?.) . csPoppy1Bits
{-# INLINE (.?.) #-}
instance BitRead CsPoppy1 where
bitRead = fmap makeCsPoppy . bitRead
instance Rank0 CsPoppy1 where
rank0 rsbs p = p - rank1 rsbs p
{-# INLINE rank0 #-}
instance Rank1 CsPoppy1 where
rank1 (CsPoppy1 !v i) = A1.rank1On v i
{-# INLINE rank1 #-}
instance Select1 CsPoppy1 where
select1 (CsPoppy1 !v i) = A1.select1On v i
{-# INLINE select1 #-}
instance OpenAt CsPoppy1 where
openAt = openAt . csPoppy1Bits
{-# INLINE openAt #-}
instance CloseAt CsPoppy1 where
closeAt = closeAt . csPoppy1Bits
{-# INLINE closeAt #-}
instance NewCloseAt CsPoppy1 where
newCloseAt = newCloseAt . csPoppy1Bits
{-# INLINE newCloseAt #-}
instance FindOpenN CsPoppy1 where
findOpenN = findOpenN . csPoppy1Bits
{-# INLINE findOpenN #-}
instance FindOpen CsPoppy1 where
findOpen = findOpen . csPoppy1Bits
{-# INLINE findOpen #-}
instance FindClose CsPoppy1 where
findClose = findClose . csPoppy1Bits
{-# INLINE findClose #-}
instance FindCloseN CsPoppy1 where
findCloseN = findCloseN . csPoppy1Bits
{-# INLINE findCloseN #-}
instance Enclose CsPoppy1 where
enclose = enclose . csPoppy1Bits
{-# INLINE enclose #-}
instance BalancedParens CsPoppy1 where
firstChild = firstChild . csPoppy1Bits
nextSibling = nextSibling . csPoppy1Bits
parent = parent . csPoppy1Bits
{-# INLINE firstChild #-}
{-# INLINE nextSibling #-}
{-# INLINE parent #-}