File: keypath_bidirectional_inference.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 (110 lines) | stat: -rw-r--r-- 2,434 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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
// RUN: %target-typecheck-verify-swift -target %target-cpu-apple-macosx10.15 -solver-expression-time-threshold=1 -swift-version 5

// REQUIRES: OS=macosx

import Combine

enum Status {
  case up
  case down
}

protocol StatusMonitor {
  var statusPublisher: AnyPublisher<Status, Never> { get }
}

protocol UIController {}
protocol ControllerProtocol {}

class TestViewController : UIController, ControllerProtocol {
}

class OtherController {
  var innerController: (any UIController & ControllerProtocol)? = nil
}

class Test1 {
  var monitor: StatusMonitor

  var subscriptions: [AnyCancellable] = []
  var status: Status? = nil
  var statuses: [Status]? = nil

  init(monitor: StatusMonitor) {
    self.monitor = monitor
  }

  func simpleMapTest() {
    monitor.statusPublisher
           .map { $0 }
           .assign(to: \.status, on: self) // Ok
           .store(in: &subscriptions)
  }

  func transformationTest() {
    monitor.statusPublisher
           .map { _ in (0...1).map { _ in .up } }
           .assign(to: \.statuses, on: self) // Ok
           .store(in: &subscriptions)
  }
}

class FilteringTest {
  @Published var flag = false

  func test(viewController: inout OtherController) {
    _ = $flag.filter { !$0 }
             .map { _ in TestViewController() }
             .first()
             .handleEvents(receiveOutput: { _ in
               print("event")
             })
             .assign(to: \.innerController, on: viewController) // Ok
  }
}

extension Sequence {
  func sorted<T: Comparable>(by keyPath: KeyPath<Element, T>) -> [Element] {
    []
  }
}

func testCollectionUpcastWithTupleLabelErasure() {
  struct Item {}

  enum Info : Int, Hashable {
    case one = 1
  }


  func test(data: [Info: [Item]]) -> [(Info, [Item])] {
    data.map { $0 }
        .sorted(by: \.key.rawValue) // Ok
  }
}

do {
  struct URL {
    var path: String
    func appendingPathComponent(_: String) -> URL { fatalError() }
  }

  struct EntryPoint {
    var directory: URL { fatalError() }
  }

  func test(entryPoint: EntryPoint, data: [[String]]) {
    let _ = data.map { suffixes in
      let elements = ["a", "b"]
      .flatMap { dir in
        let directory = entryPoint.directory.appendingPathComponent(dir)
        return suffixes.map { suffix in
          directory.appendingPathComponent("\(suffix)")
        }
      }
      .map(\.path) // Ok

      return elements.joined(separator: ",")
    }
  }
}