@@ -29,7 +29,8 @@ import Control.Monad.State (StateT(..), runStateT)
29
29
import Control.Plus (empty , (<|>))
30
30
import Data.Either (Either (..))
31
31
import 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 )
33
34
import Data.Maybe (Maybe (..))
34
35
import Data.Newtype (unwrap )
35
36
import Data.Tuple (Tuple (..))
@@ -99,30 +100,40 @@ lookAhead p = (ParserT <<< ExceptT <<< StateT) \s -> do
99
100
-- | digit `sepBy` string ","
100
101
-- | ```
101
102
sepBy :: 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
103
107
104
108
-- | 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 )
106
110
sepBy1 p sep = do
107
111
a <- p
108
112
as <- many $ sep *> p
109
- pure (a : as)
113
+ pure (cons' a as)
110
114
111
115
-- | Parse phrases delimited and optionally terminated by a separator.
112
116
sepEndBy :: 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
114
122
115
123
-- | 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 )
117
125
sepEndBy1 p sep = do
118
126
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)
122
130
123
131
-- | 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)
126
137
127
138
-- | Parse phrases delimited and terminated by a separator.
128
139
endBy :: 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
193
204
pure (x:xs)
194
205
195
206
-- | 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 )
197
208
many1Till p end = do
198
209
x <- p
199
210
xs <- manyTill p end
200
- pure (x:xs)
211
+ pure (cons' x xs)
212
+
0 commit comments