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

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

import Control.Monad.ST
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.Positioning
import HaskellWorks.Data.RankSelect.Base.Rank1
import HaskellWorks.Data.RankSelect.Base.Select1
import Prelude

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

{- HLINT ignore "Reduce duplication" -}

makeIndexes :: Word8 -> DVS.Vector Word64 -> (DVS.Vector Word64, DVS.Vector Word64)
makeIndexes :: Word8 -> Vector Word64 -> (Vector Word64, Vector Word64)
makeIndexes Word8
delimiter Vector Word64
ws = case (forall s. ST s [MVector s Word64]) -> [Vector Word64]
forall (f :: * -> *) a.
(Traversable f, Storable a) =>
(forall s. ST s (f (MVector s a))) -> f (Vector a)
DVS.createT ((forall s. ST s [MVector s Word64]) -> [Vector Word64])
-> (forall s. ST s [MVector s Word64]) -> [Vector Word64]
forall a b. (a -> b) -> a -> b
$ Word64
-> Word64 -> Word64 -> Vector Word64 -> ST s [MVector s Word64]
forall s.
Word64
-> Word64 -> Word64 -> Vector Word64 -> ST s [MVector s Word64]
makeIndexes' Word64
CW.doubleQuote Word64
CW.newline (Word8 -> Word64
forall a. FillWord64 a => a -> Word64
fillWord64 Word8
delimiter) Vector Word64
ws of
  [Vector Word64
markers, Vector Word64
newlines] -> (Vector Word64
markers, Vector Word64
newlines)
  [Vector Word64]
_                   -> [Char] -> (Vector Word64, Vector Word64)
forall a. HasCallStack => [Char] -> a
error [Char]
"This should not happen"

makeIndexes' :: forall s.
     Word64
  -> Word64
  -> Word64
  -> DVS.Vector Word64
  -> ST s [DVS.MVector s Word64]
