module Text.ParserCombinators.Parsec.Pos
( Column
, Line
, SourceName
, SourcePos
, incSourceColumn
, incSourceLine
, initialPos
, newPos
, setSourceColumn
, setSourceLine
, setSourceName
, sourceColumn
, sourceLine
, sourceName
, updatePosChar
, updatePosString
) where
type SourceName = String
type Line = Int
type Column = Int
data SourcePos = SourcePos
{ SourcePos -> SourceName
sourceName :: SourceName
, SourcePos -> Line
sourceLine :: !Line
, SourcePos -> Line
sourceColumn :: !Column
} deriving (SourcePos -> SourcePos -> Bool
(SourcePos -> SourcePos -> Bool)
-> (SourcePos -> SourcePos -> Bool) -> Eq SourcePos
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SourcePos -> SourcePos -> Bool
$c/= :: SourcePos -> SourcePos -> Bool
== :: SourcePos -> SourcePos -> Bool
$c== :: SourcePos -> SourcePos -> Bool
Eq, Eq SourcePos
Eq SourcePos
-> (SourcePos -> SourcePos -> Ordering)
-> (SourcePos -> SourcePos -> Bool)
-> (SourcePos -> SourcePos -> Bool)
-> (SourcePos -> SourcePos -> Bool)
-> (SourcePos -> SourcePos -> Bool)
-> (SourcePos -> SourcePos -> SourcePos)
-> (SourcePos -> SourcePos -> SourcePos)
-> Ord SourcePos
SourcePos -> SourcePos -> Bool
SourcePos -> SourcePos -> Ordering
SourcePos -> SourcePos -> SourcePos
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: SourcePos -> SourcePos -> SourcePos
$cmin :: SourcePos -> SourcePos -> SourcePos
max :: SourcePos -> SourcePos -> SourcePos
$cmax :: SourcePos -> SourcePos -> SourcePos
>= :: SourcePos -> SourcePos -> Bool
$c>= :: SourcePos -> SourcePos -> Bool
> :: SourcePos -> SourcePos -> Bool
$c> :: SourcePos -> SourcePos -> Bool
<= :: SourcePos -> SourcePos -> Bool
$c<= :: SourcePos -> SourcePos -> Bool
< :: SourcePos -> SourcePos -> Bool
$c< :: SourcePos -> SourcePos -> Bool
compare :: SourcePos -> SourcePos -> Ordering
$ccompare :: SourcePos -> SourcePos -> Ordering
$cp1Ord :: Eq SourcePos
Ord)
newPos :: SourceName -> Line -> Column -> SourcePos
newPos :: SourceName -> Line -> Line -> SourcePos
newPos = SourceName -> Line -> Line -> SourcePos
SourcePos
initialPos :: SourceName -> SourcePos
initialPos :: SourceName -> SourcePos
initialPos SourceName
name = SourceName -> Line -> Line -> SourcePos
newPos SourceName
name Line
1 Line
1
incSourceLine :: SourcePos -> Line -> SourcePos
incSourceLine :: SourcePos -> Line -> SourcePos
incSourceLine (SourcePos SourceName
name Line
line Line
column) Line
n
= SourceName -> Line -> Line -> SourcePos
SourcePos SourceName
name (Line
line Line -> Line -> Line
forall a. Num a => a -> a -> a
+ Line
n) Line
column
incSourceColumn :: SourcePos -> Column -> SourcePos
incSourceColumn :: SourcePos -> Line -> SourcePos
incSourceColumn (SourcePos SourceName
name Line
line Line
column) Line
n
= SourceName -> Line -> Line -> SourcePos
SourcePos SourceName
name Line
line (Line
column Line -> Line -> Line
forall a. Num a => a -> a -> a
+ Line
n)
setSourceName :: SourcePos -> SourceName -> SourcePos
setSourceName :: SourcePos -> SourceName -> SourcePos
setSourceName (SourcePos SourceName
_name Line
line Line
column) SourceName
n = SourceName -> Line -> Line -> SourcePos
SourcePos SourceName
n Line
line Line
column
setSourceLine :: SourcePos -> Line -> SourcePos
setSourceLine :: SourcePos -> Line -> SourcePos
setSourceLine (SourcePos SourceName
name Line
_line Line
column) Line
n = SourceName -> Line -> Line -> SourcePos
SourcePos SourceName
name Line
n Line
column
setSourceColumn :: SourcePos -> Column -> SourcePos
setSourceColumn :: SourcePos -> Line -> SourcePos
setSourceColumn (SourcePos SourceName
name Line
line Line
_column) = SourceName -> Line -> Line -> SourcePos
SourcePos SourceName
name Line
line
updatePosString :: SourcePos -> String -> SourcePos
updatePosString :: SourcePos -> SourceName -> SourcePos
updatePosString SourcePos
pos SourceName
string = SourcePos -> SourcePos
forcePos ((SourcePos -> Char -> SourcePos)
-> SourcePos -> SourceName -> SourcePos
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl SourcePos -> Char -> SourcePos
updatePosChar SourcePos
pos SourceName
string)
updatePosChar :: SourcePos -> Char -> SourcePos
updatePosChar :: SourcePos -> Char -> SourcePos
updatePosChar (SourcePos SourceName
name Line
line Line
column) Char
c = SourcePos -> SourcePos
forcePos (SourcePos -> SourcePos) -> SourcePos -> SourcePos
forall a b. (a -> b) -> a -> b
$ case Char
c of
Char
'\n' -> SourceName -> Line -> Line -> SourcePos
SourcePos SourceName
name (Line
line Line -> Line -> Line
forall a. Num a => a -> a -> a
+ Line
1) Line
1
Char
'\t' -> SourceName -> Line -> Line -> SourcePos
SourcePos SourceName
name Line
line (Line
column Line -> Line -> Line
forall a. Num a => a -> a -> a
+ Line
8 Line -> Line -> Line
forall a. Num a => a -> a -> a
- ((Line
column Line -> Line -> Line
forall a. Num a => a -> a -> a
- Line
1) Line -> Line -> Line
forall a. Integral a => a -> a -> a
`mod` Line
8))
Char
_ -> SourceName -> Line -> Line -> SourcePos
SourcePos SourceName
name Line
line (Line
column Line -> Line -> Line
forall a. Num a => a -> a -> a
+ Line
1)
forcePos :: SourcePos -> SourcePos
forcePos :: SourcePos -> SourcePos
forcePos pos :: SourcePos
pos@(SourcePos SourceName
_name Line
line Line
column) = Line -> SourcePos -> SourcePos
seq Line
line (Line -> SourcePos -> SourcePos
seq Line
column SourcePos
pos)
instance Show SourcePos where
show :: SourcePos -> SourceName
show (SourcePos SourceName
name Line
line Line
column)
| SourceName -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null SourceName
name = SourceName
showLineColumn
| Bool
otherwise = SourceName
"\"" SourceName -> ShowS
forall a. [a] -> [a] -> [a]
++ SourceName
name SourceName -> ShowS
forall a. [a] -> [a] -> [a]
++ SourceName
"\" " SourceName -> ShowS
forall a. [a] -> [a] -> [a]
++ SourceName
showLineColumn
where
showLineColumn :: SourceName
showLineColumn = SourceName
"(line " SourceName -> ShowS
forall a. [a] -> [a] -> [a]
++ Line -> SourceName
forall a. Show a => a -> SourceName
show Line
line SourceName -> ShowS
forall a. [a] -> [a] -> [a]
++
SourceName
", column " SourceName -> ShowS
forall a. [a] -> [a] -> [a]
++ Line -> SourceName
forall a. Show a => a -> SourceName
show Line
column SourceName -> ShowS
forall a. [a] -> [a] -> [a]
++
SourceName
")"