File: ChildIndexPath.swift

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (63 lines) | stat: -rw-r--r-- 2,160 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
/*
 This source file is part of the Swift.org open source project

 Copyright (c) 2021 Apple Inc. and the Swift project authors
 Licensed under Apache License v2.0 with Runtime Library Exception

 See https://swift.org/LICENSE.txt for license information
 See https://swift.org/CONTRIBUTORS.txt for Swift project authors
*/

/// An array of indexes for traversing deeply into a markup tree.
public typealias ChildIndexPath = [Int]

/// A description of a traversal through a markup tree by index and optional expected type.
public struct TypedChildIndexPath: RandomAccessCollection, ExpressibleByArrayLiteral {
    /// A pair consisting of an expected index and optional expected type for a child element.
    ///
    /// This type is a shorthand convenience when creating a ``TypedChildIndexPath`` from an array literal.
    public typealias ArrayLiteralElement = (Int, Markup.Type?)

    /// An element of a complex child index path.
    public struct Element {
        /// The index to use when descending into the children.
        var index: Int

        /**
         The expected type of the child at ``index``.

         Use this to restrict the type of node to enter at this point in the traversal. If the child doesn't match this type, the traversal will fail. To allow any type of child markup type, set this to `nil`.
         */
        var expectedType: Markup.Type?
    }

    /// The elements of the path.
    private var elements: [Element]

    /// Create an empty path.
    public init() {
        elements = []
    }

    /// Create a path from a sequence of index-type pairs.
    public init<S: Sequence>(_ elements: S) where S.Element == Element {
        self.elements = Array(elements)
    }

    /// Create a path from a sequence of index-type pairs.
    public init(arrayLiteral elements: ArrayLiteralElement...) {
        self.elements = elements.map { Element(index: $0.0, expectedType: $0.1) }
    }

    public var startIndex: Int {
        return elements.startIndex
    }

    public var endIndex: Int {
        return elements.endIndex
    }

    public subscript(index: Int) -> Element {
        return elements[index]
    }
}