{-# Language DeriveDataTypeable #-} module Text.Peggy.SrcLoc ( SrcLoc(..), SrcPos(..), advance, ) where import Data.Data data SrcLoc = LocPos !SrcPos | LocSpan !SrcPos !SrcPos deriving (Show, Eq, Ord, Typeable, Data) data SrcPos = SrcPos { locFile :: !FilePath , locAbs :: {-# UNPACK #-} !Int , locLine :: {-# UNPACK #-} !Int , locCol :: {-# UNPACK #-} !Int } deriving (Show, Eq, Ord, Typeable, Data) tabWidth :: Int tabWidth = 8 advance :: SrcPos -> Char -> SrcPos advance (SrcPos f a l c) x = case x of '\t' -> SrcPos f (a + 1) l ((c - 1 + tabWidth - 1) `div` tabWidth * tabWidth + 1) '\n' -> SrcPos f (a + 1) (l + 1) 1 _ -> SrcPos f (a + 1) l (c + 1)