module Rakka.Utils ( yesOrNo , parseYesOrNo , maybeA , defaultTo , deleteIfEmpty , formatW3CDateTime ) where import Control.Arrow import Control.Arrow.ArrowList import System.Time import Text.Printf yesOrNo :: Bool -> String yesOrNo True = "yes" yesOrNo False = "no" parseYesOrNo :: ArrowChoice a => a String Bool parseYesOrNo = proc str -> do case str of "yes" -> returnA -< True "no" -> returnA -< False _ -> returnA -< error ("Expected yes or no: " ++ str) maybeA :: (ArrowList a, ArrowChoice a) => a b c -> a b (Maybe c) maybeA a = listA a >>> proc xs -> case xs of [] -> returnA -< Nothing (x:_) -> returnA -< Just x defaultTo :: ArrowChoice a => b -> a (Maybe b) b defaultTo def = proc m -> case m of Nothing -> returnA -< def Just x -> returnA -< x deleteIfEmpty :: (ArrowList a, ArrowChoice a) => a String String deleteIfEmpty = proc str -> do case str of "" -> none -< () _ -> returnA -< str formatW3CDateTime :: CalendarTime -> String formatW3CDateTime time = formatDateTime time ++ formatTimeZone time where formatDateTime :: CalendarTime -> String formatDateTime time = printf "%04d-%02d-%02dT%02d:%02d:%02d" (ctYear time) (fromEnum (ctMonth time) + 1) (ctDay time) (ctHour time) (ctMin time) (ctSec time) formatTimeZone :: CalendarTime -> String formatTimeZone time = case ctTZ time of offset | offset < 0 -> '-':(showTZ $ negate offset) | offset == 0 -> "Z" | otherwise -> '+':(showTZ offset) showTZ :: Int -> String showTZ offset = let hour = offset `div` 3600 min = (offset - hour * 3600) `div` 60 in show2 hour ++ ":" ++ show2 min show2 :: Int -> String show2 n | n < 10 = '0':(show n) | otherwise = show n