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() }
}
/// 0
public private(set) var cursorRegionMap: [Int: Int] = .init()
///
/// - Parameter langModel:
public init(with langModel: LangModelProtocol, separator: String = "-") {
@ -79,7 +76,6 @@ extension Megrez {
keys.removeAll()
spans.removeAll()
walkedNodes.removeAll()
cursorRegionMap.removeAll()
}
///
@ -138,7 +134,7 @@ extension Megrez {
case .rear:
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 currentRegionBorderRear: Int = walkedNodes[0..<currentRegion].map(\.spanLength).reduce(0, +)
@ -312,19 +308,4 @@ extension Megrez.Compositor {
}
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:
@discardableResult public mutating func walk() -> (walkedNode: [Node], succeeded: Bool) {
var result = [Node]()
defer {
walkedNodes = result
updateCursorJumpingTables()
}
defer { walkedNodes = result }
guard !spans.isEmpty else { return (result, true) }
var vertexSpans = [[Vertex]]()

View File

@ -3,6 +3,8 @@
// ====================
// This code is released under the MIT license (SPDX-License-Identifier: MIT)
import Foundation
extension Megrez.Compositor {
///
///
@ -197,23 +199,26 @@ extension Array where Element == Megrez.Compositor.Node {
/// (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
var resultA = [Int: Int]()
var resultB = [Int: Int]()
var i = 0
for (j, neta) in enumerated() {
resultA[j] = i
var resultB: [Int: Int] = [-1: 0] //
var cursorCounter = 0
for (nodeCounter, neta) in enumerated() {
resultA[nodeCounter] = cursorCounter
neta.keyArray.forEach { _ in
resultB[i] = j
i += 1
resultB[cursorCounter] = nodeCounter
cursorCounter += 1
}
}
resultA[resultA.count] = i
resultB[i] = resultB.count
resultA[count] = cursorCounter
resultB[cursorCounter] = count
return (resultA, resultB)
}
/// 0
public var cursorRegionMap: [Int: Int] { nodeBorderPointDictPair.cursorRegionMap }
///
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) //
nilReturn = cursor..<cursor
// nilReturn
guard let rearNodeID = nodeBorderPointDictPair.1[cursor] else { return nilReturn }
guard let rearIndex = nodeBorderPointDictPair.0[rearNodeID] else { return nilReturn }
guard let frontIndex = nodeBorderPointDictPair.0[rearNodeID + 1] else { return nilReturn }
guard let rearNodeID = nodeBorderPointDictPair.cursorRegionMap[cursor] else { return nilReturn }
guard let rearIndex = nodeBorderPointDictPair.regionCursorMap[rearNodeID] else { return nilReturn }
guard let frontIndex = nodeBorderPointDictPair.regionCursorMap[rearNodeID + 1] else { return nilReturn }
return rearIndex..<frontIndex
}
@ -254,4 +259,25 @@ extension Array where Element == Megrez.Compositor.Node {
var useless = 0
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
}
}