diff --git a/Sources/OpenSwiftUICore/Event/Gesture/ResettableGestureRule.swift b/Sources/OpenSwiftUICore/Event/Gesture/ResettableGestureRule.swift new file mode 100644 index 000000000..43e69793a --- /dev/null +++ b/Sources/OpenSwiftUICore/Event/Gesture/ResettableGestureRule.swift @@ -0,0 +1,41 @@ +// +// ResettableGestureRule.swift +// OpenSwiftUICore +// +// Status: Complete + +package import OpenGraphShims + +// MARK: - ResettableGestureRule [6.5.4] + +package protocol ResettableGestureRule: StatefulRule { + associatedtype PhaseValue = Void + var phaseValue: GesturePhase { get } + var resetSeed: UInt32 { get } + var lastResetSeed: UInt32 { get set } + mutating func resetPhase() +} + +extension ResettableGestureRule { + package mutating func resetPhase() {} + + package mutating func resetIfNeeded() -> Bool { + defer { lastResetSeed = resetSeed } + guard lastResetSeed == resetSeed else { + resetPhase() + return true + } + guard hasValue else { + return true + } + return !phaseValue.isTerminal + } +} + +extension ResettableGestureRule where Value == GesturePhase { + package var phaseValue: GesturePhase { value } +} + +extension ResettableGestureRule where PhaseValue == Value.PhaseValue, Value: DebuggableGesturePhase { + package var phaseValue: GesturePhase { value.phase } +}