7
7
-- |
8
8
-- | ```purescript
9
9
-- | Text.Parsec.many = Data.(Array|List).many
10
- -- | Text.Parsec.many1 = Data.(Array|List).some
11
10
-- | Text.Parsec.(<|>) = Control.Alt.alt (<|>)
12
11
-- | ```
13
12
-- |
24
23
module Text.Parsing.Parser.Combinators where
25
24
26
25
import Prelude
26
+
27
27
import Control.Monad.Except (runExceptT , ExceptT (..))
28
28
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 )
33
- import Data.List.NonEmpty (NonEmptyList , cons' , singleton )
32
+ import Data.List (List (..), many , (:))
33
+ import Data.List.NonEmpty (NonEmptyList )
34
+ import Data.List.NonEmpty as NEL
34
35
import Data.Maybe (Maybe (..))
35
36
import Data.Newtype (unwrap )
36
37
import Data.Tuple (Tuple (..))
@@ -92,6 +93,10 @@ lookAhead p = (ParserT <<< ExceptT <<< StateT) \s -> do
92
93
Tuple e _ <- runStateT (runExceptT (unwrap p)) s
93
94
pure (Tuple e s)
94
95
96
+ -- | Match one or more times.
97
+ many1 :: forall m s a . Monad m => ParserT s m a -> ParserT s m (NonEmptyList a )
98
+ many1 p = NEL .cons' <$> p <*> many p
99
+
95
100
-- | Parse phrases delimited by a separator.
96
101
-- |
97
102
-- | For example:
@@ -100,40 +105,30 @@ lookAhead p = (ParserT <<< ExceptT <<< StateT) \s -> do
100
105
-- | digit `sepBy` string ","
101
106
-- | ```
102
107
sepBy :: forall m s a sep . Monad m => ParserT s m a -> ParserT s m sep -> ParserT s m (List a )
103
- sepBy p sep =
104
- (do a <- p
105
- as <- many $ sep *> p
106
- pure (a : as)) <|> pure Nil
108
+ sepBy p sep = map NEL .toList (sepBy1 p sep) <|> pure Nil
107
109
108
110
-- | Parse phrases delimited by a separator, requiring at least one match.
109
111
sepBy1 :: forall m s a sep . Monad m => ParserT s m a -> ParserT s m sep -> ParserT s m (NonEmptyList a )
110
112
sepBy1 p sep = do
111
113
a <- p
112
114
as <- many $ sep *> p
113
- pure (cons' a as)
115
+ pure (NEL . cons' a as)
114
116
115
117
-- | Parse phrases delimited and optionally terminated by a separator.
116
118
sepEndBy :: forall m s a sep . Monad m => ParserT s m a -> ParserT s m sep -> ParserT s m (List a )
117
- sepEndBy p sep =
118
- (do a <- p
119
- as <- many $ sep *> p
120
- optional sep
121
- pure (a : as)) <|> pure Nil
119
+ sepEndBy p sep = map NEL .toList (sepEndBy1 p sep) <|> pure Nil
122
120
123
121
-- | Parse phrases delimited and optionally terminated by a separator, requiring at least one match.
124
122
sepEndBy1 :: forall m s a sep . Monad m => ParserT s m a -> ParserT s m sep -> ParserT s m (NonEmptyList a )
125
123
sepEndBy1 p sep = do
126
124
a <- p
127
- (do as <- many $ sep *> p
128
- optional sep
129
- pure (cons' a as)) <|> pure (singleton a)
125
+ (do _ <- sep
126
+ as <- sepEndBy p sep
127
+ pure (NEL . cons' a as)) <|> pure (NEL . singleton a)
130
128
131
129
-- | Parse phrases delimited and terminated by a separator, requiring at least one match.
132
130
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)
131
+ endBy1 p sep = many1 $ p <* sep
137
132
138
133
-- | Parse phrases delimited and terminated by a separator.
139
134
endBy :: forall m s a sep . Monad m => ParserT s m a -> ParserT s m sep -> ParserT s m (List a )
@@ -201,12 +196,11 @@ manyTill p end = scan
201
196
scan = (end $> Nil )
202
197
<|> do x <- p
203
198
xs <- scan
204
- pure (x: xs)
199
+ pure (x : xs)
205
200
206
201
-- | Parse several phrases until the specified terminator matches, requiring at least one match.
207
202
many1Till :: forall s a m e . Monad m => ParserT s m a -> ParserT s m e -> ParserT s m (NonEmptyList a )
208
203
many1Till p end = do
209
204
x <- p
210
205
xs <- manyTill p end
211
- pure (cons' x xs)
212
-
206
+ pure (NEL .cons' x xs)
0 commit comments