hw-dsv-0.3.7: src/HaskellWorks/Data/Dsv/Lazy/Cursor/Internal.hs
{-# LANGUAGE ExplicitForAll #-}
{-# LANGUAGE FlexibleContexts #-}
module HaskellWorks.Data.Dsv.Lazy.Cursor.Internal
( nextField
, nextPosition
, atEnd
, nextRow
, trim
, advanceField
) where
import HaskellWorks.Data.Dsv.Lazy.Cursor.Type
import HaskellWorks.Data.Positioning
import HaskellWorks.Data.RankSelect.Base.Rank1
import HaskellWorks.Data.RankSelect.Base.Select1
import Prelude
import qualified Data.ByteString.Lazy as LBS
advanceField :: Count -> DsvCursor -> DsvCursor
advanceField n cursor = cursor
{ dsvCursorPosition = newPos
}
where currentRank = rank1 (dsvCursorMarkers cursor) (dsvCursorPosition cursor)
newPos = select1 (dsvCursorMarkers cursor) (currentRank + n) - 1
{-# INLINE advanceField #-}
nextField :: DsvCursor -> DsvCursor
nextField cursor = cursor
{ dsvCursorPosition = newPos
}
where currentRank = rank1 (dsvCursorMarkers cursor) (dsvCursorPosition cursor)
newPos = select1 (dsvCursorMarkers cursor) (currentRank + 1) - 1
{-# INLINE nextField #-}
nextPosition :: DsvCursor -> DsvCursor
nextPosition cursor = cursor
{ dsvCursorPosition = if LBS.null (LBS.drop (fromIntegral newPos) (dsvCursorText cursor))
then fromIntegral (LBS.length (dsvCursorText cursor))
else newPos
}
where newPos = dsvCursorPosition cursor + 1
{-# INLINE nextPosition #-}
atEnd :: DsvCursor -> Bool
atEnd c = LBS.null (LBS.drop (fromIntegral (dsvCursorPosition c)) (dsvCursorText c))
{-# INLINE atEnd #-}
nextRow :: DsvCursor -> DsvCursor
nextRow cursor = cursor
{ dsvCursorPosition = if newPos > dsvCursorPosition cursor
then newPos
else fromIntegral (LBS.length (dsvCursorText cursor))
}
where currentRank = rank1 (dsvCursorNewlines cursor) (dsvCursorPosition cursor)
newPos = select1 (dsvCursorNewlines cursor) (currentRank + 1) - 1
{-# INLINE nextRow #-}
trim :: DsvCursor -> DsvCursor
trim c = if dsvCursorPosition c >= 512
then trim c
{ dsvCursorText = LBS.drop 512 (dsvCursorText c)
, dsvCursorMarkers = drop 1 (dsvCursorMarkers c)
, dsvCursorNewlines = drop 1 (dsvCursorNewlines c)
, dsvCursorPosition = dsvCursorPosition c - 512
}
else c
{-# INLINE trim #-}