File: basic.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 (93 lines) | stat: -rw-r--r-- 2,449 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
import llbuild

typealias Compute = ([Int]) -> Int

class SimpleTask: Task {
  let inputs: [Key]
  var values: [Int]
  let compute: Compute
	
  init(_ inputs: [Key], compute: @escaping Compute) {
    self.inputs = inputs
    values = [Int](repeating: 0, count: inputs.count)
    self.compute = compute
  }
	
  func start(_ engine: TaskBuildEngine) {
    for (idx, input) in inputs.enumerated() {
      engine.taskNeedsInput(input, inputID: idx)
    }
  }
  
  func provideValue(_ engine: TaskBuildEngine, inputID: Int, value: Value) {
    values[inputID] = Int(value.toString())!
  }
  
  func inputsAvailable(_ engine: TaskBuildEngine) {
    let result = compute(values)
    engine.taskIsComplete(Value("\(result)"), forceChange: false)
  }
}

class SimpleBuildEngineDelegate: BuildEngineDelegate {
  var builtKeys = [Key]()
	
  func lookupRule(_ key: Key) -> Rule {
    switch key.toString() {
    case "A":
      return SimpleRule([]) { arr in
        precondition(self.builtKeys.isEmpty)
        self.builtKeys.append(key)
        return 2
      }
    case "B":
      return SimpleRule([]) { arr in
        precondition(self.builtKeys.count == 1)
        self.builtKeys.append(key)
        return 3
      }
    case "C":
      return SimpleRule([Key("A"), Key("B")]) { arr in 
        precondition(self.builtKeys.count == 2)
        precondition(self.builtKeys[0].toString() == "A")
        precondition(self.builtKeys[1].toString() == "B")
        self.builtKeys.append(key)
        return arr[0] * arr[1]
      }
      default: fatalError("Unexpected key \(key) lookup")
    }
  }
}

class SimpleRule: Rule {
  let inputs: [Key]
  let compute: Compute
  init(_ inputs: [Key], compute: @escaping Compute) { 
    self.inputs = inputs 
    self.compute = compute
  } 
  func createTask() -> Task {
    return SimpleTask(inputs, compute: compute)
  }
}

let delegate = SimpleBuildEngineDelegate()
var engine = BuildEngine(delegate: delegate)

// C depends on A and B
var result = engine.build(key: Key("C"))
print("\(result.toString())")

precondition(result.toString() == "6")

// Make sure building already built keys do not re-compute.
delegate.builtKeys.removeAll()
precondition(delegate.builtKeys.isEmpty)

result = engine.build(key: Key("A"))
precondition(result.toString() == "2")
precondition(delegate.builtKeys.isEmpty)

result = engine.build(key: Key("B"))
precondition(result.toString() == "3")
precondition(delegate.builtKeys.isEmpty)