{-# LANGUAGE Safe #-}
module Text.Gigaparsec.Position (Pos, line, col, pos, offset, withWidth) where

import Text.Gigaparsec.Internal (Parsec)
import Text.Gigaparsec.Internal qualified as Internal (Parsec(Parsec), line, col, consumed)
import Control.Applicative (liftA2, liftA3)

type Pos :: *
type Pos = (Word, Word)

line :: Parsec Word
line :: Parsec Word
line = (forall r.
 State
 -> (Word -> State -> RT r) -> (Error -> State -> RT r) -> RT r)
-> Parsec Word
forall a.
(forall r.
 State -> (a -> State -> RT r) -> (Error -> State -> RT r) -> RT r)
-> Parsec a
Internal.Parsec ((forall r.
  State
  -> (Word -> State -> RT r) -> (Error -> State -> RT r) -> RT r)
 -> Parsec Word)
-> (forall r.
    State
    -> (Word -> State -> RT r) -> (Error -> State -> RT r) -> RT r)
-> Parsec Word
forall a b. (a -> b) -> a -> b
$ \State
st Word -> State -> RT r
good Error -> State -> RT r
_ -> Word -> State -> RT r
good (State -> Word
Internal.line State
st) State
st

col :: Parsec Word
col :: Parsec Word
col = (forall r.
 State
 -> (Word -> State -> RT r) -> (Error -> State -> RT r) -> RT r)
-> Parsec Word
forall a.
(forall r.
 State -> (a -> State -> RT r) -> (Error -> State -> RT r) -> RT r)
-> Parsec a
Internal.Parsec ((forall r.
  State
  -> (Word -> State -> RT r) -> (Error -> State -> RT r) -> RT r)
 -> Parsec Word)
-> (forall r.
    State
    -> (Word -> State -> RT r) -> (Error -> State -> RT r) -> RT r)
-> Parsec Word
forall a b. (a -> b) -> a -> b
$ \State
st Word -> State -> RT r
good Error -> State -> RT r
_ -> Word -> State -> RT r
good (State -> Word
Internal.col State
st) State
st

offset :: Parsec Word
offset :: Parsec Word
offset = (forall r.
 State
 -> (Word -> State -> RT r) -> (Error -> State -> RT r) -> RT r)
-> Parsec Word
forall a.
(forall r.
 State -> (a -> State -> RT r) -> (Error -> State -> RT r) -> RT r)
-> Parsec a
Internal.Parsec ((forall r.
  State
  -> (Word -> State -> RT r) -> (Error -> State -> RT r) -> RT r)
 -> Parsec Word)
-> (forall r.
    State
    -> (Word -> State -> RT r) -> (Error -> State -> RT r) -> RT r)
-> Parsec Word
forall a b. (a -> b) -> a -> b
$ \State
st Word -> State -> RT r
good Error -> State -> RT r
_ -> Word -> State -> RT r
good (State -> Word
Internal.consumed State
st) State
st

pos :: Parsec Pos
pos :: Parsec Pos
pos = (Word -> Word -> Pos) -> Parsec Word -> Parsec Word -> Parsec Pos
forall a b c. (a -> b -> c) -> Parsec a -> Parsec b -> Parsec c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 (,) Parsec Word
line Parsec Word
col

withWidth :: Parsec a -> Parsec (a, Word)
withWidth :: forall a. Parsec a -> Parsec (a, Word)
withWidth Parsec a
p = (Word -> a -> Word -> (a, Word))
-> Parsec Word -> Parsec a -> Parsec Word -> Parsec (a, Word)
forall (f :: * -> *) a b c d.
Applicative f =>
(a -> b -> c -> d) -> f a -> f b -> f c -> f d
liftA3 (\Word
s a
x Word
e -> (a
x, Word
eWord -> Word -> Word
forall a. Num a => a -> a -> a
-Word
s)) Parsec Word
offset Parsec a
p Parsec Word
offset