
Seems very nice, I would still argue that Calendars can be a class as all calendars will end up implementing the same (or similar) functions... but the work of defining a generalised interface to calendars is harder than defining a specific interface to a single calendar... In reality I don't think it can be done until several calendars have been implemented. Perhaps defining the library for UTC first, then if other calendars are implemented later a generalised interface can be defined later? Keean. Ashley Yakeley wrote:
This seems to be roughly where we're at with the time libraries. It's now three modules, Clock, LeapSeconds, and Calendar. Most people will have no need for LeapSeconds.
I've added two more things which haven't been discussed much. The first is a getCPUTime function that returns the current "CPU time". This has an arbitrary base, but it doesn't hiccup. The Unix interface for this is a "clock()" function that returns time in some unit, and CLOCKS_PER_SECOND, which is a constant to convert to seconds. I'm assuming there's a Windows equivalent to this.
The second thing is a type-synonym of Rational for Julian dates. Julian dates are a standard representation of UT1, where one unit is one day, and UT1 is a good choice for representing Earth-based times in the far past or future continuously.
System.Time.Clock:
* UTC arithmetic
* types or type-synonyms for Julian days and dates (for UT1)
* getting the current UTC time
* getting the current "CPU time"
System.Time.LeapSeconds:
* TAI arithmetic
* leap-second table type
* conversion between UTC and TAI with table
System.Time.Calendar (largely undiscussed so far):
* time zones
* getting the locale time zone
* converting times to Gregorian "calendrical" format
* calendrical arithmetic e.g. one month after March 31st
* possibly "incomplete dates" e.g. "May 1" for all years
* parsing and showing dates and times
Left for other libraries (standard or user):
* sunrise/sunset, moon phase, solstices & equinoxes, etc.
* figuring out time zone from position on Earth
* civil summertime zone adjustment calculation, interface to zoneinfo database
* calendar systems other than Gregorian
* generalised sets over time e.g. "2pm-4pm every 4th Saturday of the month"
module System.Time.Clock ( ... ) where
-- | standard Julian count of Earth days type JulianDay = Integer
newtype DiffTime = MkDiffTime Integer
timeToSISeconds :: DiffTime -> Rational
siSecondsToTime :: Rational -> DiffTime
data UTCTime = MkUTCTime JulianDay DiffTime
newtype UTCDiffTime = MkUTCDiffTime Integer
utcTimeToUTCSeconds :: UTCDiffTime -> Rational
utcSecondsToUTCTime :: Rational -> UTCDiffTime
addUTCTime :: UTCDiffTime -> UTCTime -> UTCTime
diffUTCTime :: UTCTime -> UTCTime -> UTCDiffTime
...more arithmetic on UTCDiffTime...
-- | standard Julian dates for UT1, 1 = 1 day type JulianDate = Rational
getCurrentTime :: IO UTCTime
getCPUTime :: IO DiffTime
-- | most people won't need this module module System.Time.LeapSeconds ( ... ) where
-- | TAI type AbsoluteTime = MkAbsoluteTime Integer
addAbsoluteTime :: DiffTime -> AbsoluteTime -> AbsoluteTime
diffAbsoluteTime :: AbsoluteTime -> AbsoluteTime -> DiffTime
-- | TAI - UTC during this day type LeapSecondTable = JulianDay -> Int
utcDayLength :: LeapSecondTable -> JulianDay -> DiffTime
utcToTAITime :: LeapSecondTable -> UTCTime -> TAITime
taiToUTCTime :: LeapSecondTable -> TAITime -> UTCTime
module System.Time.Calendar ... TBD ...