1 -- | W3C Date and Time parser combinator for "Text.Parsec".
2 module Data.Time.W3C.Parser.Parsec
9 import Data.Time.W3C.Types
12 -- | This is a parser combinator for "Text.Parsec".
13 w3cDateTime :: Stream s m Char => ParsecT s u m W3CDateTime
14 w3cDateTime = read4 >>= mdhmst
17 = ( char '-' >> read2 >>= dhmst year )
26 , w3cTimeZone = Nothing
29 = ( char '-' >> read2 >>= hmst year month )
33 , w3cMonth = Just month
38 , w3cTimeZone = Nothing
50 , w3cMonth = Just month
55 , w3cTimeZone = Nothing
57 st year month day hour minute
63 , w3cMonth = Just month
66 , w3cMinute = Just minute
68 , w3cTimeZone = Just t
75 , w3cMonth = Just month
78 , w3cMinute = Just minute
80 , w3cTimeZone = Just t
84 second = do int <- read2
85 frac <- option 0 (char '.' >> liftM parseFrac (many1 digit))
88 timezone = liftM minutesToTimeZone
89 ( ( char 'Z' >> return 0 )
91 do sign <- ( char '+' >> return 1 )
93 ( char '-' >> return (-1) )
97 return (sign * (h * 60 + m))
100 {- 0.152 => 2,5,1 -->
101 * (0 / 10) + 0.2 = 0.2
102 * (0.2 / 10) + 0.5 = 0.52
103 * (0.52 / 10) + 0.1 = 0.152 *done*
105 parseFrac :: RealFrac r => String -> r
106 parseFrac = parseFrac' 0 . reverse . map fromC
109 parseFrac' r (d:ds) = parseFrac' (r / 10 + d / 10) ds
111 read4 :: (Stream s m Char, Num n) => ParsecT s u m n
112 read4 = do n1 <- digit'
116 return (n1 * 1000 + n2 * 100 + n3 * 10 + n4)
118 read2 :: (Stream s m Char, Num n) => ParsecT s u m n
119 read2 = do n1 <- digit'
121 return (n1 * 10 + n2)
123 digit' :: (Stream s m Char, Num n) => ParsecT s u m n
124 digit' = liftM fromC digit
126 fromC :: Num n => Char -> n