module Text.Show.DateTime (parseDateTime) where
import Language.Haskell.Lexer(Token(..), PosToken, lexerPass0)
parseDateTime :: [PosToken] -> [PosToken]
parseDateTime inp =
case date inp of
Just (x@(tok,(p,d)), (y@(Whitespace,(_," ")) : rest)) ->
case time rest of
Just ((_,(_,t)), rest1) -> (tok, (p, d ++ t)) : parseDateTime rest1
Nothing -> x : y : parseDateTime rest
Just (x, rest) -> x : parseDateTime rest
Nothing ->
case time inp of
Just (x, rest) -> x : parseDateTime rest
Nothing ->
case timeDiff inp of
Just (x, rest) -> x : parseDateTime rest
Nothing ->
case inp of
x : xs -> x : parseDateTime xs
[] -> []
where
date ( (IntLit,(p,y)) :
(Varsym,(_,"-")) :
(IntLit,(_,m)) :
(Varsym,(_,"-")) :
(IntLit,(_,d)) : rest
) = Just ((StringLit, (p, y ++ "-" ++ m ++ "-" ++ d)), rest)
date _ = Nothing
time ( (IntLit,(p,h)) :
(Reservedop,(_,":")) :
(IntLit,(_,m)) :
(Reservedop,(_,":")) :
(mbSecs,(_,s)) :
rest
) | mbSecs == IntLit || mbSecs == FloatLit =
Just ((StringLit, (p,h ++ ":" ++ m ++ ":" ++ s ++ tz)), rest1)
where (tz,rest1) = timezone rest
time _ = Nothing
timezone ((Whitespace,(_," ")) : (Conid,(_,c)) : rest) = (" " ++ c, rest)
timezone xs = ("", xs)
timeDiff ((mbLen,(p,h)) : (Varid,(_,"s")) : rest)
| mbLen == IntLit || mbLen == FloatLit =
Just ((StringLit, (p, h ++ "s")), rest)
timeDiff _ = Nothing
test x = mapM_ print $ parseDateTime $ lexerPass0 x