-- Simple data type to keep track of character positions -- within a text file or other text stream. module Text.Packrat.Pos where data Pos = Pos { posFile :: !String , posLine :: !Int , posCol :: !Int } nextPos :: Pos -> Char -> Pos nextPos (Pos file line col) c | c == '\n' = Pos file (line + 1) 1 | c == '\t' = Pos file line ((div (col + 8 - 1) 8) * 8 + 1) | otherwise = Pos file line (col + 1) instance Eq Pos where Pos f1 l1 c1 == Pos f2 l2 c2 = f1 == f2 && l1 == l2 && c1 == c2 instance Ord Pos where Pos _ l1 c1 <= Pos _ l2 c2 = (l1 < l2) || (l1 == l2 && c1 <= c2) instance Show Pos where show (Pos file line col) = file ++ ":" ++ show line ++ ":" ++ show col showPosRel :: Pos -> Pos -> String showPosRel (Pos file line _) (Pos file' line' col') | file == file' = if (line == line') then "column " ++ show col' else "line " ++ show line' ++ ", column " ++ show col' | otherwise = show (Pos file' line' col')