compare.pony

primitive Less is Equatable[Compare]
  fun string(): String iso^ =>
    "Less".string()

primitive Equal is Equatable[Compare]
  fun string(): String iso^ =>
    "Equal".string()

primitive Greater is Equatable[Compare]
  fun string(): String iso^ =>
    "Greater".string()

type Compare is (Less | Equal | Greater)

interface HasEq[A]
  fun eq(that: box->A): Bool

interface Equatable[A: Equatable[A] #read]
  fun eq(that: box->A): Bool => this is that
  fun ne(that: box->A): Bool => not eq(that)

interface Comparable[A: Comparable[A] #read] is Equatable[A]
  fun lt(that: box->A): Bool
  fun le(that: box->A): Bool => lt(that) or eq(that)
  fun ge(that: box->A): Bool => not lt(that)
  fun gt(that: box->A): Bool => not le(that)

  fun compare(that: box->A): Compare =>
    if eq(that) then
      Equal
    elseif lt(that) then
      Less
    else
      Greater
    end