packages feed

parsedate-2006.6.4: examples/Parsec.hs

import System.Locale
import System.Time
import System.Time.Parse
import Text.ParserCombinators.Parsec

iso8601DateTimeFormat :: String
iso8601DateTimeFormat = "%Y-%m-%d %H:%M:%S"

parseISO8601DateTime :: Parser CalendarTime
parseISO8601DateTime = 
    parsecCalendarTime defaultTimeLocale iso8601DateTimeFormat

showISO8601DateTime :: CalendarTime -> String
showISO8601DateTime = 
    formatCalendarTime defaultTimeLocale iso8601DateTimeFormat

parseEmptyDate :: Parser CalendarTime
parseEmptyDate = parsecCalendarTime defaultTimeLocale ""

timeNow :: IO CalendarTime
timeNow = getClockTime >>= toCalendarTime

p :: Parser a -> String -> IO a
p parser s = case parse parser s s of
               Left err -> fail $ show err
               Right x  -> return x

test :: Parser CalendarTime -> String -> IO ()
test parser s = do t <- p parser s
                   putStrLn (s ++ " => " ++ showISO8601DateTime t)

main = do t <- timeNow
          let s = showISO8601DateTime t
          test parseISO8601DateTime s
          test parseEmptyDate ""
          test (string "date: " >> parseEmptyDate) ("date: ")
          test (string "date: " >> parseISO8601DateTime) ("date: " ++ s)