{-# 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 { CsPoppy0 -> Vector Word64 csPoppy0Bits :: !(DVS.Vector Word64) , CsPoppy0 -> CsPoppyIndex csPoppy0Index0 :: !A0.CsPoppyIndex } deriving (CsPoppy0 -> CsPoppy0 -> Bool (CsPoppy0 -> CsPoppy0 -> Bool) -> (CsPoppy0 -> CsPoppy0 -> Bool) -> Eq CsPoppy0 forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a /= :: CsPoppy0 -> CsPoppy0 -> Bool $c/= :: CsPoppy0 -> CsPoppy0 -> Bool == :: CsPoppy0 -> CsPoppy0 -> Bool $c== :: CsPoppy0 -> CsPoppy0 -> Bool Eq, Int -> CsPoppy0 -> ShowS [CsPoppy0] -> ShowS CsPoppy0 -> String (Int -> CsPoppy0 -> ShowS) -> (CsPoppy0 -> String) -> ([CsPoppy0] -> ShowS) -> Show CsPoppy0 forall a. (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a showList :: [CsPoppy0] -> ShowS $cshowList :: [CsPoppy0] -> ShowS show :: CsPoppy0 -> String $cshow :: CsPoppy0 -> String showsPrec :: Int -> CsPoppy0 -> ShowS $cshowsPrec :: Int -> CsPoppy0 -> ShowS Show, CsPoppy0 -> () (CsPoppy0 -> ()) -> NFData CsPoppy0 forall a. (a -> ()) -> NFData a rnf :: CsPoppy0 -> () $crnf :: CsPoppy0 -> () NFData, (forall x. CsPoppy0 -> Rep CsPoppy0 x) -> (forall x. Rep CsPoppy0 x -> CsPoppy0) -> Generic CsPoppy0 forall x. Rep CsPoppy0 x -> CsPoppy0 forall x. CsPoppy0 -> Rep CsPoppy0 x forall a. (forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a $cto :: forall x. Rep CsPoppy0 x -> CsPoppy0 $cfrom :: forall x. CsPoppy0 -> Rep CsPoppy0 x Generic) instance FromForeignRegion CsPoppy0 where fromForeignRegion :: ForeignRegion -> CsPoppy0 fromForeignRegion = Vector Word64 -> CsPoppy0 makeCsPoppy0 (Vector Word64 -> CsPoppy0) -> (ForeignRegion -> Vector Word64) -> ForeignRegion -> CsPoppy0 forall b c a. (b -> c) -> (a -> b) -> a -> c . ForeignRegion -> Vector Word64 forall a. FromForeignRegion a => ForeignRegion -> a fromForeignRegion instance AsVector64 CsPoppy0 where asVector64 :: CsPoppy0 -> Vector Word64 asVector64 = Vector Word64 -> Vector Word64 forall a. AsVector64 a => a -> Vector Word64 asVector64 (Vector Word64 -> Vector Word64) -> (CsPoppy0 -> Vector Word64) -> CsPoppy0 -> Vector Word64 forall b c a. (b -> c) -> (a -> b) -> a -> c . CsPoppy0 -> Vector Word64 csPoppy0Bits {-# INLINE asVector64 #-} instance BitLength CsPoppy0 where bitLength :: CsPoppy0 -> Word64 bitLength = Vector Word64 -> Word64 forall v. BitLength v => v -> Word64 bitLength (Vector Word64 -> Word64) -> (CsPoppy0 -> Vector Word64) -> CsPoppy0 -> Word64 forall b c a. (b -> c) -> (a -> b) -> a -> c . CsPoppy0 -> Vector Word64 csPoppy0Bits {-# INLINE bitLength #-} instance PopCount0 CsPoppy0 where popCount0 :: CsPoppy0 -> Word64 popCount0 CsPoppy0 v = CsInterleaved -> Word64 getCsiTotal (Word64 -> CsInterleaved CsInterleaved (Vector Word64 -> Word64 lastOrZero (CsPoppyIndex -> Vector Word64 A0.csPoppyLayerM (CsPoppy0 -> CsPoppyIndex csPoppy0Index0 CsPoppy0 v)))) {-# INLINE popCount0 #-} makeCsPoppy0 :: DVS.Vector Word64 -> CsPoppy0 makeCsPoppy0 :: Vector Word64 -> CsPoppy0 makeCsPoppy0 Vector Word64 v = CsPoppy0 :: Vector Word64 -> CsPoppyIndex -> CsPoppy0 CsPoppy0 { csPoppy0Bits :: Vector Word64 csPoppy0Bits = Vector Word64 v , csPoppy0Index0 :: CsPoppyIndex csPoppy0Index0 = Vector Word64 -> CsPoppyIndex A0.makeCsPoppyIndex Vector Word64 v } instance TestBit CsPoppy0 where .?. :: CsPoppy0 -> Position -> Bool (.?.) = Vector Word64 -> Position -> Bool forall a. TestBit a => a -> Position -> Bool (.?.) (Vector Word64 -> Position -> Bool) -> (CsPoppy0 -> Vector Word64) -> CsPoppy0 -> Position -> Bool forall b c a. (b -> c) -> (a -> b) -> a -> c . CsPoppy0 -> Vector Word64 csPoppy0Bits {-# INLINE (.?.) #-} instance BitRead CsPoppy0 where bitRead :: String -> Maybe CsPoppy0 bitRead = (Vector Word64 -> CsPoppy0) -> Maybe (Vector Word64) -> Maybe CsPoppy0 forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap Vector Word64 -> CsPoppy0 makeCsPoppy0 (Maybe (Vector Word64) -> Maybe CsPoppy0) -> (String -> Maybe (Vector Word64)) -> String -> Maybe CsPoppy0 forall b c a. (b -> c) -> (a -> b) -> a -> c . String -> Maybe (Vector Word64) forall a. BitRead a => String -> Maybe a bitRead instance Rank1 CsPoppy0 where rank1 :: CsPoppy0 -> Word64 -> Word64 rank1 CsPoppy0 rsbs Word64 p = Word64 p Word64 -> Word64 -> Word64 forall a. Num a => a -> a -> a - CsPoppy0 -> Word64 -> Word64 forall v. Rank0 v => v -> Word64 -> Word64 rank0 CsPoppy0 rsbs Word64 p {-# INLINE rank1 #-} instance Rank0 CsPoppy0 where rank0 :: CsPoppy0 -> Word64 -> Word64 rank0 (CsPoppy0 !Vector Word64 v CsPoppyIndex i) = Vector Word64 -> CsPoppyIndex -> Word64 -> Word64 A0.rank0On Vector Word64 v CsPoppyIndex i {-# INLINE rank0 #-} instance Select0 CsPoppy0 where select0 :: CsPoppy0 -> Word64 -> Word64 select0 (CsPoppy0 !Vector Word64 v CsPoppyIndex i) = Vector Word64 -> CsPoppyIndex -> Word64 -> Word64 A0.select0On Vector Word64 v CsPoppyIndex i {-# INLINE select0 #-} instance OpenAt CsPoppy0 where openAt :: CsPoppy0 -> Word64 -> Bool openAt = Vector Word64 -> Word64 -> Bool forall v. OpenAt v => v -> Word64 -> Bool openAt (Vector Word64 -> Word64 -> Bool) -> (CsPoppy0 -> Vector Word64) -> CsPoppy0 -> Word64 -> Bool forall b c a. (b -> c) -> (a -> b) -> a -> c . CsPoppy0 -> Vector Word64 csPoppy0Bits {-# INLINE openAt #-} instance CloseAt CsPoppy0 where closeAt :: CsPoppy0 -> Word64 -> Bool closeAt = Vector Word64 -> Word64 -> Bool forall v. CloseAt v => v -> Word64 -> Bool closeAt (Vector Word64 -> Word64 -> Bool) -> (CsPoppy0 -> Vector Word64) -> CsPoppy0 -> Word64 -> Bool forall b c a. (b -> c) -> (a -> b) -> a -> c . CsPoppy0 -> Vector Word64 csPoppy0Bits {-# INLINE closeAt #-} instance NewCloseAt CsPoppy0 where newCloseAt :: CsPoppy0 -> Word64 -> Bool newCloseAt = Vector Word64 -> Word64 -> Bool forall v. NewCloseAt v => v -> Word64 -> Bool newCloseAt (Vector Word64 -> Word64 -> Bool) -> (CsPoppy0 -> Vector Word64) -> CsPoppy0 -> Word64 -> Bool forall b c a. (b -> c) -> (a -> b) -> a -> c . CsPoppy0 -> Vector Word64 csPoppy0Bits {-# INLINE newCloseAt #-} instance FindOpenN CsPoppy0 where findOpenN :: CsPoppy0 -> Word64 -> Word64 -> Maybe Word64 findOpenN = Vector Word64 -> Word64 -> Word64 -> Maybe Word64 forall v. FindOpenN v => v -> Word64 -> Word64 -> Maybe Word64 findOpenN (Vector Word64 -> Word64 -> Word64 -> Maybe Word64) -> (CsPoppy0 -> Vector Word64) -> CsPoppy0 -> Word64 -> Word64 -> Maybe Word64 forall b c a. (b -> c) -> (a -> b) -> a -> c . CsPoppy0 -> Vector Word64 csPoppy0Bits {-# INLINE findOpenN #-} instance FindOpen CsPoppy0 where findOpen :: CsPoppy0 -> Word64 -> Maybe Word64 findOpen = Vector Word64 -> Word64 -> Maybe Word64 forall v. FindOpen v => v -> Word64 -> Maybe Word64 findOpen (Vector Word64 -> Word64 -> Maybe Word64) -> (CsPoppy0 -> Vector Word64) -> CsPoppy0 -> Word64 -> Maybe Word64 forall b c a. (b -> c) -> (a -> b) -> a -> c . CsPoppy0 -> Vector Word64 csPoppy0Bits {-# INLINE findOpen #-} instance FindClose CsPoppy0 where findClose :: CsPoppy0 -> Word64 -> Maybe Word64 findClose = Vector Word64 -> Word64 -> Maybe Word64 forall v. FindClose v => v -> Word64 -> Maybe Word64 findClose (Vector Word64 -> Word64 -> Maybe Word64) -> (CsPoppy0 -> Vector Word64) -> CsPoppy0 -> Word64 -> Maybe Word64 forall b c a. (b -> c) -> (a -> b) -> a -> c . CsPoppy0 -> Vector Word64 csPoppy0Bits {-# INLINE findClose #-} instance FindCloseN CsPoppy0 where findCloseN :: CsPoppy0 -> Word64 -> Word64 -> Maybe Word64 findCloseN = Vector Word64 -> Word64 -> Word64 -> Maybe Word64 forall v. FindCloseN v => v -> Word64 -> Word64 -> Maybe Word64 findCloseN (Vector Word64 -> Word64 -> Word64 -> Maybe Word64) -> (CsPoppy0 -> Vector Word64) -> CsPoppy0 -> Word64 -> Word64 -> Maybe Word64 forall b c a. (b -> c) -> (a -> b) -> a -> c . CsPoppy0 -> Vector Word64 csPoppy0Bits {-# INLINE findCloseN #-} instance Enclose CsPoppy0 where enclose :: CsPoppy0 -> Word64 -> Maybe Word64 enclose = Vector Word64 -> Word64 -> Maybe Word64 forall v. Enclose v => v -> Word64 -> Maybe Word64 enclose (Vector Word64 -> Word64 -> Maybe Word64) -> (CsPoppy0 -> Vector Word64) -> CsPoppy0 -> Word64 -> Maybe Word64 forall b c a. (b -> c) -> (a -> b) -> a -> c . CsPoppy0 -> Vector Word64 csPoppy0Bits {-# INLINE enclose #-} instance BalancedParens CsPoppy0 where firstChild :: CsPoppy0 -> Word64 -> Maybe Word64 firstChild = Vector Word64 -> Word64 -> Maybe Word64 forall v. BalancedParens v => v -> Word64 -> Maybe Word64 firstChild (Vector Word64 -> Word64 -> Maybe Word64) -> (CsPoppy0 -> Vector Word64) -> CsPoppy0 -> Word64 -> Maybe Word64 forall b c a. (b -> c) -> (a -> b) -> a -> c . CsPoppy0 -> Vector Word64 csPoppy0Bits nextSibling :: CsPoppy0 -> Word64 -> Maybe Word64 nextSibling = Vector Word64 -> Word64 -> Maybe Word64 forall v. BalancedParens v => v -> Word64 -> Maybe Word64 nextSibling (Vector Word64 -> Word64 -> Maybe Word64) -> (CsPoppy0 -> Vector Word64) -> CsPoppy0 -> Word64 -> Maybe Word64 forall b c a. (b -> c) -> (a -> b) -> a -> c . CsPoppy0 -> Vector Word64 csPoppy0Bits parent :: CsPoppy0 -> Word64 -> Maybe Word64 parent = Vector Word64 -> Word64 -> Maybe Word64 forall v. BalancedParens v => v -> Word64 -> Maybe Word64 parent (Vector Word64 -> Word64 -> Maybe Word64) -> (CsPoppy0 -> Vector Word64) -> CsPoppy0 -> Word64 -> Maybe Word64 forall b c a. (b -> c) -> (a -> b) -> a -> c . CsPoppy0 -> Vector Word64 csPoppy0Bits {-# INLINE firstChild #-} {-# INLINE nextSibling #-} {-# INLINE parent #-}