{-# 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 #-}