module Time.Formatting
( Series (..)
, unitsF
) where
import Time.Rational (Rat)
#if ( __GLASGOW_HASKELL__ >= 804 )
import Time.Rational (withRuntimeDivRat)
#endif
import Time.Units (AllTimes, KnownRatName, Time, floorUnit, toUnit)
class Series (units :: [Rat]) where
seriesF :: forall (someUnit :: Rat) . KnownRatName someUnit
=> Time someUnit
-> String
instance Series ('[] :: [Rat]) where
seriesF :: Time someUnit -> String
seriesF _ = ""
instance (KnownRatName unit, Series units)
=> Series (unit ': units :: [Rat]) where
seriesF :: forall (someUnit :: Rat) . KnownRatName someUnit
=> Time someUnit
-> String
#if ( __GLASGOW_HASKELL__ >= 804 )
seriesF t = let newUnit = withRuntimeDivRat @someUnit @unit $ toUnit @unit t
#else
seriesF t = let newUnit = toUnit @unit t
#endif
format = floorUnit newUnit
timeStr = case floor newUnit :: Int of
0 -> ""
_ -> show format
in timeStr ++ seriesF @units @unit (newUnit format)
unitsF :: forall unit . KnownRatName unit => Time unit -> String
unitsF = seriesF @AllTimes