Megrez // Fix an issue that update() can ruin a span unit object.
This commit is contained in:
parent
ed84c613a0
commit
f8abcd59e4
|
@ -291,7 +291,7 @@ extension Megrez.Compositor {
|
||||||
// 自動銷毀無效的節點。
|
// 自動銷毀無效的節點。
|
||||||
if unigrams.isEmpty {
|
if unigrams.isEmpty {
|
||||||
if theNode.keyArray.count == 1 { continue }
|
if theNode.keyArray.count == 1 { continue }
|
||||||
spans[position].nodes.removeAll { $0 == theNode }
|
spans[position].nullify(node: theNode)
|
||||||
} else {
|
} else {
|
||||||
theNode.syncingUnigrams(from: unigrams)
|
theNode.syncingUnigrams(from: unigrams)
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,10 +24,7 @@ extension Megrez.Compositor {
|
||||||
|
|
||||||
/// 清除該幅位單元的全部的節點,且重設最長節點長度為 0,然後再在節點陣列內預留空位。
|
/// 清除該幅位單元的全部的節點,且重設最長節點長度為 0,然後再在節點陣列內預留空位。
|
||||||
public func clear() {
|
public func clear() {
|
||||||
nodes.removeAll()
|
nodes = .init(repeating: nil, count: maxSpanLength)
|
||||||
for _ in 0 ..< maxSpanLength {
|
|
||||||
nodes.append(nil)
|
|
||||||
}
|
|
||||||
maxLength = 0
|
maxLength = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -43,6 +40,18 @@ extension Megrez.Compositor {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// 丟掉任何與給定節點完全雷同的節點。
|
||||||
|
/// - Remark: Swift 不像 C# 那樣有容量鎖定型陣列,
|
||||||
|
/// 對某個位置的內容的刪除行為都可能會導致其它內容錯位、繼發其它不可知故障。
|
||||||
|
/// 於是就提供了這個專門的工具函式。
|
||||||
|
/// - Parameter node: 要參照的節點。
|
||||||
|
public func nullify(node givenNode: Node) {
|
||||||
|
nodes.enumerated().forEach { index, theNode in
|
||||||
|
guard theNode == givenNode else { return }
|
||||||
|
nodes[index] = nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// 丟掉任何不小於給定幅位長度的節點。
|
/// 丟掉任何不小於給定幅位長度的節點。
|
||||||
/// - Parameter length: 給定的幅位長度。
|
/// - Parameter length: 給定的幅位長度。
|
||||||
/// - Returns: 該操作是否成功執行。
|
/// - Returns: 該操作是否成功執行。
|
||||||
|
@ -51,12 +60,14 @@ extension Megrez.Compositor {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
for i in length ... maxSpanLength {
|
for i in length ... maxSpanLength {
|
||||||
|
guard (0 ..< nodes.count).contains(i - 1) else { continue } // 防呆
|
||||||
nodes[i - 1] = nil
|
nodes[i - 1] = nil
|
||||||
}
|
}
|
||||||
maxLength = 0
|
maxLength = 0
|
||||||
guard length > 1 else { return false }
|
guard length > 1 else { return false }
|
||||||
let maxR = length - 2
|
let maxR = length - 2
|
||||||
for i in 0 ... maxR {
|
for i in 0 ... maxR {
|
||||||
|
guard (0 ..< nodes.count).contains(maxR - i) else { continue } // 防呆
|
||||||
if nodes[maxR - i] == nil { continue }
|
if nodes[maxR - i] == nil { continue }
|
||||||
maxLength = maxR - i + 1
|
maxLength = maxR - i + 1
|
||||||
break
|
break
|
||||||
|
|
|
@ -40,7 +40,10 @@ class SimpleLM: LangModelProtocol {
|
||||||
func trim(key: String, value: String) {
|
func trim(key: String, value: String) {
|
||||||
guard var arr = mutDatabase[key] else { return }
|
guard var arr = mutDatabase[key] else { return }
|
||||||
arr = arr.compactMap { $0.value == value ? nil : $0 }
|
arr = arr.compactMap { $0.value == value ? nil : $0 }
|
||||||
guard !arr.isEmpty else { return }
|
guard !arr.isEmpty else {
|
||||||
|
mutDatabase[key] = nil
|
||||||
|
return
|
||||||
|
}
|
||||||
mutDatabase[key] = arr
|
mutDatabase[key] = arr
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -537,5 +537,13 @@ final class MegrezTests: XCTestCase {
|
||||||
let newResult = compositor.walk().0.values.joined()
|
let newResult = compositor.walk().0.values.joined()
|
||||||
print(newResult)
|
print(newResult)
|
||||||
XCTAssertEqual([oldResult, newResult], ["年中獎金", "年終獎金"])
|
XCTAssertEqual([oldResult, newResult], ["年中獎金", "年終獎金"])
|
||||||
|
compositor.cursor = 4
|
||||||
|
compositor.dropKey(direction: .rear)
|
||||||
|
compositor.dropKey(direction: .rear)
|
||||||
|
theLM.trim(key: "nian2zhong1", value: "年終")
|
||||||
|
compositor.update(updateExisting: true)
|
||||||
|
let newResult2 = compositor.walk().0.values
|
||||||
|
print(newResult2)
|
||||||
|
XCTAssertEqual(newResult2, ["年", "中"])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue