Skip to content

Commit 5ca6da9

Browse files
committed
Move from Parsing.String to Parsing.String.Basic
* `whiteSpace` * `skipSpaces` * `oneOf` * `oneOfCodePoints` * `noneOf` * `noneOfCodePoints`
1 parent 9b7beeb commit 5ca6da9

File tree

8 files changed

+70
-60
lines changed

8 files changed

+70
-60
lines changed

CHANGELOG.md

+8
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,14 @@ Breaking changes:
2929
- Replace the `regex` parser. (#170 by @jamesdbrock)
3030
- Reorganize Combinators for #154 (#182 by @jamesdbrock)
3131
- Add the `index` field to `Position`. (#171 by @jamesdbrock)
32+
- Move the parsers
33+
* `whiteSpace`
34+
* `skipSpaces`
35+
* `oneOf`
36+
* `oneOfCodePoints`
37+
* `noneOf`
38+
* `noneOfCodePoints`
39+
from `Parsing.String` to `Parsing.String.Basic`. (#183 by @jamesdbrock)
3240

3341
New features:
3442

bench/Json/Parsing.purs

+2-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ import Data.String.Regex.Flags (noFlags)
1212
import Data.Tuple (Tuple(..))
1313
import Parsing (ParserT, fail)
1414
import Parsing.Combinators (between, choice, sepBy, try)
15-
import Parsing.String (regex, skipSpaces, string)
15+
import Parsing.String (regex, string)
16+
import Parsing.String.Basic (skipSpaces)
1617
import Partial.Unsafe (unsafeCrashWith)
1718

1819
json :: forall m. Monad m => ParserT String m Json

src/Parsing/Indent.purs

+2-1
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,8 @@ import Data.Maybe (Maybe(..))
6969
import Parsing (ParserT, fail, position)
7070
import Parsing.Combinators (option, optionMaybe)
7171
import Parsing.Pos (Position(..), initialPos)
72-
import Parsing.String (oneOf, string)
72+
import Parsing.String (string)
73+
import Parsing.String.Basic (oneOf)
7374

7475
-- | Indentation sensitive parser type. Usually @ m @ will
7576
-- | be @ Identity @ as with any @ ParserT @

src/Parsing/Language.purs

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ import Prelude
1313

1414
import Control.Alt ((<|>))
1515
import Parsing (ParserT)
16-
import Parsing.String (char, oneOf)
17-
import Parsing.String.Basic (alphaNum, letter)
16+
import Parsing.String (char)
17+
import Parsing.String.Basic (alphaNum, letter, oneOf)
1818
import Parsing.Token (GenLanguageDef(..), LanguageDef, TokenParser, makeTokenParser, unGenLanguageDef)
1919

2020
-----------------------------------------------------------

src/Parsing/String.purs

+7-43
Original file line numberDiff line numberDiff line change
@@ -34,21 +34,15 @@
3434
-- | - carriage-return (`0x0D`)
3535
-- | - carriage-return-newline (`0x0D 0x0A`)
3636
module Parsing.String
37-
( string
38-
, eof
39-
, rest
37+
( char
38+
, string
4039
, anyChar
4140
, anyCodePoint
4241
, satisfy
4342
, satisfyCodePoint
44-
, char
4543
, takeN
46-
, whiteSpace
47-
, skipSpaces
48-
, oneOf
49-
, oneOfCodePoints
50-
, noneOf
51-
, noneOfCodePoints
44+
, rest
45+
, eof
5246
, match
5347
, regex
5448
, consumeWith
@@ -57,22 +51,20 @@ module Parsing.String
5751
import Prelude hiding (between)
5852

5953
import Control.Monad.State (get)
60-
import Data.Array (elem, notElem)
6154
import Data.Array.NonEmpty as NonEmptyArray
62-
import Data.CodePoint.Unicode (isSpace)
6355
import Data.Either (Either(..))
6456
import Data.Enum (fromEnum, toEnum)
6557
import Data.Function.Uncurried (mkFn5, runFn2)
6658
import Data.Maybe (Maybe(..), fromJust)
67-
import Data.String (CodePoint, Pattern(..), codePointAt, length, null, singleton, splitAt, stripPrefix, takeWhile, uncons)
59+
import Data.String (CodePoint, Pattern(..), codePointAt, length, null, splitAt, stripPrefix, uncons)
6860
import Data.String as String
6961
import Data.String.CodeUnits as SCU
7062
import Data.String.Regex as Regex
7163
import Data.String.Regex.Flags (RegexFlags)
72-
import Data.Tuple (Tuple(..), fst)
64+
import Data.Tuple (Tuple(..))
7365
import Partial.Unsafe (unsafePartial)
7466
import Parsing (ParseError(..), ParseState(..), ParserT(..))
75-
import Parsing.Combinators ((<?>), (<~?>))
67+
import Parsing.Combinators ((<?>))
7668
import Parsing.Pos (Position(..))
7769

7870
-- | Match “end-of-file,” the end of the input stream.
@@ -159,34 +151,6 @@ takeN n = consumeWith \input -> do
159151
else
160152
Left $ "Could not take " <> show n <> " characters"
161153

162-
-- | Match zero or more whitespace characters satisfying
163-
-- | `Data.CodePoint.Unicode.isSpace`. Always succeeds.
164-
whiteSpace :: forall m. ParserT String m String
165-
whiteSpace = fst <$> match skipSpaces
166-
167-
-- | Skip whitespace characters and throw them away. Always succeeds.
168-
skipSpaces :: forall m. ParserT String m Unit
169-
skipSpaces = consumeWith \input -> do
170-
let consumed = takeWhile isSpace input
171-
let remainder = SCU.drop (SCU.length consumed) input
172-
Right { value: unit, consumed, remainder }
173-
174-
-- | Match one of the BMP `Char`s in the array.
175-
oneOf :: forall m. Array Char -> ParserT String m Char
176-
oneOf ss = satisfy (flip elem ss) <~?> \_ -> "one of " <> show ss
177-
178-
-- | Match any BMP `Char` not in the array.
179-
noneOf :: forall m. Array Char -> ParserT String m Char
180-
noneOf ss = satisfy (flip notElem ss) <~?> \_ -> "none of " <> show ss
181-
182-
-- | Match one of the Unicode characters in the array.
183-
oneOfCodePoints :: forall m. Array CodePoint -> ParserT String m CodePoint
184-
oneOfCodePoints ss = satisfyCodePoint (flip elem ss) <~?> \_ -> "one of " <> show (singleton <$> ss)
185-
186-
-- | Match any Unicode character not in the array.
187-
noneOfCodePoints :: forall m. Array CodePoint -> ParserT String m CodePoint
188-
noneOfCodePoints ss = satisfyCodePoint (flip notElem ss) <~?> \_ -> "none of " <> show (singleton <$> ss)
189-
190154
-- | Updates a `Position` by adding the columns and lines in `String`.
191155
updatePosString :: Position -> String -> String -> Position
192156
updatePosString pos before after = case uncons before of

src/Parsing/String/Basic.purs

+45-9
Original file line numberDiff line numberDiff line change
@@ -15,22 +15,30 @@ module Parsing.String.Basic
1515
, alphaNum
1616
, intDecimal
1717
, number
18-
, module Parsing.String
18+
, whiteSpace
19+
, skipSpaces
20+
, oneOf
21+
, oneOfCodePoints
22+
, noneOf
23+
, noneOfCodePoints
1924
) where
2025

2126
import Prelude
2227

28+
import Data.Array (elem, notElem)
2329
import Data.CodePoint.Unicode (isAlpha, isAlphaNum, isDecDigit, isHexDigit, isLower, isOctDigit, isSpace, isUpper)
30+
import Data.Either (Either(..))
2431
import Data.Int as Data.Int
2532
import Data.Maybe (Maybe(..))
2633
import Data.Number (infinity, nan)
2734
import Data.Number as Data.Number
28-
import Data.String (CodePoint)
35+
import Data.String (CodePoint, singleton, takeWhile)
2936
import Data.String.CodePoints (codePointFromChar)
30-
import Data.Tuple (Tuple(..))
37+
import Data.String.CodeUnits as SCU
38+
import Data.Tuple (Tuple(..), fst)
3139
import Parsing (ParserT, fail)
32-
import Parsing.Combinators (choice, skipMany, (<?>))
33-
import Parsing.String (noneOf, noneOfCodePoints, oneOf, oneOfCodePoints, skipSpaces, whiteSpace)
40+
import Parsing.Combinators (choice, skipMany, (<?>), (<~?>))
41+
import Parsing.String (consumeWith, match, satisfy, satisfyCodePoint)
3442
import Parsing.String as Parser.String
3543

3644
-- | Parse a digit. Matches any char that satisfies `Data.CodePoint.Unicode.isDecDigit`.
@@ -94,8 +102,8 @@ number =
94102
, Parser.String.string "NaN" *> pure nan
95103
, do
96104
Tuple section _ <- Parser.String.match do
97-
_ <- Parser.String.oneOf [ '+', '-', '.', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' ]
98-
skipMany $ Parser.String.oneOf [ 'e', 'E', '+', '-', '.', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' ]
105+
_ <- oneOf [ '+', '-', '.', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' ]
106+
skipMany $ oneOf [ 'e', 'E', '+', '-', '.', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' ]
99107
-- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseFloat
100108
case Data.Number.fromString section of
101109
Nothing -> fail $ "Could not parse Number " <> section
@@ -113,12 +121,40 @@ number =
113121
intDecimal :: forall m. ParserT String m Int
114122
intDecimal = do
115123
Tuple section _ <- Parser.String.match do
116-
_ <- Parser.String.oneOf [ '+', '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' ]
117-
skipMany $ Parser.String.oneOf [ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' ]
124+
_ <- oneOf [ '+', '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' ]
125+
skipMany $ oneOf [ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' ]
118126
case Data.Int.fromString section of
119127
Nothing -> fail $ "Could not parse Int " <> section
120128
Just x -> pure x
121129

122130
-- | Helper function
123131
satisfyCP :: forall m. (CodePoint -> Boolean) -> ParserT String m Char
124132
satisfyCP p = Parser.String.satisfy (p <<< codePointFromChar)
133+
134+
-- | Match zero or more whitespace characters satisfying
135+
-- | `Data.CodePoint.Unicode.isSpace`. Always succeeds.
136+
whiteSpace :: forall m. ParserT String m String
137+
whiteSpace = fst <$> match skipSpaces
138+
139+
-- | Skip whitespace characters and throw them away. Always succeeds.
140+
skipSpaces :: forall m. ParserT String m Unit
141+
skipSpaces = consumeWith \input -> do
142+
let consumed = takeWhile isSpace input
143+
let remainder = SCU.drop (SCU.length consumed) input
144+
Right { value: unit, consumed, remainder }
145+
146+
-- | Match one of the BMP `Char`s in the array.
147+
oneOf :: forall m. Array Char -> ParserT String m Char
148+
oneOf ss = satisfy (flip elem ss) <~?> \_ -> "one of " <> show ss
149+
150+
-- | Match any BMP `Char` not in the array.
151+
noneOf :: forall m. Array Char -> ParserT String m Char
152+
noneOf ss = satisfy (flip notElem ss) <~?> \_ -> "none of " <> show ss
153+
154+
-- | Match one of the Unicode characters in the array.
155+
oneOfCodePoints :: forall m. Array CodePoint -> ParserT String m CodePoint
156+
oneOfCodePoints ss = satisfyCodePoint (flip elem ss) <~?> \_ -> "one of " <> show (singleton <$> ss)
157+
158+
-- | Match any Unicode character not in the array.
159+
noneOfCodePoints :: forall m. Array CodePoint -> ParserT String m CodePoint
160+
noneOfCodePoints ss = satisfyCodePoint (flip notElem ss) <~?> \_ -> "none of " <> show (singleton <$> ss)

src/Parsing/Token.purs

+2-2
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,9 @@ import Data.Tuple (Tuple(..))
4646
import Parsing (ParseState(..), ParserT, consume, fail)
4747
import Parsing.Combinators (between, choice, notFollowedBy, option, sepBy, sepBy1, skipMany, skipMany1, try, tryRethrow, (<?>), (<??>))
4848
import Parsing.Pos (Position)
49-
import Parsing.String (char, noneOf, oneOf, satisfy, satisfyCodePoint, string)
49+
import Parsing.String (char, satisfy, satisfyCodePoint, string)
50+
import Parsing.String.Basic (alphaNum, digit, hexDigit, letter, noneOf, octDigit, oneOf, space, upper)
5051
import Parsing.String.Basic as Basic
51-
import Parsing.String.Basic (digit, hexDigit, octDigit, upper, space, letter, alphaNum)
5252

5353
-- | A parser which returns the first token in the stream.
5454
token :: forall m a. (a -> Position) -> ParserT (List a) m a

test/Main.purs

+2-2
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ import Parsing.Combinators (between, chainl, chainl1, chainr, chainr1, choice, e
3030
import Parsing.Expr (Assoc(..), Operator(..), buildExprParser)
3131
import Parsing.Language (haskellDef, haskellStyle, javaStyle)
3232
import Parsing.Pos (Position(..), initialPos)
33-
import Parsing.String (anyChar, anyCodePoint, char, eof, regex, noneOfCodePoints, oneOfCodePoints, rest, satisfy, string, takeN, whiteSpace)
34-
import Parsing.String.Basic (intDecimal, number, letter)
33+
import Parsing.String (anyChar, anyCodePoint, char, eof, regex, rest, satisfy, string, takeN)
34+
import Parsing.String.Basic (intDecimal, number, letter, noneOfCodePoints, oneOfCodePoints, whiteSpace)
3535
import Parsing.Token (TokenParser, makeTokenParser, match, token, when)
3636
import Parsing.Token as Parser.Token
3737
import Partial.Unsafe (unsafePartial)

0 commit comments

Comments
 (0)