{-# 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)
(<:|>) = (a -> [a] -> NonEmpty a)
-> Parsec a -> Parsec [a] -> Parsec (NonEmpty a)
forall a b c. (a -> b -> c) -> Parsec a -> Parsec b -> Parsec c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 a -> [a] -> NonEmpty a
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 Parsec a -> Parsec [a] -> Parsec (NonEmpty a)
forall a. Parsec a -> Parsec [a] -> Parsec (NonEmpty a)
<:|> Parsec a -> Parsec [a]
forall a. Parsec a -> Parsec [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 = Parsec end -> Parsec ()
forall a. Parsec a -> Parsec ()
notFollowedBy Parsec end
end Parsec () -> Parsec (NonEmpty a) -> Parsec (NonEmpty a)
forall a b. Parsec a -> Parsec b -> Parsec b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> (Parsec a
p Parsec a -> Parsec [a] -> Parsec (NonEmpty a)
forall a. Parsec a -> Parsec [a] -> Parsec (NonEmpty a)
<:|> Parsec a -> Parsec end -> Parsec [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 Parsec a -> Parsec [a] -> Parsec (NonEmpty a)
forall a. Parsec a -> Parsec [a] -> Parsec (NonEmpty a)
<:|> Parsec a -> Parsec [a]
forall a. Parsec a -> Parsec [a]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many (Parsec sep
sep Parsec sep -> Parsec a -> Parsec a
forall a b. Parsec a -> Parsec b -> Parsec b
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 = Parsec a -> Parsec (NonEmpty a)
forall a. Parsec a -> Parsec (NonEmpty a)
some (Parsec a
p Parsec a -> Parsec sep -> Parsec a
forall a b. Parsec a -> Parsec b -> Parsec a
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 = [a] -> NonEmpty a
forall a. HasCallStack => [a] -> NonEmpty a
NonEmpty.fromList ([a] -> NonEmpty a) -> Parsec [a] -> Parsec (NonEmpty a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parsec a -> Parsec sep -> Parsec [a]
forall a end. Parsec a -> Parsec end -> Parsec [a]
Combinator.sepEndBy1 Parsec a
p Parsec sep
sep