corsis / clock

High-resolution clock functions: monotonic, realtime, cputime.
Other
58 stars 25 forks source link

fix Num multiplication, add Real, Enum, Integral instances #67

Closed Mathnerd314 closed 3 years ago

Mathnerd314 commented 3 years ago

These instances are based on using the nanosecond as the underlying unit, i.e. the value of a TimeSpec is the integer s * 1e9 + ns. Before it was based on representing the rational s + (ns / 1e9). But the integer valuation satisfies the ring laws and provides much more intuitive behavior, e.g.

(2 :: TimeSpec)*(2 :: TimeSpec) = (4 :: TimeSpec)

Before, this gave 0.

This should properly fix #32, #33. Of course it breaks anyone who was using the old version of (*). The old version of (*) is equivalent to a * b `div` 1000000000 in the new version.

dten commented 2 years ago

This change broke our program. I blame ourselves for multiplying two TimeSpecs together in the first place (no one was after seconds-squared). But this is a breaking change and probably should have at least made it to the changelog

Mathnerd314 commented 2 years ago

Well, it is in the changelog, somewhat vaguely, as "TODO: new module System.Clock.Seconds" and following. I think the more pressing issue is that per https://pvp.haskell.org/ the changes should have caused a major version bump, so the release should be 0.9.0.