{-# 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
(:|)

{-
infixl 4 <<|>
(<<|>) :: Parsec a -> Parsec (NonEmpty a) -> Parsec (NonEmpty a)
(<<|>) = liftA2 (<|)
-}

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