FWIW, one of the major pain-points with Wrapping<T> is that heterogeneous operations - e.g. T + Wrapping<T> - are not permitted. This is because itās not obvious whether such an operation should wrap or not. In different words, one of the operands essentially needs to be casted before performing the operation, and itās not clear which one.
Iām now kind of leaning towards saying that Wrapping<T> should āwinā: in other words, that we should have impl Add<u32> for Wrapping<u32> { type Output = Wrapping<u32>; ... } (and vice versa), and likewise for the other types. The intuition is this: the reason why āplainā T (e.g. u32) panics on over/underflow is not because this is well-known to be the behavior thatās desired by users of u32; rather, the reason is precisely that we donāt have any information about the programmerās intent, so our only reasonable option is to signal the unhandled circumstance by panicking. (This is also underscored by the fact that panicking only happens in debug builds: if we knew that panicking is what the programmer explicitly wants, then we would do it always.)
Now in the case of u32 + Wrapping<u32>, if we think of it as a unification problem, then āno available informationā unifies with āit should wrapā to yield āit should wrapā.
(Incidentally, for completenessās sake, we should presumably also have Saturating<T>, Checked<T>, and Overflowing<T> for the other possible policies, with analogous impls. And see also.)