summaryrefslogtreecommitdiff
path: root/core/src/main/scala/com/rockymadden/stringmetric/Metric.scala
diff options
context:
space:
mode:
Diffstat (limited to 'core/src/main/scala/com/rockymadden/stringmetric/Metric.scala')
-rwxr-xr-xcore/src/main/scala/com/rockymadden/stringmetric/Metric.scala22
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