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