Megrez // 2.5.2 update, adding [Node].smashedPairs(), etc.

- Also consolidating certain methods.
This commit is contained in:
ShikiSuen 2022-12-15 15:16:31 +08:00
parent c13d223bb2
commit b75ab569b7
3 changed files with 40 additions and 36 deletions

View File

@ -59,9 +59,6 @@ extension Megrez {
didSet { clear() } didSet { clear() }
} }
/// 0
public private(set) var cursorRegionMap: [Int: Int] = .init()
/// ///
/// - Parameter langModel: /// - Parameter langModel:
public init(with langModel: LangModelProtocol, separator: String = "-") { public init(with langModel: LangModelProtocol, separator: String = "-") {
@ -79,7 +76,6 @@ extension Megrez {
keys.removeAll() keys.removeAll()
spans.removeAll() spans.removeAll()
walkedNodes.removeAll() walkedNodes.removeAll()
cursorRegionMap.removeAll()
} }
/// ///
@ -138,7 +134,7 @@ extension Megrez {
case .rear: case .rear:
if target == 0 { return false } if target == 0 { return false }
} }
guard let currentRegion = cursorRegionMap[target] else { return false } guard let currentRegion = walkedNodes.cursorRegionMap[target] else { return false }
let aRegionForward = max(currentRegion - 1, 0) let aRegionForward = max(currentRegion - 1, 0)
let currentRegionBorderRear: Int = walkedNodes[0..<currentRegion].map(\.spanLength).reduce(0, +) let currentRegionBorderRear: Int = walkedNodes[0..<currentRegion].map(\.spanLength).reduce(0, +)
@ -312,19 +308,4 @@ extension Megrez.Compositor {
} }
return nodesChanged return nodesChanged
} }
///
mutating func updateCursorJumpingTables() {
var cursorRegionMapDict = [Int: Int]()
cursorRegionMapDict[-1] = 0 //
var counter = 0
for (i, theNode) in walkedNodes.enumerated() {
for _ in 0..<theNode.spanLength {
cursorRegionMapDict[counter] = i
counter += 1
}
}
cursorRegionMapDict[counter] = walkedNodes.count
cursorRegionMap = cursorRegionMapDict
}
} }

View File

@ -15,10 +15,7 @@ extension Megrez.Compositor {
/// - Returns: /// - Returns:
@discardableResult public mutating func walk() -> (walkedNode: [Node], succeeded: Bool) { @discardableResult public mutating func walk() -> (walkedNode: [Node], succeeded: Bool) {
var result = [Node]() var result = [Node]()
defer { defer { walkedNodes = result }
walkedNodes = result
updateCursorJumpingTables()
}
guard !spans.isEmpty else { return (result, true) } guard !spans.isEmpty else { return (result, true) }
var vertexSpans = [[Vertex]]() var vertexSpans = [[Vertex]]()

View File

@ -3,6 +3,8 @@
// ==================== // ====================
// This code is released under the MIT license (SPDX-License-Identifier: MIT) // This code is released under the MIT license (SPDX-License-Identifier: MIT)
import Foundation
extension Megrez.Compositor { extension Megrez.Compositor {
/// ///
/// ///
@ -197,23 +199,26 @@ extension Array where Element == Megrez.Compositor.Node {
/// (Result A, Result B) /// (Result A, Result B)
/// Result A Result B /// Result A Result B
public var nodeBorderPointDictPair: ([Int: Int], [Int: Int]) { private var nodeBorderPointDictPair: (regionCursorMap: [Int: Int], cursorRegionMap: [Int: Int]) {
// Result A Result B // Result A Result B
var resultA = [Int: Int]() var resultA = [Int: Int]()
var resultB = [Int: Int]() var resultB: [Int: Int] = [-1: 0] //
var i = 0 var cursorCounter = 0
for (j, neta) in enumerated() { for (nodeCounter, neta) in enumerated() {
resultA[j] = i resultA[nodeCounter] = cursorCounter
neta.keyArray.forEach { _ in neta.keyArray.forEach { _ in
resultB[i] = j resultB[cursorCounter] = nodeCounter
i += 1 cursorCounter += 1
} }
} }
resultA[resultA.count] = i resultA[count] = cursorCounter
resultB[i] = resultB.count resultB[cursorCounter] = count
return (resultA, resultB) return (resultA, resultB)
} }
/// 0
public var cursorRegionMap: [Int: Int] { nodeBorderPointDictPair.cursorRegionMap }
/// ///
public var totalKeyCount: Int { map(\.keyArray.count).reduce(0, +) } public var totalKeyCount: Int { map(\.keyArray.count).reduce(0, +) }
@ -227,9 +232,9 @@ extension Array where Element == Megrez.Compositor.Node {
let cursor = Swift.max(0, cursor) // let cursor = Swift.max(0, cursor) //
nilReturn = cursor..<cursor nilReturn = cursor..<cursor
// nilReturn // nilReturn
guard let rearNodeID = nodeBorderPointDictPair.1[cursor] else { return nilReturn } guard let rearNodeID = nodeBorderPointDictPair.cursorRegionMap[cursor] else { return nilReturn }
guard let rearIndex = nodeBorderPointDictPair.0[rearNodeID] else { return nilReturn } guard let rearIndex = nodeBorderPointDictPair.regionCursorMap[rearNodeID] else { return nilReturn }
guard let frontIndex = nodeBorderPointDictPair.0[rearNodeID + 1] else { return nilReturn } guard let frontIndex = nodeBorderPointDictPair.regionCursorMap[rearNodeID + 1] else { return nilReturn }
return rearIndex..<frontIndex return rearIndex..<frontIndex
} }
@ -254,4 +259,25 @@ extension Array where Element == Megrez.Compositor.Node {
var useless = 0 var useless = 0
return findNode(at: cursor, target: &useless) return findNode(at: cursor, target: &useless)
} }
/// 使 Megrez KeyValuePaired
public var smashedPairs: [(key: String, value: String)] {
var arrData = [(key: String, value: String)]()
let separator = Megrez.Compositor.theSeparator
forEach { node in
if node.isReadingMismatched {
var newKey = node.joinedKey()
if !separator.isEmpty, newKey != separator, newKey.contains(separator) {
newKey = newKey.replacingOccurrences(of: separator, with: "\t")
}
arrData.append((key: newKey, value: node.value))
return
}
let arrValueChars = node.value.map(\.description)
node.keyArray.enumerated().forEach { i, key in
arrData.append((key: key, value: arrValueChars[i]))
}
}
return arrData
}
} }