hw-dsv-0.4.0: src/HaskellWorks/Data/Dsv/Lazy/Cursor.hs
module HaskellWorks.Data.Dsv.Lazy.Cursor
( DsvCursor (..)
, makeCursor
, trim
, atEnd
, nextField
, advanceField
, nextRow
, nextPosition
) where
import Data.Function
import Data.Word
import GHC.Word (Word8)
import HaskellWorks.Data.Dsv.Lazy.Cursor.Internal
import HaskellWorks.Data.Dsv.Lazy.Cursor.Type
import HaskellWorks.Data.Vector.AsVector64s
import Prelude
import qualified Data.ByteString.Lazy as LBS
import qualified Data.Vector.Storable as DVS
import qualified HaskellWorks.Data.Dsv.Internal.Char as C
import qualified HaskellWorks.Data.Dsv.Internal.Vector as DVS
import qualified HaskellWorks.Data.Simd.Comparison as DVS
makeIndexes :: [DVS.Vector Word64] -> [DVS.Vector Word64] -> [DVS.Vector Word64] -> ([DVS.Vector Word64], [DVS.Vector Word64])
makeIndexes ds ns qs = unzip $ go 0 0 ds ns qs
where go pc carry (dv:dvs) (nv:nvs) (qv:qvs) =
let (dv', nv', pc', carry') = DVS.indexCsvChunk pc carry dv nv qv in
(dv', nv'):go pc' carry' dvs nvs qvs
go _ _ [] [] [] = [(DVS.empty64, DVS.empty64)]
go _ _ _ _ _ = error "Unbalanced inputs"
makeCursor :: Word8 -> LBS.ByteString -> DsvCursor
makeCursor delimiter lbs = DsvCursor
{ dsvCursorText = lbs
, dsvCursorMarkers = ib
, dsvCursorNewlines = nls
, dsvCursorPosition = 0
}
where ws = asVector64s 64 lbs
ibq = DVS.cmpEqWord8s C.doubleQuote <$> ws
ibn = DVS.cmpEqWord8s C.newline <$> ws
ibd = DVS.cmpEqWord8s delimiter <$> ws
(ib, nls) = makeIndexes ibd ibn ibq
{-# INLINE makeCursor #-}