{-# 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