{-# LANGUAGE FlexibleContexts    #-}
{-# LANGUAGE ScopedTypeVariables #-}

module HaskellWorks.Data.Dsv.Strict.Cursor.Internal.Reference where

import Data.Bits                                 (popCount)
import Data.Word
import HaskellWorks.Data.AtIndex
import HaskellWorks.Data.Bits.BitWise
import HaskellWorks.Data.Dsv.Internal.Bits
import HaskellWorks.Data.Dsv.Internal.Broadword
import HaskellWorks.Data.Dsv.Strict.Cursor.Type
import HaskellWorks.Data.RankSelect.Base.Rank1
import HaskellWorks.Data.RankSelect.Base.Select1
import Prelude

import qualified Data.Vector.Storable                       as DVS
import qualified HaskellWorks.Data.Dsv.Internal.Char.Word64 as CW

{- HLINT ignore "Reduce duplication"  -}
{- HLINT ignore "Redundant guard"     -}

unsafeIndex :: DVS.Vector Word64 -> Int -> Word64
unsafeIndex :: Vector Word64 -> Int -> Word64
unsafeIndex Vector Word64
v Int
i | Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0                           = [Char] -> Word64
forall a. HasCallStack => [Char] -> a
error ([Char] -> Word64) -> [Char] -> Word64
forall a b. (a -> b) -> a -> b
$ [Char]
"Invalid index: " [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> Int -> [Char]
forall a. Show a => a -> [Char]
show Int
i [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> [Char]
" for vector sized " [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> Int -> [Char]
forall a. Show a => a -> [Char]
show (Vector Word64 -> Int
forall a. Storable a => Vector a -> Int
DVS.length Vector Word64
v)
unsafeIndex Vector Word64
v Int
i | Int -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Vector Word64 -> Int
forall a. Storable a => Vector a -> Int
DVS.length Vector Word64
v  = [Char] -> Word64
forall a. HasCallStack => [Char] -> a
error ([Char] -> Word64) -> [Char] -> Word64
forall a b. (a -> b) -> a -> b
$ [Char]
"Invalid index: " [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> Int -> [Char]
forall a. Show a => a -> [Char]
show Int
i [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> [Char]
" for vector sized " [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> Int -> [Char]
forall a. Show a => a -> [Char]
show (Vector Word64 -> Int
forall a. Storable a => Vector a -> Int
DVS.length Vector Word64
v)
unsafeIndex Vector Word64
v Int
i | Bool
otherwise                       = Vector Word64 -> Int -> Word64
forall a. Storable a => Vector a -> Int -> a
DVS.unsafeIndex Vector Word64
v (Int -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
i)
-- unsafeIndex v i = DVS.unsafeIndex v (fromIntegral i)
{-# INLINE unsafeIndex #-}

dvsLength :: DVS.Vector Word64 -> Int
dvsLength :: Vector Word64 -> Int
dvsLength Vector Word64
v = Int -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Vector Word64 -> Int
forall a. Storable a => Vector a -> Int
DVS.length Vector Word64
v)
{-# INLINE dvsLength #-}

atIndexOr2 :: Word64 -> DVS.Vector Word64 -> Int -> Word64
atIndexOr2 :: Word64 -> Vector Word64 -> Int -> Word64
atIndexOr2 Word64
d Vector Word64
_ Int
i | Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0                           = Word64
d
atIndexOr2 Word64
d Vector Word64
v Int
i | Int -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Vector Word64 -> Int
forall a. Storable a => Vector a -> Int
DVS.length Vector Word64
v  = Word64
d
atIndexOr2 Word64
_ Vector Word64
v Int
i | Bool
otherwise                       = Vector Word64 -> Int -> Word64
unsafeIndex Vector Word64
v (Int -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
i)
{-# NOINLINE atIndexOr2 #-}

-- rdqs: repeated double quotes
-- rnls: repeated new lines
-- rdls: repeated delimiters
-- numQuotes: Number of quotes since beginning
-- n: Number of rank select bit string words since beginning
-- returns: dquote interest bits in high part and other interest bits in low part
mkDsvRawBitsByWord64s :: Word64 -> Word64 -> Word64 -> DVS.Vector Word64 -> DVS.Vector Word64
mkDsvRawBitsByWord64s :: Word64 -> Word64 -> Word64 -> Vector Word64 -> Vector Word64
mkDsvRawBitsByWord64s Word64
rdqs Word64
rnls Word64
rdls Vector Word64
v = Int -> (Int -> Word64) -> Vector Word64
forall a. Storable a => Int -> (Int -> a) -> Vector a
DVS.generate (((Vector Word64 -> Int
forall a. Storable a => Vector a -> Int
DVS.length Vector Word64
v Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
7) Int -> Int -> Int
forall a. Integral a => a -> a -> a
`div` Int
8) Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
2) Int -> Word64
go
  where go :: Int -> Word64
        go :: Int -> Word64
go Int
u =  let vi :: Int
vi = Int -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
u Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
4 in
          if Vector Word64 -> Int
dvsLength Vector Word64
v Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
vi Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
4
            then let  w0 :: Word64
w0    = Vector Word64 -> Int -> Word64
unsafeIndex Vector Word64
v Int
vi
                      w0Dqs :: Word64
w0Dqs = Word64 -> Word64
testWord8s (Word64
w0 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rdqs)
                      w0Nls :: Word64
w0Nls = Word64 -> Word64
testWord8s (Word64
w0 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rnls)
                      w0Dls :: Word64
w0Dls = Word64 -> Word64
testWord8s (Word64
w0 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rdls)
                      w1 :: Word64
w1    = Vector Word64 -> Int -> Word64
unsafeIndex Vector Word64
v (Int
vi Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)
                      w1Dqs :: Word64
w1Dqs = Word64 -> Word64
testWord8s (Word64
w1 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rdqs)
                      w1Nls :: Word64
w1Nls = Word64 -> Word64
testWord8s (Word64
w1 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rnls)
                      w1Dls :: Word64
w1Dls = Word64 -> Word64
testWord8s (Word64
w1 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rdls)
                      w2 :: Word64
w2    = Vector Word64 -> Int -> Word64
unsafeIndex Vector Word64
v (Int
vi Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
2)
                      w2Dqs :: Word64
w2Dqs = Word64 -> Word64
testWord8s (Word64
w2 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rdqs)
                      w2Nls :: Word64
w2Nls = Word64 -> Word64
testWord8s (Word64
w2 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rnls)
                      w2Dls :: Word64
w2Dls = Word64 -> Word64
testWord8s (Word64
w2 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rdls)
                      w3 :: Word64
w3    = Vector Word64 -> Int -> Word64
unsafeIndex Vector Word64
v (Int
vi Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
3)
                      w3Dqs :: Word64
w3Dqs = Word64 -> Word64
testWord8s (Word64
w3 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rdqs)
                      w3Nls :: Word64
w3Nls = Word64 -> Word64
testWord8s (Word64
w3 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rnls)
                      w3Dls :: Word64
w3Dls = Word64 -> Word64
testWord8s (Word64
w3 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rdls)
                      wDqs :: Word64
wDqs  = (Word64
w3Dqs Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
24) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (Word64
w2Dqs Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
16) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (Word64
w1Dqs Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
8) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. Word64
w0Dqs
                      wNls :: Word64
wNls  = (Word64
w3Nls Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
24) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (Word64
w2Nls Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
16) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (Word64
w1Nls Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
8) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. Word64
w0Nls
                      wDls :: Word64
wDls  = (Word64
w3Dls Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
24) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (Word64
w2Dls Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
16) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (Word64
w1Dls Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
8) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. Word64
w0Dls
                  in  (Word64 -> Word64
forall a. BitWise a => a -> a
comp (Word64
wDqs Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
32) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.&. Word64
0xffffffff00000000) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (Word64 -> Word64
forall a. BitWise a => a -> a
comp (Word64
wNls Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.&. Word64
wDls) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.&. Word64
0x00000000ffffffff)
            else let  w0 :: Word64
w0    = Word64 -> Vector Word64 -> Int -> Word64
atIndexOr2 Word64
0 Vector Word64
v Int
vi
                      w0Dqs :: Word64
w0Dqs = Word64 -> Word64
testWord8s (Word64
w0 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rdqs)
                      w0Nls :: Word64
w0Nls = Word64 -> Word64
testWord8s (Word64
w0 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rnls)
                      w0Dls :: Word64
w0Dls = Word64 -> Word64
testWord8s (Word64
w0 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rdls)
                      w1 :: Word64
w1    = Word64 -> Vector Word64 -> Int -> Word64
atIndexOr2 Word64
0 Vector Word64
v (Int
vi Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)
                      w1Dqs :: Word64
w1Dqs = Word64 -> Word64
testWord8s (Word64
w1 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rdqs)
                      w1Nls :: Word64
w1Nls = Word64 -> Word64
testWord8s (Word64
w1 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rnls)
                      w1Dls :: Word64
w1Dls = Word64 -> Word64
testWord8s (Word64
w1 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rdls)
                      w2 :: Word64
w2    = Word64 -> Vector Word64 -> Int -> Word64
atIndexOr2 Word64
0 Vector Word64
v (Int
vi Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
2)
                      w2Dqs :: Word64
w2Dqs = Word64 -> Word64
testWord8s (Word64
w2 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rdqs)
                      w2Nls :: Word64
w2Nls = Word64 -> Word64
testWord8s (Word64
w2 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rnls)
                      w2Dls :: Word64
w2Dls = Word64 -> Word64
testWord8s (Word64
w2 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rdls)
                      w3 :: Word64
w3    = Word64 -> Vector Word64 -> Int -> Word64
atIndexOr2 Word64
0 Vector Word64
v (Int
vi Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
3)
                      w3Dqs :: Word64
w3Dqs = Word64 -> Word64
testWord8s (Word64
w3 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rdqs)
                      w3Nls :: Word64
w3Nls = Word64 -> Word64
testWord8s (Word64
w3 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rnls)
                      w3Dls :: Word64
w3Dls = Word64 -> Word64
testWord8s (Word64
w3 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rdls)
                      wDqs :: Word64
wDqs  = (Word64
w3Dqs Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
24) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (Word64
w2Dqs Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
16) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (Word64
w1Dqs Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
8) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. Word64
w0Dqs
                      wNls :: Word64
wNls  = (Word64
w3Nls Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
24) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (Word64
w2Nls Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
16) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (Word64
w1Nls Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
8) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. Word64
w0Nls
                      wDls :: Word64
wDls  = (Word64
w3Dls Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
24) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (Word64
w2Dls Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
16) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (Word64
w1Dls Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
8) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. Word64
w0Dls
                  in  (Word64 -> Word64
forall a. BitWise a => a -> a
comp (Word64
wDqs Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
32) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.&. Word64
0xffffffff00000000) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (Word64 -> Word64
forall a. BitWise a => a -> a
comp (Word64
wNls Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.&. Word64
wDls) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.&. Word64
0x00000000ffffffff)

mkCummulativeDqPopCount :: DVS.Vector Word64 -> DVS.Vector Word64
mkCummulativeDqPopCount :: Vector Word64 -> Vector Word64
mkCummulativeDqPopCount Vector Word64
v = Int -> (Vector Word64 -> Word64) -> Vector Word64
forall a. Storable a => Int -> (Vector a -> a) -> Vector a
DVS.constructN (Vector Word64 -> Int
forall a. Storable a => Vector a -> Int
DVS.length Vector Word64
v Int -> Int -> Int
forall a. Integral a => a -> a -> a
`div` Int
2) Vector Word64 -> Word64
go
  where go :: DVS.Vector Word64 -> Word64
        go :: Vector Word64 -> Word64
go Vector Word64
u = let  ui :: Int
ui = Vector Word64 -> Int
dvsLength Vector Word64
u
                    vi :: Int
vi = Int
ui Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
2
          in if Vector Word64 -> Int
dvsLength Vector Word64
v Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
vi Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
2 Bool -> Bool -> Bool
&& Int
vi Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
0
            then  let w0 :: Word64
w0 = Vector Word64 -> Int -> Word64
unsafeIndex Vector Word64
v  Int
vi
                      w1 :: Word64
w1 = Vector Word64 -> Int -> Word64
unsafeIndex Vector Word64
v (Int
vi Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)
                      w :: Word64
w  = (Word64
w1 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.&. Word64
0xffffffff00000000) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (Word64
w0 Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.>. Word64
32)
                  in Vector Word64 -> Int -> Word64
unsafeIndex Vector Word64
u (Int
ui Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) Word64 -> Word64 -> Word64
forall a. Num a => a -> a -> a
+ Int -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64 -> Int
forall a. Bits a => a -> Int
popCount Word64
w)
            else  let w0 :: Word64
w0 = Word64 -> Vector Word64 -> Int -> Word64
atIndexOr2 Word64
0 Vector Word64
v  Int
vi
                      w1 :: Word64
w1 = Word64 -> Vector Word64 -> Int -> Word64
atIndexOr2 Word64
0 Vector Word64
v (Int
vi Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)
                      w :: Word64
w  = (Word64
w1 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.&. Word64
0xffffffff00000000) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (Word64
w0 Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.>. Word64
32)
                  in Word64 -> Vector Word64 -> Int -> Word64
atIndexOr2 Word64
0 Vector Word64
u (Int
ui Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) Word64 -> Word64 -> Word64
forall a. Num a => a -> a -> a
+ Int -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64 -> Int
forall a. Bits a => a -> Int
popCount Word64
w)

mkIbVector' :: DVS.Vector Word64 -> DVS.Vector Word64 -> DVS.Vector Word64 -> DVS.Vector Word64
mkIbVector' :: Vector Word64 -> Vector Word64 -> Vector Word64 -> Vector Word64
mkIbVector' Vector Word64
rawBits Vector Word64
cpcs Vector Word64
v = Int -> (Int -> Word64) -> Vector Word64
forall a. Storable a => Int -> (Int -> a) -> Vector a
DVS.generate ((Vector Word64 -> Int
forall a. Storable a => Vector a -> Int
DVS.length Vector Word64
v Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
7) Int -> Int -> Int
forall a. Integral a => a -> a -> a
`div` Int
8) Int -> Word64
go
  where go :: Int -> Word64
        go :: Int -> Word64
go Int
u = let ui :: Int
ui = Int -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
u in if Int
ui Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
1
          then  let vi :: Int
vi  = Int
ui Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
2
                    cpc :: Word64
cpc = Vector Word64 -> Int -> Word64
unsafeIndex Vector Word64
cpcs (Int
ui Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)
                    w0 :: Word64
w0  = Vector Word64 -> Int -> Word64
unsafeIndex Vector Word64
rawBits  Int
vi
                    w1 :: Word64
w1  = Vector Word64 -> Int -> Word64
unsafeIndex Vector Word64
rawBits (Int
vi Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)
                    w :: Word64
w   = ((Word64
w1 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.&. Word64
0x00000000ffffffff) Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
32) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. ( Word64
w0 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.&. Word64
0x00000000ffffffff        )
                    d :: Word64
d   = ( Word64
w1 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.&. Word64
0xffffffff00000000        ) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. ((Word64
w0 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.&. Word64
0xffffffff00000000) Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.>. Word64
32)
                    m :: Word64
m   = Word64 -> Word64 -> Word64
toggle64 Word64
cpc Word64
d
                in Word64
w Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.&. Word64
m
          else  let vi :: Position
vi  = Int -> Position
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int
ui Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
2)
                    cpc :: Elem (Vector Word64)
cpc = Elem (Vector Word64)
-> Vector Word64 -> Position -> Elem (Vector Word64)
forall v.
(AtIndex v, Length v) =>
Elem v -> v -> Position -> Elem v
atIndexOrBeforeOrLast Elem (Vector Word64)
0 Vector Word64
cpcs (Int -> Position
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int
ui Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1))
                    w0 :: Elem (Vector Word64)
w0  = Elem (Vector Word64)
-> Vector Word64 -> Position -> Elem (Vector Word64)
forall v. AtIndex v => Elem v -> v -> Position -> Elem v
atIndexOr Elem (Vector Word64)
0 Vector Word64
rawBits  Position
vi
                    w1 :: Elem (Vector Word64)
w1  = Elem (Vector Word64)
-> Vector Word64 -> Position -> Elem (Vector Word64)
forall v. AtIndex v => Elem v -> v -> Position -> Elem v
atIndexOr Elem (Vector Word64)
0 Vector Word64
rawBits (Position
vi Position -> Position -> Position
forall a. Num a => a -> a -> a
+ Position
1)
                    w :: Word64
w   = ((Word64
w1 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.&. Word64
0x00000000ffffffff) Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
32) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. ( Word64
w0 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.&. Word64
0x00000000ffffffff        )
                    d :: Word64
d   = ( Word64
w1 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.&. Word64
0xffffffff00000000        ) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. ((Word64
w0 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.&. Word64
0xffffffff00000000) Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.>. Word64
32)
                    m :: Word64
m   = Word64 -> Word64 -> Word64
toggle64 Word64
cpc Word64
d
                in Word64
w Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.&. Word64
m

mkIbVector :: Word8 -> DVS.Vector Word64 -> DVS.Vector Word64
mkIbVector :: Word8 -> Vector Word64 -> Vector Word64
mkIbVector Word8
delimiter Vector Word64
v = Vector Word64 -> Vector Word64 -> Vector Word64 -> Vector Word64
mkIbVector' Vector Word64
rawBits Vector Word64
cpcs Vector Word64
v
  where rdqs :: Word64
rdqs    = Word64
CW.doubleQuote
        rnls :: Word64
rnls    = Word64
CW.newline
        rdls :: Word64
rdls    = Word8 -> Word64
forall a. FillWord64 a => a -> Word64
fillWord64 Word8
delimiter
        rawBits :: Vector Word64
rawBits = Word64 -> Word64 -> Word64 -> Vector Word64 -> Vector Word64
mkDsvRawBitsByWord64s Word64
rdqs Word64
rnls Word64
rdls Vector Word64
v
        cpcs :: Vector Word64
cpcs    = Vector Word64 -> Vector Word64
mkCummulativeDqPopCount Vector Word64
rawBits -- cummulative popcounts

-- rdqs: repeated double quotes
-- rnls: repeated new lines
-- rdls: repeated delimiters
-- numQuotes: Number of quotes since beginning
-- n: Number of rank select bit string words since beginning
-- returns: dquote interest bits in high part and other interest bits in low part
mkStripes :: Word64 -> Word64 -> Word64 -> DVS.Vector Word64 -> DVS.Vector Word64
mkStripes :: Word64 -> Word64 -> Word64 -> Vector Word64 -> Vector Word64
mkStripes Word64
rdqs Word64
rnls Word64
rdls Vector Word64
v = Int -> (Int -> Word64) -> Vector Word64
forall a. Storable a => Int -> (Int -> a) -> Vector a
DVS.generate (((Vector Word64 -> Int
forall a. Storable a => Vector a -> Int
DVS.length Vector Word64
v Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
7) Int -> Int -> Int
forall a. Integral a => a -> a -> a
`div` Int
8) Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
3) Int -> Word64
go
  where stripePatterns :: Vector Word64
stripePatterns = [Word64] -> Vector Word64
forall a. Storable a => [a] -> Vector a
DVS.fromList [Word64
rdqs, Word64
rnls, Word64
rdls]
        go :: Int -> Word64
        go :: Int -> Word64
go Int
u =
          let ui :: Int
ui = Int -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
u
              si :: Int
si = Int
ui Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
3
              vi :: Int
vi = (Int
ui Int -> Int -> Int
forall a. Integral a => a -> a -> a
`div` Int
3) Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
8
              ws :: Word64
ws = Vector Word64 -> Int -> Word64
unsafeIndex Vector Word64
stripePatterns Int
si
          in if Vector Word64 -> Int
dvsLength Vector Word64
v Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
vi Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
4
            then let  w0 :: Word64
w0 = Word64 -> Word64
testWord8s (Vector Word64 -> Int -> Word64
unsafeIndex Vector Word64
v (Int
vi Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
0) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
ws)
                      w1 :: Word64
w1 = Word64 -> Word64
testWord8s (Vector Word64 -> Int -> Word64
unsafeIndex Vector Word64
v (Int
vi Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
ws)
                      w2 :: Word64
w2 = Word64 -> Word64
testWord8s (Vector Word64 -> Int -> Word64
unsafeIndex Vector Word64
v (Int
vi Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
2) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
ws)
                      w3 :: Word64
w3 = Word64 -> Word64
testWord8s (Vector Word64 -> Int -> Word64
unsafeIndex Vector Word64
v (Int
vi Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
3) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
ws)
                      w4 :: Word64
w4 = Word64 -> Word64
testWord8s (Vector Word64 -> Int -> Word64
unsafeIndex Vector Word64
v (Int
vi Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
4) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
ws)
                      w5 :: Word64
w5 = Word64 -> Word64
testWord8s (Vector Word64 -> Int -> Word64
unsafeIndex Vector Word64
v (Int
vi Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
5) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
ws)
                      w6 :: Word64
w6 = Word64 -> Word64
testWord8s (Vector Word64 -> Int -> Word64
unsafeIndex Vector Word64
v (Int
vi Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
6) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
ws)
                      w7 :: Word64
w7 = Word64 -> Word64
testWord8s (Vector Word64 -> Int -> Word64
unsafeIndex Vector Word64
v (Int
vi Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
7) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
ws)
                      wa :: Word64
wa =  (Word64
w7 Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
56) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (Word64
w6 Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
48) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (Word64
w5 Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
40) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (Word64
w4 Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
32) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|.
                            (Word64
w3 Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
24) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (Word64
w2 Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
16) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (Word64
w1 Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<.  Word64
8) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|.  Word64
w0
                  in  Word64 -> Word64
forall a. BitWise a => a -> a
comp Word64
wa
            else let  w0 :: Word64
w0 = Word64 -> Word64
testWord8s (Word64 -> Vector Word64 -> Int -> Word64
atIndexOr2 Word64
0 Vector Word64
v (Int
vi Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
0) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
ws)
                      w1 :: Word64
w1 = Word64 -> Word64
testWord8s (Word64 -> Vector Word64 -> Int -> Word64
atIndexOr2 Word64
0 Vector Word64
v (Int
vi Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
ws)
                      w2 :: Word64
w2 = Word64 -> Word64
testWord8s (Word64 -> Vector Word64 -> Int -> Word64
atIndexOr2 Word64
0 Vector Word64
v (Int
vi Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
2) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
ws)
                      w3 :: Word64
w3 = Word64 -> Word64
testWord8s (Word64 -> Vector Word64 -> Int -> Word64
atIndexOr2 Word64
0 Vector Word64
v (Int
vi Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
3) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
ws)
                      w4 :: Word64
w4 = Word64 -> Word64
testWord8s (Word64 -> Vector Word64 -> Int -> Word64
atIndexOr2 Word64
0 Vector Word64
v (Int
vi Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
4) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
ws)
                      w5 :: Word64
w5 = Word64 -> Word64
testWord8s (Word64 -> Vector Word64 -> Int -> Word64
atIndexOr2 Word64
0 Vector Word64
v (Int
vi Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
5) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
ws)
                      w6 :: Word64
w6 = Word64 -> Word64
testWord8s (Word64 -> Vector Word64 -> Int -> Word64
atIndexOr2 Word64
0 Vector Word64
v (Int
vi Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
6) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
ws)
                      w7 :: Word64
w7 = Word64 -> Word64
testWord8s (Word64 -> Vector Word64 -> Int -> Word64
atIndexOr2 Word64
0 Vector Word64
v (Int
vi Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
7) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
ws)
                      wa :: Word64
wa =  (Word64
w7 Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
56) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (Word64
w6 Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
48) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (Word64
w5 Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
40) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (Word64
w4 Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
32) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|.
                            (Word64
w3 Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
24) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (Word64
w2 Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
16) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (Word64
w1 Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<.  Word64
8) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|.  Word64
w0
                  in  Word64 -> Word64
forall a. BitWise a => a -> a
comp Word64
wa

mkCummulativeDqPopCountFromStriped :: DVS.Vector Word64 -> DVS.Vector Word64
mkCummulativeDqPopCountFromStriped :: Vector Word64 -> Vector Word64
mkCummulativeDqPopCountFromStriped Vector Word64
v = Int -> (Vector Word64 -> Word64) -> Vector Word64
forall a. Storable a => Int -> (Vector a -> a) -> Vector a
DVS.constructN (Vector Word64 -> Int
forall a. Storable a => Vector a -> Int
DVS.length Vector Word64
v Int -> Int -> Int
forall a. Integral a => a -> a -> a
`div` Int
3) Vector Word64 -> Word64
go
  where go :: DVS.Vector Word64 -> Word64
        go :: Vector Word64 -> Word64
go Vector Word64
u =  let ui :: Int
ui  = Vector Word64 -> Int
dvsLength Vector Word64
u
                    vi :: Int
vi  = Int
ui Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
3
                    w :: Word64
w   = Vector Word64 -> Int -> Word64
unsafeIndex Vector Word64
v  Int
vi
                in Vector Word64 -> Int -> Word64
unsafeIndex Vector Word64
u (Int
ui Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) Word64 -> Word64 -> Word64
forall a. Num a => a -> a -> a
+ Int -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64 -> Int
forall a. Bits a => a -> Int
popCount Word64
w)

mkDsvIbNlFromStriped :: DVS.Vector Word64 -> DVS.Vector Word64 -> DVS.Vector Word64
mkDsvIbNlFromStriped :: Vector Word64 -> Vector Word64 -> Vector Word64
mkDsvIbNlFromStriped Vector Word64
sv Vector Word64
cpcs = Int -> (Int -> Word64) -> Vector Word64
forall a. Storable a => Int -> (Int -> a) -> Vector a
DVS.generate (Vector Word64 -> Int
forall a. Storable a => Vector a -> Int
DVS.length Vector Word64
sv Int -> Int -> Int
forall a. Integral a => a -> a -> a
`div` Int
3) Int -> Word64
go
  where go :: Int -> Word64
        go :: Int -> Word64
go Int
u = let ui :: Int
ui = Int -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
u in if Int
ui Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
1
          then  let svi :: Int
svi = Int
ui Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
2
                    cpc :: Word64
cpc = Vector Word64 -> Int -> Word64
unsafeIndex Vector Word64
cpcs (Int
ui Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)
                    wdq :: Word64
wdq = Vector Word64 -> Int -> Word64
unsafeIndex Vector Word64
sv  Int
svi
                    wnl :: Word64
wnl = Vector Word64 -> Int -> Word64
unsafeIndex Vector Word64
sv (Int
svi Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)
                    m :: Word64
m   = Word64 -> Word64 -> Word64
toggle64 Word64
cpc Word64
wdq
                in Word64
wnl Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.&. Word64
m
          else  let svi :: Position
svi = Int -> Position
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int
ui Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
2)
                    cpc :: Elem (Vector Word64)
cpc = Elem (Vector Word64)
-> Vector Word64 -> Position -> Elem (Vector Word64)
forall v.
(AtIndex v, Length v) =>
Elem v -> v -> Position -> Elem v
atIndexOrBeforeOrLast Elem (Vector Word64)
0 Vector Word64
cpcs    (Int -> Position
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int
ui Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1))
                    wdq :: Elem (Vector Word64)
wdq = Elem (Vector Word64)
-> Vector Word64 -> Position -> Elem (Vector Word64)
forall v. AtIndex v => Elem v -> v -> Position -> Elem v
atIndexOr Elem (Vector Word64)
0 Vector Word64
sv  Position
svi
                    wnl :: Elem (Vector Word64)
wnl = Elem (Vector Word64)
-> Vector Word64 -> Position -> Elem (Vector Word64)
forall v. AtIndex v => Elem v -> v -> Position -> Elem v
atIndexOr Elem (Vector Word64)
0 Vector Word64
sv (Position
svi Position -> Position -> Position
forall a. Num a => a -> a -> a
+ Position
1)
                    m :: Word64
m   = Word64 -> Word64 -> Word64
toggle64 Word64
cpc Word64
wdq
                in Word64
wnl Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.&. Word64
m

mkDsvIbDlFromStriped :: DVS.Vector Word64 -> DVS.Vector Word64 -> DVS.Vector Word64
mkDsvIbDlFromStriped :: Vector Word64 -> Vector Word64 -> Vector Word64
mkDsvIbDlFromStriped Vector Word64
sv Vector Word64
cpcs = Int -> (Int -> Word64) -> Vector Word64
forall a. Storable a => Int -> (Int -> a) -> Vector a
DVS.generate (Vector Word64 -> Int
forall a. Storable a => Vector a -> Int
DVS.length Vector Word64
sv Int -> Int -> Int
forall a. Integral a => a -> a -> a
`div` Int
3) Int -> Word64
go
  where go :: Int -> Word64
        go :: Int -> Word64
go Int
u = let ui :: Int
ui = Int -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
u in if Int
ui Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
1
          then  let svi :: Int
svi = Int
ui Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
2
                    cpc :: Word64
cpc = Vector Word64 -> Int -> Word64
unsafeIndex Vector Word64
cpcs (Int
ui Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)
                    wdq :: Word64
wdq = Vector Word64 -> Int -> Word64
unsafeIndex Vector Word64
sv  Int
svi
                    wdl :: Word64
wdl = Vector Word64 -> Int -> Word64
unsafeIndex Vector Word64
sv (Int
svi Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
2)
                    m :: Word64
m   = Word64 -> Word64 -> Word64
toggle64 Word64
cpc Word64
wdq
                in Word64
wdl Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.&. Word64
m
          else  let svi :: Position
svi = Int -> Position
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int
ui Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
2)
                    cpc :: Elem (Vector Word64)
cpc = Elem (Vector Word64)
-> Vector Word64 -> Position -> Elem (Vector Word64)
forall v.
(AtIndex v, Length v) =>
Elem v -> v -> Position -> Elem v
atIndexOrBeforeOrLast Elem (Vector Word64)
0 Vector Word64
cpcs    (Int -> Position
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int
ui Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1))
                    wdq :: Elem (Vector Word64)
wdq = Elem (Vector Word64)
-> Vector Word64 -> Position -> Elem (Vector Word64)
forall v. AtIndex v => Elem v -> v -> Position -> Elem v
atIndexOr Elem (Vector Word64)
0 Vector Word64
sv  Position
svi
                    wdl :: Elem (Vector Word64)
wdl = Elem (Vector Word64)
-> Vector Word64 -> Position -> Elem (Vector Word64)
forall v. AtIndex v => Elem v -> v -> Position -> Elem v
atIndexOr Elem (Vector Word64)
0 Vector Word64
sv (Position
svi Position -> Position -> Position
forall a. Num a => a -> a -> a
+ Position
2)
                    m :: Word64
m   = Word64 -> Word64 -> Word64
toggle64 Word64
cpc Word64
wdq
                in Word64
wdl Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.&. Word64
m

nextCursor :: (Rank1 s, Select1 s) => DsvCursor t s -> DsvCursor t s
nextCursor :: DsvCursor t s -> DsvCursor t s
nextCursor DsvCursor t s
cursor = DsvCursor t s
cursor
  { dsvCursorPosition :: Word64
dsvCursorPosition = Word64
newPos
  }
  where currentRank :: Word64
currentRank = s -> Word64 -> Word64
forall v. Rank1 v => v -> Word64 -> Word64
rank1   (DsvCursor t s -> s
forall t s. DsvCursor t s -> s
dsvCursorMarkers DsvCursor t s
cursor) (DsvCursor t s -> Word64
forall t s. DsvCursor t s -> Word64
dsvCursorPosition DsvCursor t s
cursor)
        newPos :: Word64
newPos      = s -> Word64 -> Word64
forall v. Select1 v => v -> Word64 -> Word64
select1 (DsvCursor t s -> s
forall t s. DsvCursor t s -> s
dsvCursorMarkers DsvCursor t s
cursor) (Word64
currentRank Word64 -> Word64 -> Word64
forall a. Num a => a -> a -> a
+ Word64
1)