CandidateNode // Subclass: ServiceMenuNode.

This commit is contained in:
ShikiSuen 2024-02-28 16:25:57 +08:00
parent 040c597345
commit dc79c629a1
3 changed files with 63 additions and 1 deletions

View File

@ -8,7 +8,7 @@
import Foundation import Foundation
public class CandidateNode { open class CandidateNode {
public var name: String public var name: String
public var members: [CandidateNode] public var members: [CandidateNode]
public var previous: CandidateNode? public var previous: CandidateNode?

View File

@ -0,0 +1,49 @@
// (c) 2021 and onwards The vChewing Project (MIT-NTL License).
// ====================
// This code is released under the MIT license (SPDX-License-Identifier: MIT)
// ... with NTL restriction stating that:
// No trademark license is granted to use the trade names, trademarks, service
// marks, or product names of Contributor, except as required to fulfill notice
// requirements defined in MIT License.
import Foundation
public extension CandidateNode {
convenience init(
name: String, services: [CandidateTextService], previous: CandidateNode? = nil
) {
self.init(name: name, members: services.map(\.asCandidateNode), previous: previous)
}
var asServiceMenuNode: ServiceMenuNode? {
self as? ServiceMenuNode
}
var containsCandidateServices: Bool {
!members.compactMap(\.asServiceMenuNode).isEmpty
}
class ServiceMenuNode: CandidateNode {
public var service: CandidateTextService
public init(
name: String, service givenService: CandidateTextService, previous: CandidateNode? = nil
) {
service = givenService
super.init(name: name, previous: previous)
}
}
}
public extension CandidateTextService {
var asCandidateNode: CandidateNode.ServiceMenuNode {
.init(name: menuTitle, service: self)
}
static func getCurrentServiceMenu(
fromMap map: [String]? = nil, candidate: String, reading: [String]
) -> CandidateNode? {
let fetchedRaw = map ?? PrefMgr().candidateServiceMenuContents
let fetched = fetchedRaw.parseIntoCandidateTextServiceStack(candidate: candidate, reading: reading)
return fetched.isEmpty ? nil : .init(name: candidate, services: fetched)
}
}

View File

@ -32,4 +32,17 @@ final class SharedTests: XCTestCase {
} }
XCTAssertEqual(stacked.rawRepresentation, Self.testDataMap) XCTAssertEqual(stacked.rawRepresentation, Self.testDataMap)
} }
func testCandidateServiceMenuNode() throws {
let rootNode = CandidateTextService.getCurrentServiceMenu(
fromMap: Self.testDataMap,
candidate: "🍰", reading: ["ㄉㄢˋ", "ㄍㄠ"]
)
guard let rootNode = rootNode else {
XCTAssertThrowsError("Root Node Construction Failed.")
return
}
print(rootNode.members.map(\.name))
print(rootNode.members.compactMap(\.asServiceMenuNode?.service))
}
} }