compare [comparing fst, comparing snd]
>>> data A = A Int Char deriving Generic >>> instance HVector A >>> compare (A 1 'c') (A 2 'c') LT
>>> :kind! Eval (Compare "a" "b") Eval (Compare "a" "b") :: Ordering = LT
>>> :kind! Eval (Compare '[1, 2, 3] '[1, 2, 3]) Eval (Compare '[1, 2, 3] '[1, 2, 3]) :: Ordering = EQ
>>> :kind! Eval (Compare '[1, 3] '[1, 2]) Eval (Compare '[1, 3] '[1, 2]) :: Ordering = GT
>>> compareLength [] 0 EQ >>> compareLength [] 1 LT >>> compareLength ['a'] 1 EQ >>> compareLength ['a', 'b'] 1 GT >>> compareLength [0..] 100 GT >>> compareLength undefined (-1) GT >>> compareLength ('a' : undefined) 0 GT