2021-02-20 00:40:02 +01:00
|
|
|
package jp.juggler.emoji
|
|
|
|
|
|
|
|
import androidx.collection.SparseArrayCompat
|
|
|
|
|
|
|
|
class EmojiTrie<T> {
|
2021-02-20 12:22:22 +01:00
|
|
|
|
|
|
|
data class Result<T>(val data: T, val endPos: Int)
|
|
|
|
|
2021-02-20 00:40:02 +01:00
|
|
|
var data: T? = null
|
|
|
|
val map = SparseArrayCompat<EmojiTrie<T>>()
|
|
|
|
|
|
|
|
fun append(src: String, offset: Int, data: T) {
|
|
|
|
if (offset >= src.length) {
|
|
|
|
if (this.data != null) error("EmojiTrie.append: duplicate: $src")
|
|
|
|
this.data = data
|
|
|
|
return
|
|
|
|
}
|
|
|
|
val c = src[offset].toInt()
|
|
|
|
val next = map[c] ?: EmojiTrie<T>().also { map.put(c, it) }
|
|
|
|
next.append(src, offset + 1, data)
|
|
|
|
}
|
|
|
|
|
|
|
|
fun hasNext(c: Char) = map.containsKey(c.toInt())
|
|
|
|
|
2021-02-20 12:22:22 +01:00
|
|
|
fun get(src: String, offset: Int, end: Int): Result<T>? {
|
2021-02-20 00:40:02 +01:00
|
|
|
// 長い方を優先するので、先に子を調べる
|
|
|
|
if (offset < end)
|
|
|
|
map[src[offset].toInt()]?.get(src, offset + 1, end)
|
|
|
|
?.let { return it }
|
2021-02-20 12:22:22 +01:00
|
|
|
return this.data?.let { Result(it, offset) }
|
2021-02-20 00:40:02 +01:00
|
|
|
}
|
|
|
|
}
|