content: module System.Cron.Internal.Describe.Utils
  (
    viewHour
  , viewMinute
  , viewMinuteRange
  , viewHourList
  , allWords
  , cap
  , joinWords
  ) where
  
  import           Data.Char               (toUpper)
  import           Data.List.NonEmpty      (NonEmpty)
  import           System.Cron.Types
  import           System.Cron.Internal.Describe.Time
  
  viewHour :: HourSpec -> Maybe Hour
  viewHour = viewSpecificTime Hour . hourSpec
  
  
  viewMinute :: MinuteSpec -> Maybe Minute
  viewMinute = viewSpecificTime Minute . minuteSpec
  
  
  viewMinuteRange :: MinuteSpec -> Maybe (Minute, Minute)
  viewMinuteRange = viewRange . minuteSpec
    where viewRange (Field (RangeField' rf)) = Just (Minute $ rfBegin rf,
                                                     Minute $ rfEnd rf)
          viewRange _                        = Nothing
  
  
  viewHourList :: HourSpec -> Maybe (NonEmpty BaseField)
  viewHourList = viewList . hourSpec
    where viewList (ListField ne) = Just ne
          viewList _              = Nothing
  
  
  viewSpecificTime :: (Int -> a) -> CronField -> Maybe a
  viewSpecificTime f (Field (SpecificField' s)) = Just . f $ specificField s
  viewSpecificTime _ _                          = Nothing
  
  
  allWords :: [String] -> String
  allWords = unwords . filter (not . null)
  
  
  cap :: String -> String
  cap []     = []
  cap (x:xs) = toUpper x : xs
  
  
  joinWords :: [String] -> String
  joinWords [] = []
  joinWords [x] = x
  joinWords [x, y] = x ++ " and " ++ y
  joinWords (x:xs) = x ++ ", " ++ joinWords xs
  