makeIndexes' :: Word64
-> Word64 -> Word64 -> Vector Word64 -> ST s [MVector s Word64]
makeIndexes' Word64
rdqs Word64
rnls Word64
rdls Vector Word64
ws = do
  (MVector s Word64
markers  :: DVSM.MVector s Word64) <- Int -> ST s (MVector (PrimState (ST s)) Word64)
forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
Int -> m (MVector (PrimState m) a)
DVSM.unsafeNew ((Vector Word64 -> Int
forall a. Storable a => Vector a -> Int
DVS.length Vector Word64
ws 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)
  (MVector s Word64
newlines :: DVSM.MVector s Word64) <- Int -> ST s (MVector (PrimState (ST s)) Word64)
forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
Int -> m (MVector (PrimState m) a)
DVSM.unsafeNew ((Vector Word64 -> Int
forall a. Storable a => Vector a -> Int
DVS.length Vector Word64
ws 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)
  MVector s Word64
-> MVector s Word64 -> Position -> Word64 -> ST s ()
go MVector s Word64
markers MVector s Word64
newlines Position
0 Word64
0
  [MVector s Word64] -> ST s [MVector s Word64]
forall (m :: * -> *) a. Monad m => a -> m a
return [MVector s Word64
markers, MVector s Word64
newlines]
  where go :: DVSM.MVector s Word64 -> DVSM.MVector s Word64 -> Position -> Count -> ST s ()
        go :: MVector s Word64
-> MVector s Word64 -> Position -> Word64 -> ST s ()
go MVector s Word64
markers MVector s Word64
newlines Position
wsi Word64
numQuotes = let ui :: Position
ui = Position
wsi Position -> Position -> Position
forall a. Integral a => a -> a -> a
`div` Position
8 in if Position
wsi Position -> Position -> Bool
forall a. Ord a => a -> a -> Bool
>= Position
0 Bool -> Bool -> Bool
&& Position
wsi Position -> Position -> Position
forall a. Num a => a -> a -> a
+ Position
8 Position -> Position -> Bool
forall a. Ord a => a -> a -> Bool
<= Vector Word64 -> Position
forall v. Length v => v -> Position
end Vector Word64
ws
          then do
            let w0 :: Elem (Vector Word64)
w0    = Vector Word64
ws Vector Word64 -> Position -> Elem (Vector Word64)
forall v. AtIndex v => v -> Position -> Elem v
!!!  Position
wsi
            let w0Dqs :: Word64
w0Dqs = Word64 -> Word64
testWord8s (Word64
w0 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rdqs)
            let w0Nls :: Word64
w0Nls = Word64 -> Word64
testWord8s (Word64
w0 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rnls)
            let w0Dls :: Word64
w0Dls = Word64 -> Word64
testWord8s (Word64
w0 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rdls)
            let w1 :: Elem (Vector Word64)
w1    = Vector Word64
ws Vector Word64 -> Position -> Elem (Vector Word64)
forall v. AtIndex v => v -> Position -> Elem v
!!! (Position
wsi Position -> Position -> Position
forall a. Num a => a -> a -> a
+ Position
1)
            let w1Dqs :: Word64
w1Dqs = Word64 -> Word64
testWord8s (Word64
w1 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rdqs)
            let w1Nls :: Word64
w1Nls = Word64 -> Word64
testWord8s (Word64
w1 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rnls)
            let w1Dls :: Word64
w1Dls = Word64 -> Word64
testWord8s (Word64
w1 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rdls)
            let w2 :: Elem (Vector Word64)
w2    = Vector Word64
ws Vector Word64 -> Position -> Elem (Vector Word64)
forall v. AtIndex v => v -> Position -> Elem v
!!! (Position
wsi Position -> Position -> Position
forall a. Num a => a -> a -> a
+ Position
2)
            let w2Dqs :: Word64
w2Dqs = Word64 -> Word64
testWord8s (Word64
w2 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rdqs)
            let w2Nls :: Word64
w2Nls = Word64 -> Word64
testWord8s (Word64
w2 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rnls)
            let w2Dls :: Word64
w2Dls = Word64 -> Word64
testWord8s (Word64
w2 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rdls)
            let w3 :: Elem (Vector Word64)
w3    = Vector Word64
ws Vector Word64 -> Position -> Elem (Vector Word64)
forall v. AtIndex v => v -> Position -> Elem v
!!! (Position
wsi Position -> Position -> Position
forall a. Num a => a -> a -> a
+ Position
3)
            let w3Dqs :: Word64
w3Dqs = Word64 -> Word64
testWord8s (Word64
w3 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rdqs)
            let w3Nls :: Word64
w3Nls = Word64 -> Word64
testWord8s (Word64
w3 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rnls)
            let w3Dls :: Word64
w3Dls = Word64 -> Word64
testWord8s (Word64
w3 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rdls)
            let w4 :: Elem (Vector Word64)
w4    = Vector Word64
ws Vector Word64 -> Position -> Elem (Vector Word64)
forall v. AtIndex v => v -> Position -> Elem v
!!! (Position
wsi Position -> Position -> Position
forall a. Num a => a -> a -> a
+ Position
4)
            let w4Dqs :: Word64
w4Dqs = Word64 -> Word64
testWord8s (Word64
w4 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rdqs)
            let w4Nls :: Word64
w4Nls = Word64 -> Word64
testWord8s (Word64
w4 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rnls)
            let w4Dls :: Word64
w4Dls = Word64 -> Word64
testWord8s (Word64
w4 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rdls)
            let w5 :: Elem (Vector Word64)
w5    = Vector Word64
ws Vector Word64 -> Position -> Elem (Vector Word64)
forall v. AtIndex v => v -> Position -> Elem v
!!! (Position
wsi Position -> Position -> Position
forall a. Num a => a -> a -> a
+ Position
5)
            let w5Dqs :: Word64
w5Dqs = Word64 -> Word64
testWord8s (Word64
w5 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rdqs)
            let w5Nls :: Word64
w5Nls = Word64 -> Word64
testWord8s (Word64
w5 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rnls)
            let w5Dls :: Word64
w5Dls = Word64 -> Word64
testWord8s (Word64
w5 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rdls)
            let w6 :: Elem (Vector Word64)
w6    = Vector Word64
ws Vector Word64 -> Position -> Elem (Vector Word64)
forall v. AtIndex v => v -> Position -> Elem v
!!! (Position
wsi Position -> Position -> Position
forall a. Num a => a -> a -> a
+ Position
6)
            let w6Dqs :: Word64
w6Dqs = Word64 -> Word64
testWord8s (Word64
w6 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rdqs)
            let w6Nls :: Word64
w6Nls = Word64 -> Word64
testWord8s (Word64
w6 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rnls)
            let w6Dls :: Word64
w6Dls = Word64 -> Word64
testWord8s (Word64
w6 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rdls)
            let w7 :: Elem (Vector Word64)
w7    = Vector Word64
ws Vector Word64 -> Position -> Elem (Vector Word64)
forall v. AtIndex v => v -> Position -> Elem v
!!! (Position
wsi Position -> Position -> Position
forall a. Num a => a -> a -> a
+ Position
7)
            let w7Dqs :: Word64
w7Dqs = Word64 -> Word64
testWord8s (Word64
w7 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rdqs)
            let w7Nls :: Word64
w7Nls = Word64 -> Word64
testWord8s (Word64
w7 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rnls)
            let w7Dls :: Word64
w7Dls = Word64 -> Word64
testWord8s (Word64
w7 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rdls)
            let wDqs :: Word64
wDqs  = (Word64
w7Dqs  Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
56) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (Word64
w6Dqs Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
48) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (Word64
w5Dqs Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
40) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (Word64
w4Dqs Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
32) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (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
            let wNls :: Word64
wNls  = (Word64
w7Nls  Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
56) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (Word64
w6Nls Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
48) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (Word64
w5Nls Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
40) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (Word64
w4Nls Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
32) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (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
            let wDls :: Word64
wDls  = (Word64
w7Dls  Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
56) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (Word64
w6Dls Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
48) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (Word64
w5Dls Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
40) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (Word64
w4Dls Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
32) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (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
            let numWordQuotes :: Word64
numWordQuotes = Word64 -> Word64
forall a. BitWise a => a -> a
comp Word64
wDqs
            let wMask :: Word64
wMask = Word64 -> Word64 -> Word64
toggle64 Word64
numQuotes Word64
numWordQuotes
            let newNumQuotes :: Word64
newNumQuotes = Word64
numQuotes 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
numWordQuotes)
            MVector (PrimState (ST s)) Word64 -> Int -> Word64 -> ST s ()
forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
MVector (PrimState m) a -> Int -> a -> m ()
DVSM.unsafeWrite MVector s Word64
MVector (PrimState (ST s)) Word64
markers  (Position -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Position
ui) (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
wMask)
            MVector (PrimState (ST s)) Word64 -> Int -> Word64 -> ST s ()
forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
MVector (PrimState m) a -> Int -> a -> m ()
DVSM.unsafeWrite MVector s Word64
MVector (PrimState (ST s)) Word64
newlines (Position -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Position
ui) (Word64 -> Word64
forall a. BitWise a => a -> a
comp  Word64
wNls           Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.&. Word64
wMask)
            MVector s Word64
-> MVector s Word64 -> Position -> Word64 -> ST s ()
go MVector s Word64
markers MVector s Word64
newlines (Position
wsi Position -> Position -> Position
forall a. Num a => a -> a -> a
+ Position
8) Word64
newNumQuotes

          else do
            let 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
ws  Position
wsi
            let w0Dqs :: Word64
w0Dqs = Word64 -> Word64
testWord8s (Word64
w0 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rdqs)
            let w0Nls :: Word64
w0Nls = Word64 -> Word64
testWord8s (Word64
w0 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rnls)
            let w0Dls :: Word64
w0Dls = Word64 -> Word64
testWord8s (Word64
w0 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rdls)
            let 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
ws (Position
wsi Position -> Position -> Position
forall a. Num a => a -> a -> a
+ Position
1)
            let w1Dqs :: Word64
w1Dqs = Word64 -> Word64
testWord8s (Word64
w1 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rdqs)
            let w1Nls :: Word64
w1Nls = Word64 -> Word64
testWord8s (Word64
w1 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rnls)
            let w1Dls :: Word64
w1Dls = Word64 -> Word64
testWord8s (Word64
w1 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rdls)
            let w2 :: Elem (Vector Word64)
w2    = 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
ws (Position
wsi Position -> Position -> Position
forall a. Num a => a -> a -> a
+ Position
2)
            let w2Dqs :: Word64
w2Dqs = Word64 -> Word64
testWord8s (Word64
w2 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rdqs)
            let w2Nls :: Word64
w2Nls = Word64 -> Word64
testWord8s (Word64
w2 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rnls)
            let w2Dls :: Word64
w2Dls = Word64 -> Word64
testWord8s (Word64
w2 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rdls)
            let w3 :: Elem (Vector Word64)
w3    = 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
ws (Position
wsi Position -> Position -> Position
forall a. Num a => a -> a -> a
+ Position
3)
            let w3Dqs :: Word64
w3Dqs = Word64 -> Word64
testWord8s (Word64
w3 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rdqs)
            let w3Nls :: Word64
w3Nls = Word64 -> Word64
testWord8s (Word64
w3 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rnls)
            let w3Dls :: Word64
w3Dls = Word64 -> Word64
testWord8s (Word64
w3 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rdls)
            let w4 :: Elem (Vector Word64)
w4    = 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
ws (Position
wsi Position -> Position -> Position
forall a. Num a => a -> a -> a
+ Position
4)
            let w4Dqs :: Word64
w4Dqs = Word64 -> Word64
testWord8s (Word64
w4 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rdqs)
            let w4Nls :: Word64
w4Nls = Word64 -> Word64
testWord8s (Word64
w4 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rnls)
            let w4Dls :: Word64
w4Dls = Word64 -> Word64
testWord8s (Word64
w4 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rdls)
            let w5 :: Elem (Vector Word64)
w5    = 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
ws (Position
wsi Position -> Position -> Position
forall a. Num a => a -> a -> a
+ Position
5)
            let w5Dqs :: Word64
w5Dqs = Word64 -> Word64
testWord8s (Word64
w5 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rdqs)
            let w5Nls :: Word64
w5Nls = Word64 -> Word64
testWord8s (Word64
w5 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rnls)
            let w5Dls :: Word64
w5Dls = Word64 -> Word64
testWord8s (Word64
w5 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rdls)
            let w6 :: Elem (Vector Word64)
w6    = 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
ws (Position
wsi Position -> Position -> Position
forall a. Num a => a -> a -> a
+ Position
6)
            let w6Dqs :: Word64
w6Dqs = Word64 -> Word64
testWord8s (Word64
w6 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rdqs)
            let w6Nls :: Word64
w6Nls = Word64 -> Word64
testWord8s (Word64
w6 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rnls)
            let w6Dls :: Word64
w6Dls = Word64 -> Word64
testWord8s (Word64
w6 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rdls)
            let w7 :: Elem (Vector Word64)
w7    = 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
ws (Position
wsi Position -> Position -> Position
forall a. Num a => a -> a -> a
+ Position
7)
            let w7Dqs :: Word64
w7Dqs = Word64 -> Word64
testWord8s (Word64
w7 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rdqs)
            let w7Nls :: Word64
w7Nls = Word64 -> Word64
testWord8s (Word64
w7 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rnls)
            let w7Dls :: Word64
w7Dls = Word64 -> Word64
testWord8s (Word64
w7 Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.^. Word64
rdls)
            let wDqs :: Word64
wDqs  = (Word64
w7Dqs  Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
56) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (Word64
w6Dqs Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
48) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (Word64
w5Dqs Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
40) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (Word64
w4Dqs Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
32) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (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
            let wNls :: Word64
wNls  = (Word64
w7Nls  Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
56) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (Word64
w6Nls Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
48) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (Word64
w5Nls Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
40) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (Word64
w4Nls Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
32) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (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
            let wDls :: Word64
wDls  = (Word64
w7Dls  Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
56) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (Word64
w6Dls Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
48) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (Word64
w5Dls Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
40) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (Word64
w4Dls Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
32) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. (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
            let numWordQuotes :: Word64
numWordQuotes = Word64 -> Word64
forall a. BitWise a => a -> a
comp Word64
wDqs
            let wMask :: Word64
wMask = Word64 -> Word64 -> Word64
toggle64 Word64
numQuotes Word64
numWordQuotes
            MVector (PrimState (ST s)) Word64 -> Int -> Word64 -> ST s ()
forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
MVector (PrimState m) a -> Int -> a -> m ()
DVSM.unsafeWrite MVector s Word64
MVector (PrimState (ST s)) Word64
markers  (Position -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Position
ui) (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
wMask)
            MVector (PrimState (ST s)) Word64 -> Int -> Word64 -> ST s ()
forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
MVector (PrimState m) a -> Int -> a -> m ()
DVSM.unsafeWrite MVector s Word64
MVector (PrimState (ST s)) Word64
newlines (Position -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Position
ui) (Word64 -> Word64
forall a. BitWise a => a -> a
comp  Word64
wNls           Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.&. Word64
wMask)

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)