summaryrefslogtreecommitdiff
path: root/core/source/main/scala/com/rockymadden/stringmetric/phonetic/RefinedNysiisAlgorithm.scala
diff options
context:
space:
mode:
Diffstat (limited to 'core/source/main/scala/com/rockymadden/stringmetric/phonetic/RefinedNysiisAlgorithm.scala')
-rwxr-xr-xcore/source/main/scala/com/rockymadden/stringmetric/phonetic/RefinedNysiisAlgorithm.scala37
1 files changed, 20 insertions, 17 deletions
diff --git a/core/source/main/scala/com/rockymadden/stringmetric/phonetic/RefinedNysiisAlgorithm.scala b/core/source/main/scala/com/rockymadden/stringmetric/phonetic/RefinedNysiisAlgorithm.scala
index 72bd84e..c35175d 100755
--- a/core/source/main/scala/com/rockymadden/stringmetric/phonetic/RefinedNysiisAlgorithm.scala
+++ b/core/source/main/scala/com/rockymadden/stringmetric/phonetic/RefinedNysiisAlgorithm.scala
@@ -9,30 +9,32 @@ case object RefinedNysiisAlgorithm extends StringAlgorithmLike {
if (a.length == 0 || !(Alpha isSuperset a.head)) None
else {
val lca = a.map(_.toLower)
- val tlh = transcodeLast(transcodeHead(lca.head +: cleanLast(lca.tail, Set('s', 'z'))))
+ val tlh = (transcodeHead andThen transcodeLast)(lca.head +: cleanLast(lca.tail, Set('s', 'z')))
val t = transcode(Array.empty[Char], tlh.head, tlh.tail, Array.empty[Char])
if (t.length == 1) Some(t)
- else Some(deduplicate(t.head +: cleanTerminal(cleanLast(t.tail, Set('a')))))
+ else Some(deduplicate(
+ t.head +: (cleanLast.tupled andThen cleanTerminal)(t.tail, Set('a'))
+ ))
}
override def compute(string: String): Option[String] = compute(string.toCharArray).map(_.mkString)
- private def cleanLast(ca: Array[Char], s: Set[Char]) =
+ private val cleanLast: ((Array[Char], Set[Char]) => Array[Char]) = (ca, s) =>
if (ca.length == 0) ca
else if(s.contains(ca.last)) ca.dropRight(ca.reverseIterator.takeWhile(c => s.contains(c)).length)
else ca
- private def cleanTerminal(ca: Array[Char]) =
+ private val cleanTerminal: (Array[Char] => Array[Char]) = (ca) =>
if (ca.length >= 2 && ca.last == 'y' && ca(ca.length - 2) == 'a') ca.dropRight(2) :+ 'y'
else ca
- private def deduplicate(ca: Array[Char]) =
+ private val deduplicate: (Array[Char] => Array[Char]) = (ca) =>
if (ca.length <= 1) ca
else ca.sliding(2).withFilter(a => a(0) != a(1)).map(a => a(0)).toArray[Char] :+ ca.last
@annotation.tailrec
- private def transcode(l: Array[Char], c: Char, r: Array[Char], o: Array[Char]): Array[Char] = {
+ private val transcode: ((Array[Char], Char, Array[Char], Array[Char]) => Array[Char]) = (l, c, r, o) =>
if (c == '\0' && r.length == 0) o
else {
def shift(d: Int, ca: Array[Char]) = {
@@ -63,7 +65,8 @@ case object RefinedNysiisAlgorithm extends StringAlgorithmLike {
else shift(1, o :+ c)
case 'h' =>
if (l.length == 0) shift(1, o :+ c)
- else if (!(LowercaseVowel isSuperset l.last) || (r.length >= 1 && !(LowercaseVowel isSuperset r.head))) shift(1, o)
+ else if (!(LowercaseVowel isSuperset l.last) || (r.length >= 1 && !(LowercaseVowel isSuperset r.head)))
+ shift(1, o)
else shift(1, o :+ c)
case 'k' => if (r.length >= 1 && r.head == 'n') shift(2, o :+ 'n') else shift(1, o :+ 'c')
case 'm' => if (l.length == 0) shift(1, o :+ c) else shift(1, o :+ 'n')
@@ -89,29 +92,29 @@ case object RefinedNysiisAlgorithm extends StringAlgorithmLike {
transcode(t._1, t._2, t._3, t._4)
}
- }
- private def transcodeHead(ca: Array[Char]) =
+ private val transcodeHead: (Array[Char] => Array[Char]) = (ca) =>
if (ca.length == 0) ca
else
(ca.head: @annotation.switch) match {
- case 'm' if (ca.length >= 3 && ca(1) == 'a' && ca(2) == 'c') => Array('m', 'c') ++ ca.takeRight(ca.length - 3)
- case 'p' if (ca.length >= 2 && ca(1) == 'f') => 'f' +: ca.takeRight(ca.length - 2)
+ case 'm' if ca.length >= 3 && ca(1) == 'a' && ca(2) == 'c' =>
+ Array('m', 'c') ++ ca.takeRight(ca.length - 3)
+ case 'p' if ca.length >= 2 && ca(1) == 'f' =>'f' +: ca.takeRight(ca.length - 2)
case _ => ca
}
- private def transcodeLast(ca: Array[Char]) =
+ private val transcodeLast: (Array[Char] => Array[Char]) = (ca) =>
if (ca.length >= 2) {
val lc = ca(ca.length - 1)
val lcm1 = ca(ca.length - 2)
lazy val t2 = ca.take(ca.length - 2)
(lc: @annotation.switch) match {
- case 'd' if (lcm1 == 'n' || lcm1 == 'r') => t2 :+ 'd'
- case 'e' if (lcm1 == 'e' || lcm1 == 'i' || lcm1 =='y') => t2 :+ 'y'
- case 't' if (lcm1 == 'd' || lcm1 == 'n' || lcm1 == 'r') => t2 :+ 'd'
- case 'x' if (lcm1 == 'e') => t2 ++ Array('e', 'c')
- case 'x' if (lcm1 == 'i') => t2 ++ Array('i', 'c')
+ case 'd' if lcm1 == 'n' || lcm1 == 'r' => t2 :+ 'd'
+ case 'e' if lcm1 == 'e' || lcm1 == 'i' || lcm1 =='y' => t2 :+ 'y'
+ case 't' if lcm1 == 'd' || lcm1 == 'n' || lcm1 == 'r' => t2 :+ 'd'
+ case 'x' if lcm1 == 'e' => t2 ++ Array('e', 'c')
+ case 'x' if lcm1 == 'i' => t2 ++ Array('i', 'c')
case _ => ca
}
} else ca