Skip to content

Commit 79b9078

Browse files
committed
Move from Parsing.String to Parsing.String.Basic.
* `whiteSpace` * `skipSpaces` * `oneOf` * `oneOfCodePoints` * `noneOf` * `noneOfCodePoints`
1 parent 059a959 commit 79b9078

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
@@ -28,6 +28,14 @@ Breaking changes:
2828
- Rename module prefix from `Text.Parsing.Parser` to `Parsing` (#169 by @jamesdbrock)
2929
- Replace the `regex` parser. (#170 by @jamesdbrock)
3030
- Reorganize Combinators for #154 (#182 by @jamesdbrock)
31+
- Move the parsers
32+
* `whiteSpace`
33+
* `skipSpaces`
34+
* `oneOf`
35+
* `oneOfCodePoints`
36+
* `noneOf`
37+
* `noneOfCodePoints`
38+
from `Parsing.String` to `Parsing.String.Basic`. (#183 by @jamesdbrock)
3139

3240
New features:
3341

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
@@ -20,21 +20,15 @@
2020
-- | can parse the full Unicode character set. All of the primitive parsers
2121
-- | in this module can be used together.
2222
module Parsing.String
23-
( string
24-
, eof
25-
, rest
23+
( char
24+
, string
2625
, anyChar
2726
, anyCodePoint
2827
, satisfy
2928
, satisfyCodePoint
30-
, char
3129
, takeN
32-
, whiteSpace
33-
, skipSpaces
34-
, oneOf
35-
, oneOfCodePoints
36-
, noneOf
37-
, noneOfCodePoints
30+
, rest
31+
, eof
3832
, match
3933
, regex
4034
, consumeWith
@@ -43,22 +37,20 @@ module Parsing.String
4337
import Prelude hiding (between)
4438

4539
import Control.Monad.State (get)
46-
import Data.Array (elem, notElem)
4740
import Data.Array.NonEmpty as NonEmptyArray
48-
import Data.CodePoint.Unicode (isSpace)
4941
import Data.Either (Either(..))
5042
import Data.Enum (fromEnum, toEnum)
5143
import Data.Function.Uncurried (mkFn5, runFn2)
5244
import Data.Maybe (Maybe(..), fromJust)
53-
import Data.String (CodePoint, Pattern(..), codePointAt, length, null, singleton, splitAt, stripPrefix, takeWhile, uncons)
45+
import Data.String (CodePoint, Pattern(..), codePointAt, length, null, splitAt, stripPrefix, uncons)
5446
import Data.String as String
5547
import Data.String.CodeUnits as SCU
5648
import Data.String.Regex as Regex
5749
import Data.String.Regex.Flags (RegexFlags)
58-
import Data.Tuple (Tuple(..), fst)
50+
import Data.Tuple (Tuple(..))
5951
import Partial.Unsafe (unsafePartial)
6052
import Parsing (ParseError(..), ParseState(..), ParserT(..))
61-
import Parsing.Combinators ((<?>), (<~?>))
53+
import Parsing.Combinators ((<?>))
6254
import Parsing.Pos (Position(..))
6355

6456
-- | Match “end-of-file,” the end of the input stream.
@@ -145,34 +137,6 @@ takeN n = consumeWith \input -> do
145137
else
146138
Left $ "Could not take " <> show n <> " characters"
147139

148-
-- | Match zero or more whitespace characters satisfying
149-
-- | `Data.CodePoint.Unicode.isSpace`. Always succeeds.
150-
whiteSpace :: forall m. ParserT String m String
151-
whiteSpace = fst <$> match skipSpaces
152-
153-
-- | Skip whitespace characters and throw them away. Always succeeds.
154-
skipSpaces :: forall m. ParserT String m Unit
155-
skipSpaces = consumeWith \input -> do
156-
let consumed = takeWhile isSpace input
157-
let remainder = SCU.drop (SCU.length consumed) input
158-
Right { value: unit, consumed, remainder }
159-
160-
-- | Match one of the BMP `Char`s in the array.
161-
oneOf :: forall m. Array Char -> ParserT String m Char
162-
oneOf ss = satisfy (flip elem ss) <~?> \_ -> "one of " <> show ss
163-
164-
-- | Match any BMP `Char` not in the array.
165-
noneOf :: forall m. Array Char -> ParserT String m Char
166-
noneOf ss = satisfy (flip notElem ss) <~?> \_ -> "none of " <> show ss
167-
168-
-- | Match one of the Unicode characters in the array.
169-
oneOfCodePoints :: forall m. Array CodePoint -> ParserT String m CodePoint
170-
oneOfCodePoints ss = satisfyCodePoint (flip elem ss) <~?> \_ -> "one of " <> show (singleton <$> ss)
171-
172-
-- | Match any Unicode character not in the array.
173-
noneOfCodePoints :: forall m. Array CodePoint -> ParserT String m CodePoint
174-
noneOfCodePoints ss = satisfyCodePoint (flip notElem ss) <~?> \_ -> "none of " <> show (singleton <$> ss)
175-
176140
-- | Updates a `Position` by adding the columns and lines in `String`.
177141
updatePosString :: Position -> String -> String -> Position
178142
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)