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