module Toml.Position (
Position(..),
startPos,
move,
) where
data Position = Position {
Position -> Int
posIndex :: {-# UNPACK #-} !Int,
Position -> Int
posLine :: {-# UNPACK #-} !Int,
Position -> Int
posColumn :: {-# UNPACK #-} !Int
} deriving (
Read ,
Show ,
Ord ,
Eq )
startPos :: Position
startPos :: Position
startPos = Position :: Int -> Int -> Int -> Position
Position { posIndex :: Int
posIndex = Int
0, posLine :: Int
posLine = Int
1, posColumn :: Int
posColumn = Int
1 }
move :: Char -> Position -> Position
move :: Char -> Position -> Position
move Char
x Position{ posIndex :: Position -> Int
posIndex = Int
i, posLine :: Position -> Int
posLine = Int
l, posColumn :: Position -> Int
posColumn = Int
c} =
case Char
x of
Char
'\n' -> Position :: Int -> Int -> Int -> Position
Position{ posIndex :: Int
posIndex = Int
iInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1, posLine :: Int
posLine = Int
lInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1, posColumn :: Int
posColumn = Int
1 }
Char
'\t' -> Position :: Int -> Int -> Int -> Position
Position{ posIndex :: Int
posIndex = Int
iInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1, posLine :: Int
posLine = Int
l, posColumn :: Int
posColumn = (Int
c Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
7) Int -> Int -> Int
forall a. Integral a => a -> a -> a
`quot` Int
8 Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
8 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1 }
Char
_ -> Position :: Int -> Int -> Int -> Position
Position{ posIndex :: Int
posIndex = Int
iInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1, posLine :: Int
posLine = Int
l, posColumn :: Int
posColumn = Int
cInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1 }