{-# LANGUAGE FlexibleContexts #-}
module Data.Time.Asctime.Parsec
    ( asctime
    )
    where

import Control.Monad
import Data.Fixed
import Data.Time
import Data.Time.Calendar.WeekDate
import Data.Time.HTTP.Common
import Text.Parsec

-- |This is a parsec parser for ANSI C's asctime() format.
asctime :: Stream s m Char => ParsecT s u m LocalTime
asctime = do weekDay <- shortWeekDayNameP
             _       <- string ", "
             month   <- shortMonthNameP
             _       <- char ' '
             day     <- read2
             _       <- char ' '
             hour    <- read2
             _       <- char ':'
             minute  <- read2
             _       <- char ':'
             second  <- read2
             _       <- char ' '
             year    <- read4

             gregDay <- assertGregorianDateIsGood year month day
             _       <- assertWeekDayIsGood weekDay gregDay
             tod     <- assertTimeOfDayIsGood hour minute second

             return (LocalTime gregDay tod)