in src/main/scala/com/twitter/penguin/korean/util/KoreanPos.scala [107:140]
protected[korean] def buildTrie(s: String, ending_pos: KoreanPos): List[KoreanPosTrie] = {
def isFinal(rest: String): Boolean = {
val isNextOptional = rest.foldLeft(true) {
case (output: Boolean, c: Char) if c == '+' || c == '1' => false
case (output: Boolean, c: Char) => output
}
rest.length == 0 || isNextOptional
}
if (s.length < 2) {
return List()
}
val pos = shortCut(s.charAt(0))
val rule = s.charAt(1)
val rest = if (s.length > 1) {
s.slice(2, s.length)
} else {
""
}
val end: Option[KoreanPos] = if (isFinal(rest)) Some(ending_pos) else None
rule match {
case '+' =>
List(KoreanPosTrie(pos, selfNode :: buildTrie(rest, ending_pos), end))
case '*' =>
List(KoreanPosTrie(pos, selfNode :: buildTrie(rest, ending_pos), end)) ++ buildTrie(rest, ending_pos)
case '1' =>
List(KoreanPosTrie(pos, buildTrie(rest, ending_pos), end))
case '0' =>
List(KoreanPosTrie(pos, buildTrie(rest, ending_pos), end)) ++ buildTrie(rest, ending_pos)
}
}