File: issue-55258.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 (91 lines) | stat: -rw-r--r-- 3,070 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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
// RUN: %target-typecheck-verify-swift
// RUN: %target-swift-frontend -debug-generic-signatures -emit-ir %s 2>&1 | %FileCheck %s

// https://github.com/apple/swift/issues/55258

public protocol DefaultInitializable {
  init()
}

public protocol AdjacencyEdge_ {
  associatedtype VertexID: Equatable
  associatedtype Properties

  var destination: VertexID { get set }
  var properties: Properties { get set }
}

public struct AdjacencyEdge<VertexID: Equatable, Properties>: AdjacencyEdge_ {
  public var destination: VertexID
  public var properties: Properties
}

public protocol AdjacencyVertex_ {
  associatedtype Edges: Collection where Edges.Element: AdjacencyEdge_
  associatedtype Properties

  var edges: Edges { get set }
  var properties: Properties { get set }
}

public struct AdjacencyVertex<Edges: Collection, Properties> : AdjacencyVertex_
  where Edges.Element: AdjacencyEdge_
{
  public var edges: Edges
  public var properties: Properties
}

public protocol BinaryFunction {
  associatedtype Parameter0
  associatedtype Parameter1
  associatedtype Result

  func callAsFunction(_: Parameter0, _: Parameter1) -> Result
}

public struct GeneralAdjacencyList<
  Spine: Collection, VertexIDToIndex: BinaryFunction
>
  where Spine.Element : AdjacencyVertex_,
        VertexIDToIndex.Parameter0 == Spine,
        VertexIDToIndex.Parameter1 == Spine.Element.Edges.Element.VertexID,
        VertexIDToIndex.Result == Spine.Index
{
  public let vertexIDToIndex: VertexIDToIndex
  public var spine: Spine
}

public struct IdentityVertexIDToIndex<Spine: Collection>: BinaryFunction
  where Spine.Element : AdjacencyVertex_,
        Spine.Element.Edges.Element.VertexID == Spine.Index
{
  public func callAsFunction(_: Spine, _ id: Spine.Index) -> Spine.Index {
    return id
  }
}

public extension GeneralAdjacencyList {
  typealias VertexID = VertexIDToIndex.Parameter1
  typealias VertexProperties = Spine.Element.Properties
  typealias EdgeProperties = Spine.Element.Edges.Element.Properties

  struct EdgeID: Equatable {
    /// The source vertex.
    let source: VertexIDToIndex.Parameter1
    /// The position of the edge in `source`'s list of edges.
    let targetIndex: Spine.Index
  }
}

// CHECK-LABEL: Generic signature: <Spine, VertexIDToIndex where Spine : RangeReplaceableCollection, VertexIDToIndex == IdentityVertexIDToIndex<Spine>, Spine.[Sequence]Element : AdjacencyVertex_, Spine.[Collection]Index == Spine.[Sequence]Element.[AdjacencyVertex_]Edges.[Sequence]Element.[AdjacencyEdge_]VertexID, Spine.[Sequence]Element.[AdjacencyVertex_]Edges : BidirectionalCollection, Spine.[Sequence]Element.[AdjacencyVertex_]Edges : RangeReplaceableCollection>
public extension GeneralAdjacencyList
  where VertexIDToIndex == IdentityVertexIDToIndex<Spine>,
        Spine: RangeReplaceableCollection,
        Spine.Element.Edges: RangeReplaceableCollection
          & BidirectionalCollection // Because https://github.com/apple/swift/issues/55257
{
  func addVertex(storing properties: VertexProperties) -> VertexID {
    return spine.indices.first!
  }
}