{-# LANGUAGE Trustworthy #-}
{-# LANGUAGE DeriveFunctor, StandaloneDeriving #-}
{-# OPTIONS_HADDOCK hide #-}
module Text.Gigaparsec.Internal (module Text.Gigaparsec.Internal) where
import Text.Gigaparsec.Internal.RT (RT)
import Control.Applicative (Applicative(liftA2), Alternative(empty, (<|>), many, some))
import Control.Selective (Selective(select))
type Parsec :: * -> *
newtype Parsec a = Parsec {
forall a.
Parsec a
-> forall r.
State -> (a -> State -> RT r) -> (State -> RT r) -> RT r
unParsec :: forall r. State
-> (a -> State -> RT r)
-> (State -> RT r)
-> RT r
}
deriving stock instance Functor Parsec
instance Applicative Parsec where
pure :: a -> Parsec a
pure :: forall a. a -> Parsec a
pure a
x = forall a.
(forall r.
State -> (a -> State -> RT r) -> (State -> RT r) -> RT r)
-> Parsec a
Parsec forall a b. (a -> b) -> a -> b
$ \State
st a -> State -> RT r
ok State -> RT r
_ -> a -> State -> RT r
ok a
x State
st
liftA2 :: (a -> b -> c) -> Parsec a -> Parsec b -> Parsec c
liftA2 :: forall a b c. (a -> b -> c) -> Parsec a -> Parsec b -> Parsec c
liftA2 a -> b -> c
f (Parsec forall r. State -> (a -> State -> RT r) -> (State -> RT r) -> RT r
p) (Parsec forall r. State -> (b -> State -> RT r) -> (State -> RT r) -> RT r
q) = forall a.
(forall r.
State -> (a -> State -> RT r) -> (State -> RT r) -> RT r)
-> Parsec a
Parsec forall a b. (a -> b) -> a -> b
$ \State
st c -> State -> RT r
ok State -> RT r
err ->
let ok' :: a -> State -> RT r
ok' a
x State
st' = forall r. State -> (b -> State -> RT r) -> (State -> RT r) -> RT r
q State
st' (c -> State -> RT r
ok forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> b -> c
f a
x) State -> RT r
err
in forall r. State -> (a -> State -> RT r) -> (State -> RT r) -> RT r
p State
st a -> State -> RT r
ok' State -> RT r
err
(*>) :: Parsec a -> Parsec b -> Parsec b
*> :: forall a b. Parsec a -> Parsec b -> Parsec b
(*>) = forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 (forall a b. a -> b -> a
const forall a. a -> a
id)
(<*) :: Parsec a -> Parsec b -> Parsec a
<* :: forall a b. Parsec a -> Parsec b -> Parsec a
(<*) = forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 forall a b. a -> b -> a
const
{-# INLINE pure #-}
{-# INLINE liftA2 #-}
{-# INLINE (<*) #-}
{-# INLINE (*>) #-}
instance Selective Parsec where
select :: Parsec (Either a b) -> Parsec (a -> b) -> Parsec b
select :: forall a b. Parsec (Either a b) -> Parsec (a -> b) -> Parsec b
select Parsec (Either a b)
p Parsec (a -> b)
q = forall a b c.
Parsec (Either a b)
-> Parsec (a -> c) -> Parsec (b -> c) -> Parsec c
_branch Parsec (Either a b)
p Parsec (a -> b)
q (forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a. a -> a
id)
{-# INLINE select #-}
{-# INLINE _branch #-}
_branch :: Parsec (Either a b) -> Parsec (a -> c) -> Parsec (b -> c) -> Parsec c
_branch :: forall a b c.
Parsec (Either a b)
-> Parsec (a -> c) -> Parsec (b -> c) -> Parsec c
_branch (Parsec forall r.
State -> (Either a b -> State -> RT r) -> (State -> RT r) -> RT r
p) (Parsec forall r.
State -> ((a -> c) -> State -> RT r) -> (State -> RT r) -> RT r
q1) (Parsec forall r.
State -> ((b -> c) -> State -> RT r) -> (State -> RT r) -> RT r
q2) = forall a.
(forall r.
State -> (a -> State -> RT r) -> (State -> RT r) -> RT r)
-> Parsec a
Parsec forall a b. (a -> b) -> a -> b
$ \State
st c -> State -> RT r
ok State -> RT r
err ->
let ok' :: Either a b -> State -> RT r
ok' Either a b
x State
st' = case Either a b
x of
Left a
a -> forall r.
State -> ((a -> c) -> State -> RT r) -> (State -> RT r) -> RT r
q1 State
st' (c -> State -> RT r
ok forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall a b. (a -> b) -> a -> b
$ a
a)) State -> RT r
err
Right b
b -> forall r.
State -> ((b -> c) -> State -> RT r) -> (State -> RT r) -> RT r
q2 State
st' (c -> State -> RT r
ok forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall a b. (a -> b) -> a -> b
$ b
b)) State -> RT r
err
in forall r.
State -> (Either a b -> State -> RT r) -> (State -> RT r) -> RT r
p State
st Either a b -> State -> RT r
ok' State -> RT r
err
instance Monad Parsec where
return :: a -> Parsec a
return :: forall a. a -> Parsec a
return = forall (f :: * -> *) a. Applicative f => a -> f a
pure
(>>=) :: Parsec a -> (a -> Parsec b) -> Parsec b
Parsec forall r. State -> (a -> State -> RT r) -> (State -> RT r) -> RT r
p >>= :: forall a b. Parsec a -> (a -> Parsec b) -> Parsec b
>>= a -> Parsec b
f = forall a.
(forall r.
State -> (a -> State -> RT r) -> (State -> RT r) -> RT r)
-> Parsec a
Parsec forall a b. (a -> b) -> a -> b
$ \State
st b -> State -> RT r
ok State -> RT r
err ->
let ok' :: a -> State -> RT r
ok' a
x State
st' = forall a.
Parsec a
-> forall r.
State -> (a -> State -> RT r) -> (State -> RT r) -> RT r
unParsec (a -> Parsec b
f a
x) State
st' b -> State -> RT r
ok State -> RT r
err
in forall r. State -> (a -> State -> RT r) -> (State -> RT r) -> RT r
p State
st a -> State -> RT r
ok' State -> RT r
err
(>>) :: Parsec a -> Parsec b -> Parsec b
>> :: forall a b. Parsec a -> Parsec b -> Parsec b
(>>) = forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
(*>)
{-# INLINE return #-}
{-# INLINE (>>=) #-}
instance Alternative Parsec where
empty :: Parsec a
empty :: forall a. Parsec a
empty = forall a.
(forall r.
State -> (a -> State -> RT r) -> (State -> RT r) -> RT r)
-> Parsec a
Parsec forall a b. (a -> b) -> a -> b
$ \State
st a -> State -> RT r
_ State -> RT r
err -> State -> RT r
err State
st
(<|>) :: Parsec a -> Parsec a -> Parsec a
Parsec forall r. State -> (a -> State -> RT r) -> (State -> RT r) -> RT r
p <|> :: forall a. Parsec a -> Parsec a -> Parsec a
<|> Parsec forall r. State -> (a -> State -> RT r) -> (State -> RT r) -> RT r
q = forall a.
(forall r.
State -> (a -> State -> RT r) -> (State -> RT r) -> RT r)
-> Parsec a
Parsec forall a b. (a -> b) -> a -> b
$ \State
st a -> State -> RT r
ok State -> RT r
err ->
let !initConsumed :: Bool
initConsumed = State -> Bool
consumed State
st
ok' :: a -> State -> RT r
ok' a
x State
st' = a -> State -> RT r
ok a
x (State
st' { consumed :: Bool
consumed = Bool
initConsumed Bool -> Bool -> Bool
|| State -> Bool
consumed State
st' })
err' :: State -> RT r
err' State
st'
| State -> Bool
consumed State
st' = State -> RT r
err State
st'
| Bool
otherwise = forall r. State -> (a -> State -> RT r) -> (State -> RT r) -> RT r
q (State
st' { consumed :: Bool
consumed = Bool
initConsumed }) a -> State -> RT r
ok State -> RT r
err
in forall r. State -> (a -> State -> RT r) -> (State -> RT r) -> RT r
p (State
st { consumed :: Bool
consumed = Bool
False }) a -> State -> RT r
ok' State -> RT r
err'
many :: Parsec a -> Parsec [a]
many :: forall a. Parsec a -> Parsec [a]
many = forall a b. (a -> b -> b) -> b -> Parsec a -> Parsec b
manyr (:) []
some :: Parsec a -> Parsec [a]
some :: forall a. Parsec a -> Parsec [a]
some = forall a b. (a -> b -> b) -> b -> Parsec a -> Parsec b
somer (:) []
{-# INLINE empty #-}
{-# INLINE (<|>) #-}
{-# INLINE many #-}
{-# INLINE some #-}
{-# INLINE manyr #-}
manyr :: (a -> b -> b) -> b -> Parsec a -> Parsec b
manyr :: forall a b. (a -> b -> b) -> b -> Parsec a -> Parsec b
manyr a -> b -> b
f b
k Parsec a
p = let go :: Parsec b
go = forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 a -> b -> b
f Parsec a
p Parsec b
go forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall (f :: * -> *) a. Applicative f => a -> f a
pure b
k in Parsec b
go
{-# INLINE somer #-}
somer :: (a -> b -> b) -> b -> Parsec a -> Parsec b
somer :: forall a b. (a -> b -> b) -> b -> Parsec a -> Parsec b
somer a -> b -> b
f b
k Parsec a
p = forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 a -> b -> b
f Parsec a
p (forall a b. (a -> b -> b) -> b -> Parsec a -> Parsec b
manyr a -> b -> b
f b
k Parsec a
p)
instance Semigroup m => Semigroup (Parsec m) where
(<>) :: Parsec m -> Parsec m -> Parsec m
<> :: Parsec m -> Parsec m -> Parsec m
(<>) = forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 forall a. Semigroup a => a -> a -> a
(<>)
{-# INLINE (<>) #-}
instance Monoid m => Monoid (Parsec m) where
mempty :: Parsec m
mempty :: Parsec m
mempty = forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a. Monoid a => a
mempty
{-# INLINE mempty #-}
type State :: *
data State = State {
State -> String
input :: !String,
State -> Bool
consumed :: !Bool,
State -> Int
line :: {-# UNPACK #-} !Int,
State -> Int
col :: {-# UNPACK #-} !Int
}
emptyState :: String -> State
emptyState :: String -> State
emptyState !String
str = State { input :: String
input = String
str
, consumed :: Bool
consumed = Bool
False
, line :: Int
line = Int
1
, col :: Int
col = Int
1
}