import Foundation import UIKit public final class RichTextView: UIView { public final class Params: Equatable { let string: NSAttributedString let constrainedSize: CGSize public init( string: NSAttributedString, constrainedSize: CGSize ) { self.string = string self.constrainedSize = constrainedSize } public static func ==(lhs: Params, rhs: Params) -> Bool { if !lhs.string.isEqual(to: rhs.string) { return false } if lhs.constrainedSize != rhs.constrainedSize { return false } return true } } public final class LayoutData: Equatable { init() { } public static func ==(lhs: LayoutData, rhs: LayoutData) -> Bool { return true } } public final class AsyncResult { public let view: () -> RichTextView public let layoutData: LayoutData init(view: @escaping () -> RichTextView, layoutData: LayoutData) { self.view = view self.layoutData = layoutData } } private static func performLayout(params: Params) -> LayoutData { return LayoutData() } public static func updateAsync(_ view: RichTextView?) -> (Params) -> AsyncResult { return { params in let layoutData = performLayout(params: params) return AsyncResult( view: { let view = view ?? RichTextView(frame: CGRect()) view.layoutData = layoutData return view }, layoutData: layoutData ) } } private var layoutData: LayoutData? override public init(frame: CGRect) { super.init(frame: frame) } required public init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } override public func draw(_ rect: CGRect) { guard let layoutData = self.layoutData else { return } let _ = layoutData } }