diff options
author | Rocky Madden <git@rockymadden.com> | 2014-03-26 16:09:24 -0600 |
---|---|---|
committer | Rocky Madden <git@rockymadden.com> | 2014-03-26 16:09:24 -0600 |
commit | 3c806b88e9169ed742ae5740d81fbbb24f0ca768 (patch) | |
tree | 4b6a75a1042000841200b6af031abe62b542ab71 /core/src/main/scala/com/rockymadden/stringmetric/MetricDecorator.scala | |
parent | a25d9e70528a0b2bab96cc55ede9232076fd4299 (diff) | |
download | stringmetric-3c806b88e9169ed742ae5740d81fbbb24f0ca768.tar.gz stringmetric-3c806b88e9169ed742ae5740d81fbbb24f0ca768.tar.bz2 stringmetric-3c806b88e9169ed742ae5740d81fbbb24f0ca768.zip |
Removed module structure.
Diffstat (limited to 'core/src/main/scala/com/rockymadden/stringmetric/MetricDecorator.scala')
-rw-r--r-- | core/src/main/scala/com/rockymadden/stringmetric/MetricDecorator.scala | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/core/src/main/scala/com/rockymadden/stringmetric/MetricDecorator.scala b/core/src/main/scala/com/rockymadden/stringmetric/MetricDecorator.scala new file mode 100644 index 0000000..e14db86 --- /dev/null +++ b/core/src/main/scala/com/rockymadden/stringmetric/MetricDecorator.scala @@ -0,0 +1,37 @@ +package com.rockymadden.stringmetric + +import scala.collection.immutable.Map + +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() + + override def compare(a: Array[Char], b: Array[Char]): Option[A] = compare(a.toString, b.toString) + + override def compare(a: String, b: String): Option[A] = { + val t = (a, b) + + if (memo.contains(t)) memo(t) + else { + memo = memo + (t -> base.compare(a, b)) + memo(t) + } + } + } + + override val withTransform: (StringTransform => StringMetric[A]) = (st) => new StringMetric[A] { + private val base: StringMetric[A] = sm + private val transform: StringTransform = st + + override def compare(a: Array[Char], b: Array[Char]): Option[A] = base.compare(transform(a), transform(b)) + + override def compare(a: String, b: String): Option[A] = compare(a.toCharArray, b.toCharArray) + } +} |