@@ -29,7 +29,8 @@ import Control.Monad.State (StateT(..), runStateT)
2929import Control.Plus (empty , (<|>))
3030import Data.Either (Either (..))
3131import Data.Foldable (class Foldable , foldl )
32- import Data.List (List (..), (:), many , some , singleton )
32+ import Data.List (List (..), (:), many )
33+ import Data.List.NonEmpty (NonEmptyList , cons' , singleton )
3334import Data.Maybe (Maybe (..))
3435import Data.Newtype (unwrap )
3536import Data.Tuple (Tuple (..))
@@ -99,30 +100,40 @@ lookAhead p = (ParserT <<< ExceptT <<< StateT) \s -> do
99100-- | digit `sepBy` string ","
100101-- | ```
101102sepBy :: forall m s a sep . Monad m => ParserT s m a -> ParserT s m sep -> ParserT s m (List a )
102- sepBy p sep = sepBy1 p sep <|> pure Nil
103+ sepBy p sep =
104+ (do a <- p
105+ as <- many $ sep *> p
106+ pure (a : as)) <|> pure Nil
103107
104108-- | Parse phrases delimited by a separator, requiring at least one match.
105- sepBy1 :: forall m s a sep . Monad m => ParserT s m a -> ParserT s m sep -> ParserT s m (List a )
109+ sepBy1 :: forall m s a sep . Monad m => ParserT s m a -> ParserT s m sep -> ParserT s m (NonEmptyList a )
106110sepBy1 p sep = do
107111 a <- p
108112 as <- many $ sep *> p
109- pure (a : as)
113+ pure (cons' a as)
110114
111115-- | Parse phrases delimited and optionally terminated by a separator.
112116sepEndBy :: forall m s a sep . Monad m => ParserT s m a -> ParserT s m sep -> ParserT s m (List a )
113- sepEndBy p sep = sepEndBy1 p sep <|> pure Nil
117+ sepEndBy p sep =
118+ (do a <- p
119+ as <- many $ sep *> p
120+ optional sep
121+ pure (a : as)) <|> pure Nil
114122
115123-- | Parse phrases delimited and optionally terminated by a separator, requiring at least one match.
116- sepEndBy1 :: forall m s a sep . Monad m => ParserT s m a -> ParserT s m sep -> ParserT s m (List a )
124+ sepEndBy1 :: forall m s a sep . Monad m => ParserT s m a -> ParserT s m sep -> ParserT s m (NonEmptyList a )
117125sepEndBy1 p sep = do
118126 a <- p
119- (do _ <- sep
120- as <- sepEndBy p sep
121- pure (a : as)) <|> pure (singleton a)
127+ (do as <- many $ sep *> p
128+ optional sep
129+ pure (cons' a as)) <|> pure (singleton a)
122130
123131-- | Parse phrases delimited and terminated by a separator, requiring at least one match.
124- endBy1 :: forall m s a sep . Monad m => ParserT s m a -> ParserT s m sep -> ParserT s m (List a )
125- endBy1 p sep = some $ p <* sep
132+ endBy1 :: forall m s a sep . Monad m => ParserT s m a -> ParserT s m sep -> ParserT s m (NonEmptyList a )
133+ endBy1 p sep = do
134+ a <- p <* sep
135+ as <- many $ p <* sep
136+ pure (cons' a as)
126137
127138-- | Parse phrases delimited and terminated by a separator.
128139endBy :: forall m s a sep . Monad m => ParserT s m a -> ParserT s m sep -> ParserT s m (List a )
@@ -193,8 +204,9 @@ manyTill p end = scan
193204 pure (x:xs)
194205
195206-- | Parse several phrases until the specified terminator matches, requiring at least one match.
196- many1Till :: forall s a m e . Monad m => ParserT s m a -> ParserT s m e -> ParserT s m (List a )
207+ many1Till :: forall s a m e . Monad m => ParserT s m a -> ParserT s m e -> ParserT s m (NonEmptyList a )
197208many1Till p end = do
198209 x <- p
199210 xs <- manyTill p end
200- pure (x:xs)
211+ pure (cons' x xs)
212+
0 commit comments