summaryrefslogtreecommitdiff
path: root/core/source/main
diff options
context:
space:
mode:
authorRocky Madden <git@rockymadden.com>2013-12-29 14:32:21 -0700
committerRocky Madden <git@rockymadden.com>2013-12-29 14:32:21 -0700
commit5fa5030a5858acee69525c0a84ca11b2b0499eed (patch)
tree2f00a301f75a4618aba67f0970c8dac8806e3c16 /core/source/main
parent0c0322939ded19cc8035110a21ed2c06711fc19f (diff)
downloadstringmetric-5fa5030a5858acee69525c0a84ca11b2b0499eed.tar.gz
stringmetric-5fa5030a5858acee69525c0a84ca11b2b0499eed.tar.bz2
stringmetric-5fa5030a5858acee69525c0a84ca11b2b0499eed.zip
Added StringAlgorithmDecorator and StringMetricDecorator.
Diffstat (limited to 'core/source/main')
-rwxr-xr-xcore/source/main/scala/com/rockymadden/stringmetric/Algorithm.scala15
-rwxr-xr-xcore/source/main/scala/com/rockymadden/stringmetric/Metric.scala16
-rwxr-xr-xcore/source/main/scala/com/rockymadden/stringmetric/package.scala9
3 files changed, 39 insertions, 1 deletions
diff --git a/core/source/main/scala/com/rockymadden/stringmetric/Algorithm.scala b/core/source/main/scala/com/rockymadden/stringmetric/Algorithm.scala
index 79821bd..dd810b8 100755
--- a/core/source/main/scala/com/rockymadden/stringmetric/Algorithm.scala
+++ b/core/source/main/scala/com/rockymadden/stringmetric/Algorithm.scala
@@ -1,6 +1,9 @@
package com.rockymadden.stringmetric
object Algorithm {
+ import com.rockymadden.stringmetric.Transform.StringTransform
+
+
trait Algorithm[A] {
def compute(a: A): Option[A]
}
@@ -28,4 +31,16 @@ object Algorithm {
def computeWithSoundex(a: Array[Char]) = Soundex.compute(a)
}
+
+
+ final class StringAlgorithmDecorator(val sa: StringAlgorithm) {
+ val withTransform: (StringTransform => StringAlgorithm) = (st) => new StringAlgorithm {
+ private[this] val self: StringAlgorithm = sa
+ private[this] val transform: StringTransform = st
+
+ override def compute(a: Array[Char]): Option[Array[Char]] = self.compute(transform(a))
+
+ override def compute(a: String): Option[String] = self.compute(transform(a.toCharArray)).map(_.mkString)
+ }
+ }
}
diff --git a/core/source/main/scala/com/rockymadden/stringmetric/Metric.scala b/core/source/main/scala/com/rockymadden/stringmetric/Metric.scala
index ea70b9c..2a62456 100755
--- a/core/source/main/scala/com/rockymadden/stringmetric/Metric.scala
+++ b/core/source/main/scala/com/rockymadden/stringmetric/Metric.scala
@@ -1,6 +1,9 @@
package com.rockymadden.stringmetric
object Metric {
+ import com.rockymadden.stringmetric.Transform.StringTransform
+
+
trait Metric[A, B] {
def compare(a: A, b: A): Option[B]
}
@@ -58,4 +61,17 @@ object Metric {
WeightedLevenshtein(delete, insert, substitute).compare(a, b)
}
+
+ final class StringMetricDecorator[A](val sm: StringMetric[A]) {
+ val withTransform: (StringTransform => StringMetric[A]) = (st) => new StringMetric[A] {
+ private[this] val self: StringMetric[A] = sm
+ private[this] val transform: StringTransform = st
+
+ override def compare(a: Array[Char], b: Array[Char]): Option[A] =
+ self.compare(transform(a), transform(b))
+
+ override def compare(a: String, b: String): Option[A] =
+ self.compare(transform(a.toCharArray), transform(b.toCharArray))
+ }
+ }
}
diff --git a/core/source/main/scala/com/rockymadden/stringmetric/package.scala b/core/source/main/scala/com/rockymadden/stringmetric/package.scala
index 5aefdff..07957c8 100755
--- a/core/source/main/scala/com/rockymadden/stringmetric/package.scala
+++ b/core/source/main/scala/com/rockymadden/stringmetric/package.scala
@@ -2,9 +2,16 @@ package com.rockymadden
package object stringmetric {
import scala.language.implicitConversions
+ import com.rockymadden.stringmetric.Algorithm._
+ import com.rockymadden.stringmetric.Metric._
type CompareTuple[T] = (Array[T], Array[T])
type MatchTuple[T] = (Array[T], Array[T])
- implicit def stringToCharArray(s: String): Array[Char] = s.toCharArray
+ implicit def stringToCharArray(s: String): Array[Char] =
+ s.toCharArray
+ implicit def stringAlgorithmToDecoratedStringAlgorithm(sa: StringAlgorithm): StringAlgorithmDecorator =
+ new StringAlgorithmDecorator(sa)
+ implicit def stringMetricToDecoratedStringMetric[A](sa: StringMetric[A]): StringMetricDecorator[A] =
+ new StringMetricDecorator[A](sa)
}