content: module System.Cron.Internal.Describe.Descriptors where
  
  import System.Cron.Internal.Describe.Time
  import System.Cron.Internal.Describe.Types
  
  minuteDescriptor :: Descriptor
  minuteDescriptor = Descriptor {
      pluralDesc = "minutes"
    , singularDesc = "minute"
    , rangePrefix = "minutes"
    , rangeSuffix = "past the hour"
    , rangeJoiner = "through"
    , displayItem = show
    , specificPrefix = "at"
    , specificSuffix = "minutes past the hour"
    , stepSpecificSuffix = sss
    , listPrefix = "at"
    , listSuffix = Nothing
    }
    where
      sss n
        | n == 0    = Nothing
        | otherwise = Just $ "starting at " ++ show n ++ " minutes past the hour"
  
  
  hourDescriptor :: TimeFormat -> Descriptor
  hourDescriptor tf = Descriptor {
      pluralDesc = "hours"
    , singularDesc = "hour"
    , rangePrefix = "between"
    , rangeSuffix = ""
    , rangeJoiner = "and"
    , displayItem = toHour
    , specificPrefix = "at"
    , specificSuffix = ""
    , stepSpecificSuffix = sss
    , listPrefix = "at"
    , listSuffix = Nothing
    }
    where toHour h = format tf (Minute 0) (Hour h)
          sss n
            | n == 0    = Nothing
            | otherwise = Just $ "starting at " ++ toHour n
  
  
  domDescriptor :: Descriptor
  domDescriptor = Descriptor {
      pluralDesc = "days"
    , singularDesc = "day"
    , rangePrefix = "between days"
    , rangeSuffix = "of the month"
    , rangeJoiner = "and"
    , displayItem = show
    , specificPrefix = "on day"
    , specificSuffix = "of the month"
    , stepSpecificSuffix = sss
    , listPrefix = "on days"
    , listSuffix = Just "of the month"
    }
    where sss n = Just $ "starting on day " ++ show n ++ " of the month"
  
  
  monthDescriptor :: Descriptor
  monthDescriptor = Descriptor {
      pluralDesc = "months"
    , singularDesc = "month"
    , rangePrefix = ""
    , rangeSuffix = ""
    , rangeJoiner = "through"
    , displayItem = toMonth
    , specificPrefix = "only in"
    , specificSuffix = ""
    , stepSpecificSuffix = sss
    , listPrefix = "only in"
    , listSuffix = Nothing
    }
    where toMonth = show . safeIntToMonth
          sss n
            | n == 1    = Nothing
            | otherwise = Just $ toMonth n ++ " through " ++ toMonth 12
  
  
  dowDescriptor :: Descriptor
  dowDescriptor = Descriptor {
      pluralDesc = "days of the week"
    , singularDesc = "day of the week"
    , rangePrefix = ""
    , rangeSuffix = ""
    , rangeJoiner = "through"
    , displayItem = toWeekday
    , specificPrefix = "only on"
    , specificSuffix = ""
    , stepSpecificSuffix = sss
    , listPrefix = "only on"
    , listSuffix = Nothing
    }
    where toWeekday = show . safeIntToWeekDay
          sss n = Just $ toWeekday n ++ " through " ++ show Saturday
  