{-# 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 = forall a b. (a -> b) -> Parsec a -> Parsec (b -> a -> b) -> Parsec b Infix.infixl1 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 = forall a b. (a -> b) -> Parsec a -> Parsec (a -> b -> b) -> Parsec b Infix.infixr1 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 = forall a b. (a -> b) -> Parsec a -> Parsec (a -> a -> b) -> Parsec b Infix.infixn1 forall a. a -> a id prefix :: Parsec (a -> a) -> Parsec a -> Parsec a prefix :: forall a. Parsec (a -> a) -> Parsec a -> Parsec a prefix = forall a b. (a -> b) -> Parsec (b -> b) -> Parsec a -> Parsec b Infix.prefix forall a. a -> a id postfix :: Parsec a -> Parsec (a -> a) -> Parsec a postfix :: forall a. Parsec a -> Parsec (a -> a) -> Parsec a postfix = forall a b. (a -> b) -> Parsec a -> Parsec (b -> b) -> Parsec b Infix.postfix 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 forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b <*> forall a. Parsec (a -> a) -> Parsec a -> Parsec a prefix ((b -> a wrap forall b c a. (b -> c) -> (a -> b) -> a -> c .) 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 = forall a. Parsec a -> Parsec (a -> a) -> Parsec a postfix (Parsec a p forall (f :: * -> *) a b. Applicative f => f a -> f (a -> b) -> f b <**> Parsec (a -> b) op) ((forall b c a. (b -> c) -> (a -> b) -> a -> c . b -> a wrap) 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 = forall a. Parsec a -> Parsec (a -> a -> a) -> Parsec a chainl1 Parsec a p Parsec (a -> a -> a) op forall (f :: * -> *) a. Alternative f => f a -> f a -> f 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 = forall a. Parsec a -> Parsec (a -> a -> a) -> Parsec a chainr1 Parsec a p Parsec (a -> a -> a) op forall (f :: * -> *) a. Alternative f => f a -> f a -> f a <|> forall (f :: * -> *) a. Applicative f => a -> f a pure a x