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

import Text.Gigaparsec (Parsec, (<|>), (<**>))
import Text.Gigaparsec.Expr.Infix qualified as Infix (infixl1, infixr1, infixn1, prefix, postfix)

chainl1 :: Parsec a -> Parsec (a -> a -> a) -> Parsec a
chainl1 :: forall a. Parsec a -> Parsec (a -> a -> a) -> Parsec a
chainl1 = (a -> a) -> Parsec a -> Parsec (a -> a -> a) -> Parsec a
forall a b.
(a -> b) -> Parsec a -> Parsec (b -> a -> b) -> Parsec b
Infix.infixl1 a -> a
forall a. a -> a
id

chainr1 :: Parsec a -> Parsec (a -> a -> a) -> Parsec a
chainr1 :: forall a. Parsec a -> Parsec (a -> a -> a) -> Parsec a
chainr1 = (a -> a) -> Parsec a -> Parsec (a -> a -> a) -> Parsec a
forall a b.
(a -> b) -> Parsec a -> Parsec (a -> b -> b) -> Parsec b
Infix.infixr1 a -> a
forall a. a -> a
id

chainn1 :: Parsec a -> Parsec (a -> a -> a) -> Parsec a
chainn1 :: forall a. Parsec a -> Parsec (a -> a -> a) -> Parsec a
chainn1 = (a -> a) -> Parsec a -> Parsec (a -> a -> a) -> Parsec a
forall a b.
(a -> b) -> Parsec a -> Parsec (a -> a -> b) -> Parsec b
Infix.infixn1 a -> a
forall a. a -> a
id

prefix :: Parsec (a -> a) -> Parsec a -> Parsec a
prefix :: forall a. Parsec (a -> a) -> Parsec a -> Parsec a
prefix = (a -> a) -> Parsec (a -> a) -> Parsec a -> Parsec a
forall a b. (a -> b) -> Parsec (b -> b) -> Parsec a -> Parsec b
Infix.prefix a -> a
forall a. a -> a
id

postfix :: Parsec a -> Parsec (a -> a) -> Parsec a
postfix :: forall a. Parsec a -> Parsec (a -> a) -> Parsec a
postfix = (a -> a) -> Parsec a -> Parsec (a -> a) -> Parsec a
forall a b. (a -> b) -> Parsec a -> Parsec (b -> b) -> Parsec b
Infix.postfix a -> a
forall a. a -> a
id

prefix1 :: (b -> a) -> Parsec (a -> b) -> Parsec a -> Parsec b
prefix1 :: forall b a. (b -> a) -> Parsec (a -> b) -> Parsec a -> Parsec b
prefix1 b -> a
wrap Parsec (a -> b)
op Parsec a
p = Parsec (a -> b)
op Parsec (a -> b) -> Parsec a -> 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
<*> Parsec (a -> a) -> Parsec a -> Parsec a
forall a. Parsec (a -> a) -> Parsec a -> Parsec a
prefix ((b -> a
wrap (b -> a) -> (a -> b) -> a -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((a -> b) -> a -> a) -> Parsec (a -> b) -> Parsec (a -> a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parsec (a -> b)
op) Parsec a
p

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

chainl :: Parsec a -> Parsec (a -> a -> a) -> a -> Parsec a
chainl :: forall a. Parsec a -> Parsec (a -> a -> a) -> a -> Parsec a
chainl Parsec a
p Parsec (a -> a -> a)
op a
x = Parsec a -> Parsec (a -> a -> a) -> Parsec a
forall a. Parsec a -> Parsec (a -> a -> a) -> Parsec a
chainl1 Parsec a
p Parsec (a -> a -> a)
op Parsec a -> Parsec a -> Parsec a
forall a. Parsec a -> Parsec a -> Parsec a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> a -> Parsec a
forall a. a -> Parsec a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
x

chainr :: Parsec a -> Parsec (a -> a -> a) -> a -> Parsec a
chainr :: forall a. Parsec a -> Parsec (a -> a -> a) -> a -> Parsec a
chainr Parsec a
p Parsec (a -> a -> a)
op a
x = Parsec a -> Parsec (a -> a -> a) -> Parsec a
forall a. Parsec a -> Parsec (a -> a -> a) -> Parsec a
chainr1 Parsec a
p Parsec (a -> a -> a)
op Parsec a -> Parsec a -> Parsec a
forall a. Parsec a -> Parsec a -> Parsec a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> a -> Parsec a
forall a. a -> Parsec a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
x