12 import Control.Arrow.ArrowList
17 yesOrNo :: Bool -> String
22 parseYesOrNo :: ArrowChoice a => a String Bool
24 = proc str -> do case str of
25 "yes" -> returnA -< True
26 "no" -> returnA -< False
27 _ -> returnA -< error ("Expected yes or no: " ++ str)
30 maybeA :: (ArrowList a, ArrowChoice a) => a b c -> a b (Maybe c)
34 [] -> returnA -< Nothing
35 (x:_) -> returnA -< Just x
38 deleteIfEmpty :: (ArrowList a, ArrowChoice a) => a String String
40 = proc str -> do case str of
45 formatW3CDateTime :: ZonedTime -> String
46 formatW3CDateTime zonedTime
47 = formatLocalTime (zonedTimeToLocalTime zonedTime)
49 formatTimeZone (zonedTimeZone zonedTime)
51 formatLocalTime :: LocalTime -> String
52 formatLocalTime localTime
53 = let (year, month, day) = toGregorian (localDay localTime)
54 timeOfDay = localTimeOfDay localTime
55 (secInt, secFrac) = properFraction (todSec timeOfDay)
57 (printf "%04d-%02d-%02dT%02d:%02d:%02d"
67 else tail (show secFrac))
69 formatTimeZone :: TimeZone -> String
71 = case timeZoneMinutes tz of
72 offset | offset < 0 -> '-':(showTZ $ negate offset)
74 | otherwise -> '+':(showTZ offset)
76 showTZ :: Int -> String
78 = let hour = offset `div` 60
79 minute = offset - hour * 60
81 show2 hour ++ ":" ++ show2 minute
83 show2 :: Int -> String
84 show2 n | n < 10 = '0':(show n)
88 chomp :: String -> String
89 chomp = reverse . snd . break (/= '\n') . reverse