// // Handlerable.swift // VDS // // Created by Matt Bruce on 7/22/22. // import Foundation import Combine import UIKit public enum HandlerableUpdateStrategy { case immediate case delayed case alwaysImmediate } public protocol Handlerable: AnyObject, Initable, Disabling, Surfaceable { var subject: PassthroughSubject { get set } var subscribers: Set { get set } var updateStrategy: HandlerableUpdateStrategy { get set } func updateView() } extension Handlerable { public func setupNeedsUpdateEvent() { subject .debounce(for: .seconds(0), scheduler: RunLoop.main) .sink { [weak self] _ in self?.updateView() }.store(in: &subscribers) } public func setNeedsUpdate() { switch updateStrategy { case .delayed: subject.send() case .immediate, .alwaysImmediate: updateView() } } public func updateIfNeeded(_ oldValue: T, _ newValue: T) { if oldValue != newValue { setNeedsUpdate() } } } extension Handlerable where Self: UIControl { public func addEvent(event: UIControl.Event, block: @escaping (Self)->()) { publisher(for: event) .sink(receiveValue: { c in block(c) }).store(in: &subscribers) } }