diff options
Diffstat (limited to 'core/src/main/scala/com/rockymadden/stringmetric/Metric.scala')
-rwxr-xr-x | core/src/main/scala/com/rockymadden/stringmetric/Metric.scala | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/core/src/main/scala/com/rockymadden/stringmetric/Metric.scala b/core/src/main/scala/com/rockymadden/stringmetric/Metric.scala index f217f52..686ebc9 100755 --- a/core/src/main/scala/com/rockymadden/stringmetric/Metric.scala +++ b/core/src/main/scala/com/rockymadden/stringmetric/Metric.scala @@ -1,7 +1,7 @@ package com.rockymadden.stringmetric object Metric { - import Transform.StringTransform + import Transform._ trait Metric[A, B] { @@ -9,6 +9,12 @@ object Metric { } + object Metric { + implicit def stringMetricToDecorated[A](sa: StringMetric[A]): StringMetricDecorator[A] = + new StringMetricDecorator[A](sa) + } + + trait StringMetric[A] extends Metric[Array[Char], A] { def compare(a: String, b: String): Option[A] } @@ -62,8 +68,16 @@ object Metric { WeightedLevenshtein(delete, insert, substitute).compare(a, b) } - final class StringMetricDecorator[A](val sm: StringMetric[A]) { - val withMemoization: StringMetric[A] = new StringMetric[A] { + + sealed trait MetricDecorator[A, B] { + val withMemoization: Metric[A, B] + + val withTransform: (Transform[A] => Metric[A, B]) + } + + + final case class StringMetricDecorator[A](sm: StringMetric[A]) extends MetricDecorator[Array[Char], A] { + override val withMemoization: StringMetric[A] = new StringMetric[A] { private val base: StringMetric[A] = sm private var memo: Map[(String, String), Option[A]] = Map() @@ -80,7 +94,7 @@ object Metric { } } - val withTransform: (StringTransform => StringMetric[A]) = (st) => new StringMetric[A] { + override val withTransform: (StringTransform => StringMetric[A]) = (st) => new StringMetric[A] { private val base: StringMetric[A] = sm private val transform: StringTransform = st |