diff options
author | Rocky Madden <git@rockymadden.com> | 2014-01-03 21:19:35 -0700 |
---|---|---|
committer | Rocky Madden <git@rockymadden.com> | 2014-01-03 21:19:35 -0700 |
commit | 9004f973bff2b3b86d1d36c65fa9f0ac55b56fce (patch) | |
tree | 339927cfb6bc319778a559badff15d82b4b1b850 /core/src/main/scala/com/rockymadden/stringmetric/Algorithm.scala | |
parent | 092307ce380aa57f7a0583856fa69a07304e0c30 (diff) | |
download | stringmetric-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-x | core/src/main/scala/com/rockymadden/stringmetric/Algorithm.scala | 18 |
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) } } } |