{-# LANGUAGE Safe #-}
module Text.Gigaparsec.Combinator.NonEmpty (some, someTill, sepBy1, sepEndBy1, endBy1) where
import Text.Gigaparsec (Parsec, liftA2, many, notFollowedBy)
import Text.Gigaparsec.Combinator qualified as Combinator (manyTill, sepEndBy1)
import Data.List.NonEmpty as NonEmpty (NonEmpty((:|)), fromList)
infixl 4 <:|>
(<:|>) :: Parsec a -> Parsec [a] -> Parsec (NonEmpty a)
<:|> :: forall a. Parsec a -> Parsec [a] -> Parsec (NonEmpty a)
(<:|>) = forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 forall a. a -> [a] -> NonEmpty a
(:|)
some :: Parsec a -> Parsec (NonEmpty a)
some :: forall a. Parsec a -> Parsec (NonEmpty a)
some Parsec a
p = Parsec a
p forall a. Parsec a -> Parsec [a] -> Parsec (NonEmpty a)
<:|> forall (f :: * -> *) a. Alternative f => f a -> f [a]
many Parsec a
p
someTill :: Parsec a -> Parsec end -> Parsec (NonEmpty a)
someTill :: forall a end. Parsec a -> Parsec end -> Parsec (NonEmpty a)
someTill Parsec a
p Parsec end
end = forall a. Parsec a -> Parsec ()
notFollowedBy Parsec end
end forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> (Parsec a
p forall a. Parsec a -> Parsec [a] -> Parsec (NonEmpty a)
<:|> forall a end. Parsec a -> Parsec end -> Parsec [a]
Combinator.manyTill Parsec a
p Parsec end
end)
sepBy1 :: Parsec a -> Parsec sep -> Parsec (NonEmpty a)
sepBy1 :: forall a end. Parsec a -> Parsec end -> Parsec (NonEmpty a)
sepBy1 Parsec a
p Parsec sep
sep = Parsec a
p forall a. Parsec a -> Parsec [a] -> Parsec (NonEmpty a)
<:|> forall (f :: * -> *) a. Alternative f => f a -> f [a]
many (Parsec sep
sep forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parsec a
p)
endBy1 :: Parsec a -> Parsec sep -> Parsec (NonEmpty a)
endBy1 :: forall a end. Parsec a -> Parsec end -> Parsec (NonEmpty a)
endBy1 Parsec a
p Parsec sep
sep = forall a. Parsec a -> Parsec (NonEmpty a)
some (Parsec a
p forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parsec sep
sep)
sepEndBy1 :: Parsec a -> Parsec sep -> Parsec (NonEmpty a)
sepEndBy1 :: forall a end. Parsec a -> Parsec end -> Parsec (NonEmpty a)
sepEndBy1 Parsec a
p Parsec sep
sep = forall a. [a] -> NonEmpty a
NonEmpty.fromList forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a end. Parsec a -> Parsec end -> Parsec [a]
Combinator.sepEndBy1 Parsec a
p Parsec sep
sep