module Data.Time.Calendar.Private where import Data.Fixed data PadOption = Pad Int Char | NoPad showPadded :: PadOption -> String -> String showPadded NoPad s = s showPadded (Pad i c) s = replicate (i - length s) c ++ s class (Num t, Ord t, Show t) => ShowPadded t where showPaddedNum :: PadOption -> t -> String instance ShowPadded Integer where showPaddedNum NoPad i = show i showPaddedNum pad i | i < 0 = '-' : (showPaddedNum pad (negate i)) showPaddedNum pad i = showPadded pad $ show i instance ShowPadded Int where showPaddedNum NoPad i = show i showPaddedNum _pad i | i == minBound = show i showPaddedNum pad i | i < 0 = '-' : (showPaddedNum pad (negate i)) showPaddedNum pad i = showPadded pad $ show i show2Fixed :: Pico -> String show2Fixed x | x < 10 = '0' : (showFixed True x) show2Fixed x = showFixed True x show2 :: (ShowPadded t) => t -> String show2 = showPaddedNum $ Pad 2 '0' show3 :: (ShowPadded t) => t -> String show3 = showPaddedNum $ Pad 3 '0' show4 :: (ShowPadded t) => t -> String show4 = showPaddedNum $ Pad 4 '0' mod100 :: (Integral i) => i -> i mod100 x = mod x 100 div100 :: (Integral i) => i -> i div100 x = div x 100 clip :: (Ord t) => t -> t -> t -> t clip a _ x | x < a = a clip _ b x | x > b = b clip _ _ x = x clipValid :: (Ord t) => t -> t -> t -> Maybe t clipValid a _ x | x < a = Nothing clipValid _ b x | x > b = Nothing clipValid _ _ x = Just x quotBy :: (Real a, Integral b) => a -> a -> b quotBy d n = truncate ((toRational n) / (toRational d)) remBy :: Real a => a -> a -> a remBy d n = n - (fromInteger f) * d where f = quotBy d n quotRemBy :: (Real a, Integral b) => a -> a -> (b, a) quotRemBy d n = let f = quotBy d n in (f, n - (fromIntegral f) * d)