Files
divkit/client/ios/DivKit/Variables/DivVariableTracker.swift
denlvovich e001d74afe Update to VGSL6.0
4f8b5f480ade3f347d5f0a2d01a1618069bcb846
2024-07-12 20:33:42 +03:00

42 lines
1.2 KiB
Swift

import Foundation
import VGSL
/// `DivVariableTracker` provides sets of variables used in a last `Block` modeling for a `DivCard`.
public final class DivVariableTracker {
private var usedVariables = Atomic<[DivViewId: Set<DivVariableName>]>(initialValue: [:])
/// Sets of variables used in a last `Block` modeling for a `DivCard`.
public var usedVariablesByCard: [DivCardID: Set<DivVariableName>] {
usedVariables.accessRead { value in
value.map(key: { $0.cardId }, value: { $0 })
}
}
init() {}
func onModelingStarted(id: DivViewId) {
usedVariables.accessWrite { value in
value[id] = []
}
}
func onVariableUsed(id: DivViewId, variable: DivVariableName) {
usedVariables.accessWrite { value in
value[id] = (value[id] ?? []).union([variable])
}
}
func getAffectedCards(variables: Set<DivVariableName>) -> [DivCardID: Set<DivVariableName>] {
var affectedCards = [DivCardID: Set<DivVariableName>]()
usedVariables.accessRead { value in
for (id, usedVariables) in value {
let intersection = usedVariables.intersection(variables)
if !intersection.isEmpty {
affectedCards[id.cardId] = intersection
}
}
}
return affectedCards
}
}