Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion Package.resolved

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 5 additions & 1 deletion Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ let libraryEvolutionCondition = envBoolValue("LIBRARY_EVOLUTION", default: build
let compatibilityTestCondition = envBoolValue("COMPATIBILITY_TEST", default: false)

let gesturesCondition = envBoolValue("OPENGESTURESSHIMS_GESTURES", default: false)
let useLocalDeps = envBoolValue("USE_LOCAL_DEPS")
let useLocalDeps = envBoolValue("USE_LOCAL_DEPS", default: false)

let swiftCorelibsPath = envStringValue("LIB_SWIFT_PATH") ?? "\(Context.packageDirectory)/Sources/SwiftCorelibs/include"

Expand Down Expand Up @@ -225,6 +225,9 @@ let openGesturesShimsTarget = Target.target(

let openGesturesCompatibilityTestsTarget = Target.testTarget(
name: "OpenGesturesCompatibilityTests",
dependencies: [
.product(name: "OpenAttributeGraphShims", package: "OpenAttributeGraph"),
],
swiftSettings: sharedSwiftSettings
)

Expand All @@ -237,6 +240,7 @@ let package = Package(
],
dependencies: [
.package(url: "https://github.com/OpenSwiftUIProject/OpenCoreGraphics.git", branch: "main"),
.package(url: "https://github.com/OpenSwiftUIProject/OpenAttributeGraph.git", branch: "main"),
.package(url: "https://github.com/apple/swift-collections.git", from: "1.1.0"),
],
targets: [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ public final class GestureComponentController<C: GestureComponent>: AnyGestureCo
break
case .value(let value, _):
try node.update(someValue: value, isFinalUpdate: false)
case .final(let value, _):
case .finalValue(let value, _):
try node.update(someValue: value, isFinalUpdate: true)
}
} catch {
Expand Down
161 changes: 161 additions & 0 deletions Sources/OpenGestures/Core/GestureOutput.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
//
// GestureOutput.swift
// OpenGestures
//
// Audited for 9126.1.5
// Status: Complete

// MARK: - GestureOutput

public enum GestureOutput<Value: Sendable>: Sendable {
case empty(GestureOutputEmptyReason, metadata: GestureOutputMetadata?)
case value(Value, metadata: GestureOutputMetadata?)
case finalValue(Value, metadata: GestureOutputMetadata?)
}

extension GestureOutput {
public var value: Value? {
switch self {
case let .value(v, _): v
case let .finalValue(v, _): v
case .empty: nil
}
}

public var isEmpty: Bool {
switch self {
case .empty: true
default: false
}
}

public var isFinal: Bool {
switch self {
case .finalValue: true
default: false
}
}
}

// MARK: - GestureOutput + NestedCustomStringConvertible

extension GestureOutput: NestedCustomStringConvertible {
package func populateNestedDescription(_ nested: inout NestedDescription) {
let metadata: GestureOutputMetadata?
switch self {
case let .empty(reason, m):
nested.append(reason, label: "emptyReason")
metadata = m
case let .value(v, m):
nested.append(v, label: "value")
metadata = m
case let .finalValue(v, m):
nested.append(v, label: "finalValue")
metadata = m
}
if let metadata {
nested.append(metadata, label: "metadata")
}
}
}

// MARK: - GestureOutputEmptyReason

public enum GestureOutputEmptyReason: Hashable, Sendable {
case noData
case filtered
case timeUpdate
}

// MARK: - GestureOutputMetadata

public struct GestureOutputMetadata: Sendable {
package var updatesToSchedule: [UpdateRequest]
package var updatesToCancel: [UpdateRequest]
package var traceAnnotation: UpdateTraceAnnotation?

package init(
updatesToSchedule: [UpdateRequest] = [],
updatesToCancel: [UpdateRequest] = [],
traceAnnotation: UpdateTraceAnnotation? = nil
) {
self.updatesToSchedule = updatesToSchedule
self.updatesToCancel = updatesToCancel
self.traceAnnotation = traceAnnotation
}
}

// MARK: - GestureOutputMetadata + NestedCustomStringConvertible

extension GestureOutputMetadata: NestedCustomStringConvertible {
package func populateNestedDescription(_ nested: inout NestedDescription) {
nested.options.formUnion([.hideTypeName, .compact])
nested.customPrefix = ""
nested.customSuffix = ""
if !updatesToSchedule.isEmpty {
nested.append("\(updatesToSchedule)", label: "updatesToSchedule")
}
if !updatesToCancel.isEmpty {
nested.append("\(updatesToCancel)", label: "updatesToCancel")
}
if let traceAnnotation {
nested.append(traceAnnotation.value, label: "traceAnnotation")
}
}
}

// MARK: - UpdateTraceAnnotation

package struct UpdateTraceAnnotation: Sendable {
public var value: String

public init(value: String) {
self.value = value
}
}

// MARK: - GestureOutputStatusCombiner

package struct GestureOutputStatusCombiner: Sendable {
package var combine: @Sendable ([GestureOutputStatus]) throws -> GestureOutputStatus

package init(combine: @escaping @Sendable ([GestureOutputStatus]) throws -> GestureOutputStatus) {
self.combine = combine
}
}

// MARK: - GestureOutputStatus

package enum GestureOutputStatus: Hashable, Sendable {
case empty
case value
case finalValue
}

// MARK: - GestureOutputArrayCombiner

package struct GestureOutputArrayCombiner<A: Sendable>: Sendable {
package let statusCombiner: GestureOutputStatusCombiner

package init(statusCombiner: GestureOutputStatusCombiner) {
self.statusCombiner = statusCombiner
}
}

// MARK: - GestureOutputCombiner

package struct GestureOutputCombiner<each A: Sendable, B: Sendable>: Sendable {
package let combineValues: (@Sendable (repeat each A) throws -> B)?
package let combineOptionals: (@Sendable (repeat (each A)?) throws -> B)?
package let statusCombiner: GestureOutputStatusCombiner

package init(
combineValues: (@Sendable (repeat each A) throws -> B)?,
combineOptionals: (@Sendable (repeat (each A)?) throws -> B)?,
statusCombiner: GestureOutputStatusCombiner
) {
self.combineValues = combineValues
self.combineOptionals = combineOptionals
self.statusCombiner = statusCombiner
}
}
Loading
Loading