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')