Skip to content

Commit f7aaa52

Browse files
committed
move 'digit' to parser.number
1 parent de07f5a commit f7aaa52

File tree

4 files changed

+40
-53
lines changed

4 files changed

+40
-53
lines changed

src/Data/Formatter/DateTime.purs

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ import Data.String as Str
3232
import Data.Time as T
3333
import Data.Time.Duration as Dur
3434
import Data.Tuple (Tuple(..))
35-
import Data.Formatter.Internal (digit, foldDigits)
35+
import Data.Formatter.Internal (foldDigits)
36+
import Data.Formatter.Parser.Number (parseDigit)
3637

3738
import Text.Parsing.Parser as P
3839
import Text.Parsing.Parser.Combinators as PC
@@ -292,19 +293,19 @@ unformatFParser
292293
P.ParserT String (State UnformatAccum) Unit
293294
unformatFParser cb = case _ of
294295
YearFull a → do
295-
ds ← some digit
296+
ds ← some parseDigit
296297
when (Arr.length ds /= 4) $ P.fail "Incorrect full year"
297298
lift $ modify _{year = Just $ foldDigits ds}
298299
cb a
299300
YearTwoDigits a → do
300-
ds ← some digit
301+
ds ← some parseDigit
301302
when (Arr.length ds /= 2) $ P.fail "Incorrect 2-digit year"
302303
let y = foldDigits ds
303304
lift $ modify _{year = Just $ if y > 69 then y + 1900 else y + 2000}
304305
cb a
305306
YearAbsolute a → do
306307
sign ← PC.optionMaybe $ PC.try $ PS.string "-"
307-
year ← map foldDigits $ some digit
308+
year ← map foldDigits $ some parseDigit
308309
lift $ modify _{year = Just $ (if isJust sign then -1 else 1) * year}
309310
cb a
310311
MonthFull a → do
@@ -316,25 +317,25 @@ unformatFParser cb = case _ of
316317
lift $ modify _{month = Just $ fromEnum month}
317318
cb a
318319
MonthTwoDigits a → do
319-
ds ← some digit
320+
ds ← some parseDigit
320321
let month = foldDigits ds
321322
when (Arr.length ds /= 2 || month > 12 || month < 1) $ P.fail "Incorrect 2-digit month"
322323
lift $ modify _{month = Just month}
323324
cb a
324325
DayOfMonthTwoDigits a → do
325-
ds ← some digit
326+
ds ← some parseDigit
326327
let dom = foldDigits ds
327328
when (Arr.length ds /= 2 || dom > 31 || dom < 1) $ P.fail "Incorrect day of month"
328329
lift $ modify _{day = Just dom}
329330
cb a
330331
DayOfMonth a → do
331-
ds ← some digit
332+
ds ← some parseDigit
332333
let dom = foldDigits ds
333334
when (Arr.length ds > 2 || dom > 31 || dom < 1) $ P.fail "Incorrect day of month"
334335
lift $ modify _{day = Just dom}
335336
cb a
336337
UnixTimestamp a → do
337-
s ← map foldDigits $ some digit
338+
s ← map foldDigits $ some parseDigit
338339
case map toDateTime $ instant $ Dur.Milliseconds $ 1000.0 * Int.toNumber s of
339340
NothingP.fail "Incorrect timestamp"
340341
Just (DT.DateTime d t) → do
@@ -349,17 +350,17 @@ unformatFParser cb = case _ of
349350
}
350351
cb a
351352
DayOfWeek a → do
352-
dow ← digit
353+
dow ← parseDigit
353354
when (dow > 7 || dow < 1) $ P.fail "Incorrect day of week"
354355
cb a
355356
Hours24 a → do
356-
ds ← some digit
357+
ds ← some parseDigit
357358
let hh = foldDigits ds
358359
when (Arr.length ds /= 2 || hh < 0 || hh > 23) $ P.fail "Incorrect 24 hour"
359360
lift $ modify _{hour = Just hh}
360361
cb a
361362
Hours12 a → do
362-
ds ← some digit
363+
ds ← some parseDigit
363364
let hh = foldDigits ds
364365
when (Arr.length ds /= 2 || hh < 0 || hh > 11) $ P.fail "Incorrect 24 hour"
365366
lift $ modify _{hour = Just hh}
@@ -377,19 +378,19 @@ unformatFParser cb = case _ of
377378
lift $ modify f
378379
cb a
379380
Minutes a → do
380-
ds ← some digit
381+
ds ← some parseDigit
381382
let mm = foldDigits ds
382383
when (Arr.length ds /= 2 || mm < 0 || mm > 59) $ P.fail "Incorrect minute"
383384
lift $ modify _{minute = Just mm}
384385
cb a
385386
Seconds a → do
386-
ds ← some digit
387+
ds ← some parseDigit
387388
let ss = foldDigits ds
388389
when (Arr.length ds /= 2 || ss < 0 || ss > 59) $ P.fail "Incorrect second"
389390
lift $ modify _{second = Just ss}
390391
cb a
391392
Milliseconds a → do
392-
ds ← some digit
393+
ds ← some parseDigit
393394
let sss = foldDigits ds
394395
when (Arr.length ds /= 3 || sss < 0 || sss > 999) $ P.fail "Incorrect millisecond"
395396
lift $ modify _{millisecond = Just sss}

