// SPDX-FileCopyrightText: 2025 The Project Pterodactyl Developers // // SPDX-License-Identifier: MPL-2.0 import Foundation import LanguageServerProtocol extension SyntaxTree { public final class Cursor { public let lineMap: LineMap public let node: SyntaxTree.Child public let utf16Offset: Int public private(set) lazy var children: [Cursor] = { var children: [Cursor] = [] var utf16Offset = utf16Offset for childNode in node.children { children.append(Self(lineMap: lineMap, node: childNode, utf16Offset: utf16Offset)) utf16Offset += childNode.utf16Length } return children }() public var utf16Range: Range { utf16Offset..(mapping: (SyntaxTree.Cursor) -> T?) -> T? { for child in children { if let result = mapping(child) { return result } else { continue } } return nil } public func children(mapping: (SyntaxTree.Cursor) -> T?) -> [T] { children.compactMap(mapping) } }