ordering.go 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. package ctn
  2. import "kumachan/standalone/util/backports/constraints"
  3. type Compare[T any] (
  4. func(left T, right T)(Ordering))
  5. type Less[T any] (
  6. func(left T, right T)(bool))
  7. func StringCompare(a string, b string) Ordering {
  8. if a == b {
  9. return Equal
  10. } else if a < b {
  11. return Smaller
  12. } else {
  13. return Bigger
  14. }
  15. }
  16. func DefaultCompare[T constraints.Ordered] (left T, right T) Ordering {
  17. if left == right {
  18. return Equal
  19. } else if left < right {
  20. return Smaller
  21. } else {
  22. return Bigger
  23. }
  24. }
  25. type Ordering int
  26. const (
  27. Smaller Ordering = iota
  28. Equal
  29. Bigger
  30. )
  31. func (o Ordering) String() string {
  32. switch o {
  33. case Smaller: return "L<R"
  34. case Bigger: return "L>R"
  35. case Equal: return "L=R"
  36. default:
  37. panic("impossible branch")
  38. }
  39. }
  40. func (o Ordering) Reversed() Ordering {
  41. switch o {
  42. case Smaller: return Bigger
  43. case Bigger: return Smaller
  44. case Equal: return Equal
  45. default:
  46. panic("impossible branch")
  47. }
  48. }
  49. func (cmp Compare[T]) OrderingReversed() Compare[T] {
  50. return func(a T, b T) Ordering {
  51. return cmp(a, b).Reversed()
  52. }
  53. }