src/Data/Formatter/Internal.purs

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -11,37 +11,6 @@ import Text.Parsing.Parser.String as PS
1111
foldDigits f. Foldable f f Int Int
1212
foldDigits = foldl (\acc d → acc * 10 + d) zero
1313

14-
-- TODO move to Parser.Number
15-
digit m. Monad m P.ParserT String m Int
16-
digit = do
17-
char ← PS.oneOf ['0','1','2','3','4','5','6','7','8','9']
18-
case char of
19-
'0' → pure 0
20-
'1' → pure 1
21-
'2' → pure 2
22-
'3' → pure 3
23-
'4' → pure 4
24-
'5' → pure 5
25-
'6' → pure 6
26-
'7' → pure 7
27-
'8' → pure 8
28-
'9' → pure 9
29-
_ → P.fail "Incorrect digit, impossible situation"
30-
31-
-- https://github.com/purescript-contrib/purescript-parsing/issues/50
32-
-- digit ∷ ∀ m. Monad m ⇒ P.ParserT String m Int
33-
-- digit = PS.oneOfAs $
34-
-- [ Tuple '0' 0
35-
-- , Tuple '1' 1
36-
-- , Tuple '2' 2
37-
-- , Tuple '3' 3
38-
-- , Tuple '4' 4
39-
-- , Tuple '5' 5
40-
-- , Tuple '6' 6
41-
-- , Tuple '7' 7
42-
-- , Tuple '8' 8
43-
-- , Tuple '9' 9]
44-
4514
repeat a. Monoid a a Int a
4615
repeat = repeat' mempty
4716
where

src/Data/Formatter/Number.purs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ import Data.Either (Either, either)
2424
import Data.Int as Int
2525
import Data.String as Str
2626

27-
import Data.Formatter.Internal (foldDigits, digit, repeat)
27+
import Data.Formatter.Internal (foldDigits, repeat)
28+
import Data.Formatter.Parser.Number (parseDigit)
2829

2930
import Math as Math
3031

@@ -149,13 +150,13 @@ unformatParser f = do
149150
digitsWithCommas =
150151
if not f.comma
151152
then do
152-
some digit <* PS.string "."
153+
some parseDigit <* PS.string "."
153154
else
154155
digitsWithCommas' [ ]
155156

156157
digitsWithCommas' Array Int P.Parser String (Array Int)
157158
digitsWithCommas' accum = do
158-
ds ← some digit
159+
ds ← some parseDigit
159160

160161
when (Arr.null accum && Arr.length ds > 3)
161162
$ P.fail "Wrong number of digits between thousand separators"
@@ -174,7 +175,7 @@ unformatParser f = do
174175
then P.fail "Error: too few digits before dot"
175176
else pure $ Int.toNumber $ foldDigits beforeDigits
176177

177-
afterDigits ← some digit
178+
afterDigits ← some parseDigit
178179
after ←
179180
if Arr.length afterDigits < f.after
180181
then P.fail "Error: too few digits after dot"
@@ -191,7 +192,7 @@ unformatParser f = do
191192
Nothing
192193
pure 0
193194
Just _ →
194-
map foldDigits $ many digit
195+
map foldDigits $ many parseDigit
195196
Just 'K' → pure 3
196197
Just 'M' → pure 6
197198
Just 'G' → pure 9

src/Data/Formatter/Parser/Number.purs

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@ module Data.Formatter.Parser.Number
22
( parseInteger
33
, parseMaybeInteger
44
, parseNumber
5+
, parseDigit
56
) where
67

78
import Prelude
89

910
import Data.Int (toNumber, floor)
1011
import Data.Array (some, many, length)
11-
import Data.Formatter.Internal (digit, foldDigits)
12+
import Data.Formatter.Internal (parseDigit, foldDigits)
1213
import Data.Function (on)
1314
import Text.Parsing.Parser as P
1415
import Text.Parsing.Parser.Combinators as PC
@@ -18,10 +19,10 @@ import Math as Math
1819

1920

2021
parseInteger P.Parser String Int
21-
parseInteger = some digit <#> foldDigits
22+
parseInteger = some parseDigit <#> foldDigits
2223

2324
parseMaybeInteger P.Parser String (Maybe Int)
24-
parseMaybeInteger = many digit <#> (\l -> if length l == 0 then Nothing else Just $ foldDigits l)
25+
parseMaybeInteger = many parseDigit <#> (\l -> if length l == 0 then Nothing else Just $ foldDigits l)
2526

2627
parseFractional P.Parser String Number
2728
parseFractional = parseInteger <#> case _ of
@@ -42,3 +43,18 @@ numOfDigits n = 1 + (floor $ log10 $ toNumber n)
4243

4344
log10 Number Number
4445
log10 n = Math.log10e * Math.log n
46+
47+
parseDigit = PS.char `oneOfAs`
48+
[ Tuple '0' 0
49+
, Tuple '1' 1
50+
, Tuple '2' 2
51+
, Tuple '3' 3
52+
, Tuple '4' 4
53+
, Tuple '5' 5
54+
, Tuple '6' 6
55+
, Tuple '7' 7
56+
, Tuple '8' 8
57+
, Tuple '9' 9]
58+
where
59+
-- TODO remove after https://github.com/purescript-contrib/purescript-parsing/pull/51
60+
oneOfAs p xs = choice $ (\(Tuple s r) -> try $ p s $> r) <$> xs

0 commit comments

Comments
 (0)