It should also be possible to write a trait to abstract away which is which, similar to how the common functionality of u32/i32 can be accessed via the Int trait and friends.
While true, the Int trait also uses copious amounts of macros to allow such duplication (technically, it’s octoplication - since there is u8, u16, u32, u64, i8, i16, i32, i64). See source.
With Int, it’s a necessity (because unsigned is useful when indexing array and describing memory addresses).
Currently this:
(inst_a - inst_b).abs() // returns non negative Duration like JodaTime
already covers 90% of use cases.
Summary:
Duration Covers almost all use cases, is established convention is simpler to implement and leaves very few uses cases unsafe.
UnsignedDuration is more complex to implement, is non-convention, creates new probably unknown problems (e.g. what is:
Duration + UnsignedDuration = ?
Duration - UnsignedDuration = ?
UnsignedDuration - Duration = ?
Instant + UnsignedDuration = ?
UnsignedDuration - UnsignedDuration =?
)