package scalaz
package syntax

/** Wraps a value `self` and provides methods related to `MetricSpace` */
trait MetricSpaceOps[F] extends Ops[F] {
  implicit def F: MetricSpace[F]
  ////
  final def <===>(a: F): Int = F.distance(self, a)
  ////
}

trait ToMetricSpaceOps  {
  implicit def ToMetricSpaceOps[F](v: F)(implicit F0: MetricSpace[F]) =
    new MetricSpaceOps[F] { def self = v; implicit def F: MetricSpace[F] = F0 }

  ////

  ////
}

trait MetricSpaceSyntax[F]  {
  implicit def ToMetricSpaceOps(v: F): MetricSpaceOps[F] = new MetricSpaceOps[F] { def self = v; implicit def F: MetricSpace[F] = MetricSpaceSyntax.this.F }
  
  def F: MetricSpace[F]
  ////

  ////
}