// // UIGestureRecognizer.swift // VDS // // Created by Matt Bruce on 8/31/22. // import Foundation import UIKit import Combine extension UIView { public func publisher(for gestureRecognizer: G) -> UIGestureRecognizer.Publisher where G: UIGestureRecognizer { UIGestureRecognizer.Publisher(gestureRecognizer: gestureRecognizer, view: self) } } extension UIGestureRecognizer { public struct Publisher: Combine.Publisher where G: UIGestureRecognizer { public typealias Output = G public typealias Failure = Never public let gestureRecognizer: G public let view: UIView public func receive(subscriber: S) where S : Subscriber, Failure == S.Failure, Output == S.Input { subscriber.receive( subscription: Subscription(subscriber: subscriber, gestureRecognizer: gestureRecognizer, on: view) ) } } public class Subscription: Combine.Subscription where S.Input == G, S.Failure == Never { public var subscriber: S? public let gestureRecognizer: G public let view: UIView public init(subscriber: S, gestureRecognizer: G, on view: UIView) { self.subscriber = subscriber self.gestureRecognizer = gestureRecognizer self.view = view gestureRecognizer.addTarget(self, action: #selector(gestureHandler)) view.addGestureRecognizer(gestureRecognizer) } @objc private func gestureHandler(_ gesture: UIGestureRecognizer) { _ = subscriber?.receive(gestureRecognizer) } public func cancel() { view.removeGestureRecognizer(gestureRecognizer) } public func request(_ demand: Subscribers.Demand) { } } }