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.scala77
1 files changed, 77 insertions, 0 deletions
diff --git a/core/src/main/scala/com/rockymadden/stringmetric/Metric.scala b/core/src/main/scala/com/rockymadden/stringmetric/Metric.scala
new file mode 100755
index 0000000..f45dd14
--- /dev/null
+++ b/core/src/main/scala/com/rockymadden/stringmetric/Metric.scala
@@ -0,0 +1,77 @@
+package com.rockymadden.stringmetric
+
+object Metric {
+ import Transform.StringTransform
+
+
+ trait Metric[A, B] {
+ def compare(a: A, b: A): Option[B]
+ }
+
+
+ trait StringMetric[A] extends Metric[Array[Char], A] {
+ def compare(a: String, b: String): Option[A]
+ }
+
+
+ object StringMetric {
+ final val DiceSorensen = similarity.DiceSorensenMetric
+ final val Hamming = similarity.HammingMetric
+ final val Jaccard = similarity.JaccardMetric
+ final val Jaro = similarity.JaroMetric
+ final val JaroWinkler = similarity.JaroWinklerMetric
+ final val Levenshtein = similarity.LevenshteinMetric
+ final val Metaphone = phonetic.MetaphoneMetric
+ final val NGram = similarity.NGramMetric
+ final val Nysiis = phonetic.NysiisMetric
+ final val Overlap = similarity.OverlapMetric
+ final val RefinedNysiis = phonetic.RefinedNysiisMetric
+ final val RefinedSoundex = phonetic.RefinedSoundexMetric
+ final val Soundex = phonetic.SoundexMetric
+ final val WeightedLevenshtein = similarity.WeightedLevenshteinMetric
+
+ def compareWithDiceSorensen(n: Int)(a: Array[Char], b: Array[Char]) = DiceSorensen(n).compare(a, b)
+
+ def compareWithHamming(a: Array[Char], b: Array[Char]) = Hamming.compare(a, b)
+
+ def compareWithJaccard(n: Int)(a: Array[Char], b: Array[Char]) = Jaccard(n).compare(a, b)
+
+ def compareWithJaro(a: Array[Char], b: Array[Char]) = Jaro.compare(a, b)
+
+ def compareWithJaroWinkler(a: Array[Char], b: Array[Char]) = JaroWinkler.compare(a, b)
+
+ def compareWithLevenshtein(a: Array[Char], b: Array[Char]) = Levenshtein.compare(a, b)
+
+ def compareWithMetaphone(a: Array[Char], b: Array[Char]) = Metaphone.compare(a, b)
+
+ def compareWithNGram(n: Int)(a: Array[Char], b: Array[Char]) = NGram(n).compare(a, b)
+
+ def compareWithNysiis(a: Array[Char], b: Array[Char]) = Nysiis.compare(a, b)
+
+ def compareWithOverlap(n: Int)(a: Array[Char], b: Array[Char]) = Overlap(n).compare(a, b)
+
+ def compareWithRefinedNysiis(a: Array[Char], b: Array[Char]) = RefinedNysiis.compare(a, b)
+
+ def compareWithRefinedSoundex(a: Array[Char], b: Array[Char]) = RefinedSoundex.compare(a, b)
+
+ def compareWithSoundex(a: Array[Char], b: Array[Char]) = Soundex.compare(a, b)
+
+ def compareWithWeightedLevenshtein(delete: BigDecimal, insert: BigDecimal, substitute: BigDecimal)
+ (a: Array[Char], b: Array[Char]) =
+
+ 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))
+ }
+ }
+}