{-# LANGUAGE Safe #-}
module Text.Gigaparsec.Expr.Infix (module Text.Gigaparsec.Expr.Infix) where

import Text.Gigaparsec (Parsec, (<|>), (<**>))

infixl1 :: (a -> b) -> Parsec a -> Parsec (b -> a -> b) -> Parsec b
infixl1 :: forall a b.
(a -> b) -> Parsec a -> Parsec (b -> a -> b) -> Parsec b
infixl1 a -> b
wrap Parsec a
p Parsec (b -> a -> b)
op = forall a b. (a -> b) -> Parsec a -> Parsec (b -> b) -> Parsec b
postfix a -> b
wrap Parsec a
p (forall a b c. (a -> b -> c) -> b -> a -> c
flip forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parsec (b -> a -> b)
op forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parsec a
p)

infixr1 :: (a -> b) -> Parsec a -> Parsec (a -> b -> b) -> Parsec b
infixr1 :: forall a b.
(a -> b) -> Parsec a -> Parsec (a -> b -> b) -> Parsec b
infixr1 a -> b
wrap Parsec a
p Parsec (a -> b -> b)
op = Parsec a
p forall (f :: * -> *) a b. Applicative f => f a -> f (a -> b) -> f b
<**> (forall a b c. (a -> b -> c) -> b -> a -> c
flip forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parsec (a -> b -> b)
op forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall a b.
(a -> b) -> Parsec a -> Parsec (a -> b -> b) -> Parsec b
infixr1 a -> b
wrap Parsec a
p Parsec (a -> b -> b)
op forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall (f :: * -> *) a. Applicative f => a -> f a
pure a -> b
wrap)

infixn1 :: (a -> b) -> Parsec a -> Parsec (a -> a -> b) -> Parsec b
infixn1 :: forall a b.
(a -> b) -> Parsec a -> Parsec (a -> a -> b) -> Parsec b
infixn1 a -> b
wrap Parsec a
p Parsec (a -> a -> b)
op = Parsec a
p forall (f :: * -> *) a b. Applicative f => f a -> f (a -> b) -> f b
<**> (forall a b c. (a -> b -> c) -> b -> a -> c
flip forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parsec (a -> a -> b)
op forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parsec a
p forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall (f :: * -> *) a. Applicative f => a -> f a
pure a -> b
wrap)

prefix :: (a -> b) -> Parsec (b -> b) -> Parsec a -> Parsec b
prefix :: forall a b. (a -> b) -> Parsec (b -> b) -> Parsec a -> Parsec b
prefix a -> b
wrap Parsec (b -> b)
op Parsec a
p = Parsec (b -> b)
op forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall a b. (a -> b) -> Parsec (b -> b) -> Parsec a -> Parsec b
prefix a -> b
wrap Parsec (b -> b)
op Parsec a
p forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> a -> b
wrap forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parsec a
p

postfix :: (a -> b) -> Parsec a -> Parsec (b -> b) -> Parsec b
postfix :: forall a b. (a -> b) -> Parsec a -> Parsec (b -> b) -> Parsec b
postfix a -> b
wrap Parsec a
p Parsec (b -> b)
op = a -> b
wrap forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parsec a
p forall (f :: * -> *) a b. Applicative f => f a -> f (a -> b) -> f b
<**> Parsec (b -> b)
rest
  where rest :: Parsec (b -> b)
rest = forall a b c. (a -> b -> c) -> b -> a -> c
flip forall b c a. (b -> c) -> (a -> b) -> a -> c
(.) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parsec (b -> b)
op forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parsec (b -> b)
rest forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a. a -> a
id