diff options
author | Rocky Madden <git@rockymadden.com> | 2013-12-28 11:49:33 -0700 |
---|---|---|
committer | Rocky Madden <git@rockymadden.com> | 2013-12-28 11:49:33 -0700 |
commit | ef997c15f2ac152b53f05669f1d6bb9aa00aded7 (patch) | |
tree | 571f2eb996940b6f39dc7ab073bbc2d20ae9c93c /cli | |
parent | 001b756ff5fb88e295b0ff4e4ee89bf326a4f83e (diff) | |
download | stringmetric-ef997c15f2ac152b53f05669f1d6bb9aa00aded7.tar.gz stringmetric-ef997c15f2ac152b53f05669f1d6bb9aa00aded7.tar.bz2 stringmetric-ef997c15f2ac152b53f05669f1d6bb9aa00aded7.zip |
A more functional structure.
Diffstat (limited to 'cli')
9 files changed, 66 insertions, 80 deletions
diff --git a/cli/source/main/scala/com/rockymadden/stringmetric/cli/OptionMap.scala b/cli/source/main/scala/com/rockymadden/stringmetric/cli/OptionMap.scala deleted file mode 100755 index 8f9da13..0000000 --- a/cli/source/main/scala/com/rockymadden/stringmetric/cli/OptionMap.scala +++ /dev/null @@ -1,36 +0,0 @@ -package com.rockymadden.stringmetric.cli - -object OptionMap { - def apply(args: Array[String]): OptionMap = apply(args: _*) - - def apply(varargs: String*): OptionMap = { - @annotation.tailrec - def next(om: OptionMap, a: List[String]): OptionMap = { - val double = """^(--[a-zA-Z0-9]+)(=[a-zA-Z0-9\.\-_]+)?""".r - val single = """^(-[a-zA-Z0-9]+)(=[a-zA-Z0-9\.\-_]+)?""".r - val less = """([a-zA-Z0-9/\-_\$\.]+)""".r - - a match { - // Empty, return. - case Nil => om - // Double dash options without value. - case double(k, null) :: t => next(om + (Symbol(k.tail.tail) -> ""), t) - // Double dash options with value. - case double(k, v) :: t => next(om + (Symbol(k.tail.tail) -> v.tail), t) - // Single dash options without value. - case single(k, null) :: t => next(om + (Symbol(k.tail) -> ""), t) - // Single dash options with value. Value is discarded. - case single(k, v) :: t => next(om + (Symbol(k.tail) -> ""), t) - // Dashless options. - case less(v) :: t if v.head != '-' => - if (om.contains('dashless)) - next((om - 'dashless) + ('dashless -> (om('dashless).self + " " + v.trim)), t) - else next(om + ('dashless -> v.trim), t) - // Invalid option, ignore. - case _ :: t => next(om, t) - } - } - - next(Map.empty[Symbol, OptionString], varargs.toList) - } -} diff --git a/cli/source/main/scala/com/rockymadden/stringmetric/cli/OptionString.scala b/cli/source/main/scala/com/rockymadden/stringmetric/cli/OptionString.scala deleted file mode 100755 index 7a1350d..0000000 --- a/cli/source/main/scala/com/rockymadden/stringmetric/cli/OptionString.scala +++ /dev/null @@ -1,30 +0,0 @@ -package com.rockymadden.stringmetric.cli - -import scala.language.implicitConversions - -class OptionString(val self: String) - -object OptionString { - implicit def OptionStringToArray(optionString: OptionString): Array[String] = - if (optionString.self.length == 0) Array.empty[String] else optionString.self.split(" ") - - implicit def OptionStringToBigDecimal(optionString: OptionString): BigDecimal = BigDecimal(optionString.self) - - implicit def OptionStringToBigInt(optionString: OptionString): BigInt = BigInt(optionString.self) - - implicit def OptionStringToDouble(optionString: OptionString): Double = optionString.self.toDouble - - implicit def OptionStringToFloat(optionString: OptionString): Float = optionString.self.toFloat - - implicit def OptionStringToInt(optionString: OptionString): Int = optionString.self.toInt - - implicit def OptionStringToLong(optionString: OptionString): Long = optionString.self.toLong - - implicit def OptionStringToShort(optionString: OptionString): Short = optionString.self.toShort - - implicit def OptionStringToString(optionString: OptionString): String = optionString.self - - implicit def StringToOptionString(string: String): OptionString = apply(string) - - def apply(string: String): OptionString = new OptionString(string) -} diff --git a/cli/source/main/scala/com/rockymadden/stringmetric/cli/package.scala b/cli/source/main/scala/com/rockymadden/stringmetric/cli/package.scala index cbaba97..0b049bb 100755 --- a/cli/source/main/scala/com/rockymadden/stringmetric/cli/package.scala +++ b/cli/source/main/scala/com/rockymadden/stringmetric/cli/package.scala @@ -1,13 +1,68 @@ package com.rockymadden.stringmetric -import scala.language.implicitConversions - /** * Provides core CLI functionality. Note that some things might look sloppy (e.g. access modifiers, broad imports, * repetitive imports, etc), but are required because of the way scalascript is ultimately compiled. */ package object cli { + import scala.language.implicitConversions + + + implicit def optionStringToArray(os: OptionString): Array[String] = + if (os.get.length == 0) Array.empty[String] else os.get.split(" ") + implicit def optionStringToBigDecimal(os: OptionString): BigDecimal = BigDecimal(os.get) + implicit def optionStringToBigInt(os: OptionString): BigInt = BigInt(os.get) + implicit def optionStringToDouble(os: OptionString): Double = os.get.toDouble + implicit def optionStringToFloat(os: OptionString): Float = os.get.toFloat + implicit def optionStringToInt(os: OptionString): Int = os.get.toInt + implicit def optionStringToLong(os: OptionString): Long = os.get.toLong + implicit def optionStringToShort(os: OptionString): Short = os.get.toShort + implicit def optionStringToString(os: OptionString): String = os.get + implicit def stringToOptionString(s: String): OptionString = OptionString(s) + implicit def arrayOfStringToOptionMap(stringArray: Array[String]): OptionMap = OptionMap(stringArray) + + + class OptionString(val get: String) + + object OptionString { + def apply(s: String): OptionString = new OptionString(s) + } + + type OptionMap = Map[Symbol, OptionString] - implicit def StringArrayToOptionMap(stringArray: Array[String]): OptionMap = OptionMap(stringArray) + object OptionMap { + def apply(args: Array[String]): OptionMap = apply(args: _*) + + def apply(varargs: String*): OptionMap = { + @annotation.tailrec + def next(om: OptionMap, a: List[String]): OptionMap = { + val double = """^(--[a-zA-Z0-9]+)(=[a-zA-Z0-9\.\-_]+)?""".r + val single = """^(-[a-zA-Z0-9]+)(=[a-zA-Z0-9\.\-_]+)?""".r + val less = """([a-zA-Z0-9/\-_\$\.]+)""".r + + a match { + // Empty, return. + case Nil => om + // Double dash options without value. + case double(k, null) :: t => next(om + (Symbol(k.tail.tail) -> ""), t) + // Double dash options with value. + case double(k, v) :: t => next(om + (Symbol(k.tail.tail) -> v.tail), t) + // Single dash options without value. + case single(k, null) :: t => next(om + (Symbol(k.tail) -> ""), t) + // Single dash options with value. Value is discarded. + case single(k, v) :: t => next(om + (Symbol(k.tail) -> ""), t) + // Dashless options. + case less(v) :: t if v.head != '-' => + if (om.contains('dashless)) + next((om - 'dashless) + ('dashless -> (om('dashless).get + " " + v.trim)), t) + else next(om + ('dashless -> v.trim), t) + // Invalid option, ignore. + case _ :: t => next(om, t) + } + } + + next(Map.empty[Symbol, OptionString], varargs.toList) + } + } } diff --git a/cli/source/main/scala/com/rockymadden/stringmetric/cli/similarity/dicesorensenmetric.scala b/cli/source/main/scala/com/rockymadden/stringmetric/cli/similarity/dicesorensenmetric.scala index 5d0e234..a166f4f 100755 --- a/cli/source/main/scala/com/rockymadden/stringmetric/cli/similarity/dicesorensenmetric.scala +++ b/cli/source/main/scala/com/rockymadden/stringmetric/cli/similarity/dicesorensenmetric.scala @@ -44,6 +44,6 @@ object dicesorensenmetric extends Command { val strings: Array[String] = opts('dashless) val n: Int = opts('n) - println(DiceSorensenMetric.compare(strings(0), strings(1))(n).getOrElse("not comparable")) + println(DiceSorensenMetric(n).compare(strings(0), strings(1)).getOrElse("not comparable")) } } diff --git a/cli/source/main/scala/com/rockymadden/stringmetric/cli/similarity/jaccardmetric.scala b/cli/source/main/scala/com/rockymadden/stringmetric/cli/similarity/jaccardmetric.scala index 1f1e123..5dee606 100755 --- a/cli/source/main/scala/com/rockymadden/stringmetric/cli/similarity/jaccardmetric.scala +++ b/cli/source/main/scala/com/rockymadden/stringmetric/cli/similarity/jaccardmetric.scala @@ -44,6 +44,6 @@ object jaccardmetric extends Command { val strings: Array[String] = opts('dashless) val n: Int = opts('n) - println(JaccardMetric.compare(strings(0), strings(1))(n).getOrElse("not comparable")) + println(JaccardMetric(n).compare(strings(0), strings(1)).getOrElse("not comparable")) } } diff --git a/cli/source/main/scala/com/rockymadden/stringmetric/cli/similarity/ngrammetric.scala b/cli/source/main/scala/com/rockymadden/stringmetric/cli/similarity/ngrammetric.scala index af0634f..1e54ec6 100755 --- a/cli/source/main/scala/com/rockymadden/stringmetric/cli/similarity/ngrammetric.scala +++ b/cli/source/main/scala/com/rockymadden/stringmetric/cli/similarity/ngrammetric.scala @@ -44,6 +44,6 @@ object ngrammetric extends Command { val strings: Array[String] = options('dashless) val n: Int = options('n) - println(NGramMetric.compare(strings(0), strings(1))(n).getOrElse("not comparable")) + println(NGramMetric(n).compare(strings(0), strings(1)).getOrElse("not comparable")) } } diff --git a/cli/source/main/scala/com/rockymadden/stringmetric/cli/similarity/overlapmetric.scala b/cli/source/main/scala/com/rockymadden/stringmetric/cli/similarity/overlapmetric.scala index 2c670c5..81d3e04 100755 --- a/cli/source/main/scala/com/rockymadden/stringmetric/cli/similarity/overlapmetric.scala +++ b/cli/source/main/scala/com/rockymadden/stringmetric/cli/similarity/overlapmetric.scala @@ -44,6 +44,6 @@ object overlapmetric extends Command { val strings: Array[String] = opts('dashless) val n: Int = opts('n) - println(OverlapMetric.compare(strings(0), strings(1))(n).getOrElse("not comparable")) + println(OverlapMetric(n).compare(strings(0), strings(1)).getOrElse("not comparable")) } } diff --git a/cli/source/main/scala/com/rockymadden/stringmetric/cli/similarity/weightedlevenshteinmetric.scala b/cli/source/main/scala/com/rockymadden/stringmetric/cli/similarity/weightedlevenshteinmetric.scala index d675db1..a9ad9b7 100755 --- a/cli/source/main/scala/com/rockymadden/stringmetric/cli/similarity/weightedlevenshteinmetric.scala +++ b/cli/source/main/scala/com/rockymadden/stringmetric/cli/similarity/weightedlevenshteinmetric.scala @@ -51,12 +51,9 @@ object weightedlevenshteinmetric extends Command { override def execute(opts: OptionMap): Unit = { val strings: Array[String] = opts('dashless) - val weights = Tuple3[BigDecimal, BigDecimal, BigDecimal]( - opts('deleteWeight), - opts('insertWeight), - opts('substituteWeight) - ) - println(WeightedLevenshteinMetric.compare(strings(0), strings(1))(weights).getOrElse("not comparable")) + println(WeightedLevenshteinMetric( + opts('deleteWeight), opts('insertWeight), opts('substituteWeight) + ).compare(strings(0), strings(1)).getOrElse("not comparable")) } } diff --git a/cli/source/main/scala/com/rockymadden/stringmetric/cli/tokenization/ngramtokenizer.scala b/cli/source/main/scala/com/rockymadden/stringmetric/cli/tokenization/ngramtokenizer.scala index 99fdbe5..9139e3a 100755 --- a/cli/source/main/scala/com/rockymadden/stringmetric/cli/tokenization/ngramtokenizer.scala +++ b/cli/source/main/scala/com/rockymadden/stringmetric/cli/tokenization/ngramtokenizer.scala @@ -41,7 +41,7 @@ object ngramtokenizer extends Command { } override def execute(opts: OptionMap): Unit = - NGramTokenizer.tokenize(opts('dashless))(opts('n)) match { + NGramTokenizer(opts('n)).tokenize(opts('dashless)) match { // Implicits are a pain here. case Some(c) => { val sb = new StringBuilder |