summaryrefslogtreecommitdiff
path: root/core/src/main/scala/com/rockymadden/stringmetric/Algorithm.scala
diff options
context:
space:
mode:
authorRocky Madden <git@rockymadden.com>2014-01-03 21:19:35 -0700
committerRocky Madden <git@rockymadden.com>2014-01-03 21:19:35 -0700
commit9004f973bff2b3b86d1d36c65fa9f0ac55b56fce (patch)
tree339927cfb6bc319778a559badff15d82b4b1b850 /core/src/main/scala/com/rockymadden/stringmetric/Algorithm.scala
parent092307ce380aa57f7a0583856fa69a07304e0c30 (diff)
downloadstringmetric-9004f973bff2b3b86d1d36c65fa9f0ac55b56fce.tar.gz
stringmetric-9004f973bff2b3b86d1d36c65fa9f0ac55b56fce.tar.bz2
stringmetric-9004f973bff2b3b86d1d36c65fa9f0ac55b56fce.zip
Created memoization decoration.
Diffstat (limited to 'core/src/main/scala/com/rockymadden/stringmetric/Algorithm.scala')
-rwxr-xr-xcore/src/main/scala/com/rockymadden/stringmetric/Algorithm.scala18
1 files changed, 17 insertions, 1 deletions
diff --git a/core/src/main/scala/com/rockymadden/stringmetric/Algorithm.scala b/core/src/main/scala/com/rockymadden/stringmetric/Algorithm.scala
index 96cf142..1200926 100755
--- a/core/src/main/scala/com/rockymadden/stringmetric/Algorithm.scala
+++ b/core/src/main/scala/com/rockymadden/stringmetric/Algorithm.scala
@@ -1,6 +1,7 @@
package com.rockymadden.stringmetric
object Algorithm {
+ import scala.collection.immutable.Map
import Transform.StringTransform
@@ -34,13 +35,28 @@ object Algorithm {
final class StringAlgorithmDecorator(val sa: StringAlgorithm) {
+ val withMemoization: StringAlgorithm = new StringAlgorithm {
+ private val base: StringAlgorithm = sa
+ private var memo: Map[String, Option[String]] = Map()
+
+ override def compute(a: Array[Char]): Option[Array[Char]] =
+ compute(a.toString).map(_.toCharArray)
+
+ override def compute(a: String): Option[String] =
+ if (memo.contains(a)) memo(a)
+ else {
+ memo = memo + (a -> base.compute(a))
+ memo(a)
+ }
+ }
+
val withTransform: (StringTransform => StringAlgorithm) = (st) => new StringAlgorithm {
private val base: StringAlgorithm = sa
private val transform: StringTransform = st
override def compute(a: Array[Char]): Option[Array[Char]] = base.compute(transform(a))
- override def compute(a: String): Option[String] = base.compute(transform(a.toCharArray)).map(_.mkString)
+ override def compute(a: String): Option[String] = compute(a.toCharArray).map(_.mkString)
}
}
}