strictly, this breaks the ordering laws: A < B < C < A. So, A < A.

Perhaps rename this to def offset(that: Side) with the same logic. Do you need Ordered?