diff options
author | Rocky Madden <git@rockymadden.com> | 2013-12-29 14:32:21 -0700 |
---|---|---|
committer | Rocky Madden <git@rockymadden.com> | 2013-12-29 14:32:21 -0700 |
commit | 5fa5030a5858acee69525c0a84ca11b2b0499eed (patch) | |
tree | 2f00a301f75a4618aba67f0970c8dac8806e3c16 /core/source/main | |
parent | 0c0322939ded19cc8035110a21ed2c06711fc19f (diff) | |
download | stringmetric-5fa5030a5858acee69525c0a84ca11b2b0499eed.tar.gz stringmetric-5fa5030a5858acee69525c0a84ca11b2b0499eed.tar.bz2 stringmetric-5fa5030a5858acee69525c0a84ca11b2b0499eed.zip |
Added StringAlgorithmDecorator and StringMetricDecorator.
Diffstat (limited to 'core/source/main')
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) } |