Skip to content

Commit

Permalink
simplify type definition and make separator type concrete
Browse files Browse the repository at this point in the history
  • Loading branch information
lkzhao committed Feb 8, 2022
1 parent 1f0690b commit b173b82
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 27 deletions.
2 changes: 1 addition & 1 deletion Sources/UIComponent/Components/View/Separator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public struct Separator: ViewComponentBuilder {
self.color = color
}

public func build() -> some ViewComponent {
public func build() -> ConstraintOverrideViewComponent<ViewKeyPathUpdateComponent<SimpleViewComponent<UIView>, UIColor?>> {
SimpleViewComponent<UIView>().backgroundColor(color)
.constraint { constraint in
if constraint.minSize.height <= 0, constraint.maxSize.width != .infinity {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import UIKit

public struct ViewModifierComponent<View, Content: ViewComponent, Result: ViewRenderNode>: ViewComponent where Content.R.View == View, Result.View == View {
public struct ViewModifierComponent<Content: ViewComponent, Result: ViewRenderNode>: ViewComponent where Content.R.View == Result.View {
let content: Content
let modifier: (Content.R) -> Result

Expand All @@ -11,19 +11,19 @@ public struct ViewModifierComponent<View, Content: ViewComponent, Result: ViewRe
}
}

public typealias ViewUpdateComponent<Content: ViewComponent> = ViewModifierComponent<Content.R.View, Content, ViewUpdateRenderNode<Content.R.View, Content.R>>
public typealias ViewUpdateComponent<Content: ViewComponent> = ViewModifierComponent<Content, ViewUpdateRenderNode<Content.R>>

public typealias ViewKeyPathUpdateComponent<Content: ViewComponent, Value> = ViewModifierComponent<
Content.R.View, Content, ViewKeyPathUpdateRenderNode<Content.R.View, Value, Content.R>
Content, ViewKeyPathUpdateRenderNode<Value, Content.R>
>

public typealias ViewIDComponent<Content: ViewComponent> = ViewModifierComponent<Content.R.View, Content, ViewIDRenderNode<Content.R.View, Content.R>>
public typealias ViewIDComponent<Content: ViewComponent> = ViewModifierComponent<Content, ViewIDRenderNode<Content.R>>

public typealias ViewAnimatorComponent<Content: ViewComponent> = ViewModifierComponent<Content.R.View, Content, ViewAnimatorRenderNode<Content.R.View, Content.R>>
public typealias ViewAnimatorComponent<Content: ViewComponent> = ViewModifierComponent<Content, ViewAnimatorRenderNode<Content.R>>

public typealias ViewAnimatorWrapperComponent<Content: ViewComponent> = ViewModifierComponent<Content.R.View, Content, ViewAnimatorWrapperRenderNode<Content.R.View, Content.R>>
public typealias ViewAnimatorWrapperComponent<Content: ViewComponent> = ViewModifierComponent<Content, ViewAnimatorWrapperRenderNode<Content.R>>

public typealias ViewReuseStrategyComponent<Content: ViewComponent> = ViewModifierComponent<Content.R.View, Content, ViewReuseStrategyRenderNode<Content.R.View, Content.R>>
public typealias ViewReuseStrategyComponent<Content: ViewComponent> = ViewModifierComponent<Content, ViewReuseStrategyRenderNode<Content.R>>

extension ViewComponent {
public subscript<Value>(dynamicMember keyPath: ReferenceWritableKeyPath<R.View, Value>) -> (Value) -> ViewKeyPathUpdateComponent<Self, Value> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,64 +28,64 @@ extension ViewRenderNodeWrapper {
}
}

public struct ViewUpdateRenderNode<View, Content: ViewRenderNode>: ViewRenderNodeWrapper where Content.View == View {
public struct ViewUpdateRenderNode<Content: ViewRenderNode>: ViewRenderNodeWrapper {
public let content: Content
public let update: (View) -> Void
public let update: (Content.View) -> Void

public func updateView(_ view: View) {
public func updateView(_ view: Content.View) {
content.updateView(view)
update(view)
}
}

public struct ViewKeyPathUpdateRenderNode<View, Value, Content: ViewRenderNode>: ViewRenderNodeWrapper where Content.View == View {
public struct ViewKeyPathUpdateRenderNode<Value, Content: ViewRenderNode>: ViewRenderNodeWrapper {
public let content: Content
public let valueKeyPath: ReferenceWritableKeyPath<View, Value>
public let valueKeyPath: ReferenceWritableKeyPath<Content.View, Value>
public let value: Value

public func updateView(_ view: View) {
public func updateView(_ view: Content.View) {
content.updateView(view)
view[keyPath: valueKeyPath] = value
}
}

public struct ViewIDRenderNode<View, Content: ViewRenderNode>: ViewRenderNodeWrapper where Content.View == View {
public struct ViewIDRenderNode<Content: ViewRenderNode>: ViewRenderNodeWrapper {
public let content: Content
public let id: String?
}

public struct ViewAnimatorRenderNode<View, Content: ViewRenderNode>: ViewRenderNodeWrapper where Content.View == View {
public struct ViewAnimatorRenderNode<Content: ViewRenderNode>: ViewRenderNodeWrapper {
public let content: Content
public let animator: Animator?
}

public struct ViewReuseStrategyRenderNode<View, Content: ViewRenderNode>: ViewRenderNodeWrapper where Content.View == View {
public struct ViewReuseStrategyRenderNode<Content: ViewRenderNode>: ViewRenderNodeWrapper {
public let content: Content
public let reuseStrategy: ReuseStrategy
}

extension ViewRenderNode {
subscript<Value>(dynamicMember keyPath: ReferenceWritableKeyPath<View, Value>) -> (Value) -> ViewKeyPathUpdateRenderNode<View, Value, Self> {
subscript<Value>(dynamicMember keyPath: ReferenceWritableKeyPath<View, Value>) -> (Value) -> ViewKeyPathUpdateRenderNode<Value, Self> {
{ with(keyPath, $0) }
}
public func with<Value>(_ keyPath: ReferenceWritableKeyPath<View, Value>, _ value: Value) -> ViewKeyPathUpdateRenderNode<View, Value, Self> {
public func with<Value>(_ keyPath: ReferenceWritableKeyPath<View, Value>, _ value: Value) -> ViewKeyPathUpdateRenderNode<Value, Self> {
ViewKeyPathUpdateRenderNode(content: self, valueKeyPath: keyPath, value: value)
}
public func id(_ id: String) -> ViewIDRenderNode<View, Self> {
public func id(_ id: String) -> ViewIDRenderNode<Self> {
ViewIDRenderNode(content: self, id: id)
}
public func animator(_ animator: Animator?) -> ViewAnimatorRenderNode<View, Self> {
public func animator(_ animator: Animator?) -> ViewAnimatorRenderNode<Self> {
ViewAnimatorRenderNode(content: self, animator: animator)
}
public func reuseStrategy(_ reuseStrategy: ReuseStrategy) -> ViewReuseStrategyRenderNode<View, Self> {
public func reuseStrategy(_ reuseStrategy: ReuseStrategy) -> ViewReuseStrategyRenderNode<Self> {
ViewReuseStrategyRenderNode(content: self, reuseStrategy: reuseStrategy)
}
public func update(_ update: @escaping (View) -> Void) -> ViewUpdateRenderNode<View, Self> {
public func update(_ update: @escaping (View) -> Void) -> ViewUpdateRenderNode<Self> {
ViewUpdateRenderNode(content: self, update: update)
}
}

public struct ViewAnimatorWrapperRenderNode<View, Content: ViewRenderNode>: ViewRenderNodeWrapper where Content.View == View {
public struct ViewAnimatorWrapperRenderNode<Content: ViewRenderNode>: ViewRenderNodeWrapper {
public let content: Content
var passthrough: Bool
var insertBlock: ((ComponentDisplayableView, UIView, CGRect) -> Void)?
Expand All @@ -103,13 +103,13 @@ public struct ViewAnimatorWrapperRenderNode<View, Content: ViewRenderNode>: View
}

extension ViewRenderNode {
func animateUpdate(passthrough: Bool = false, _ updateBlock: @escaping ((ComponentDisplayableView, UIView, CGRect) -> Void)) -> ViewAnimatorWrapperRenderNode<View, Self> {
func animateUpdate(passthrough: Bool = false, _ updateBlock: @escaping ((ComponentDisplayableView, UIView, CGRect) -> Void)) -> ViewAnimatorWrapperRenderNode<Self> {
ViewAnimatorWrapperRenderNode(content: self, passthrough: passthrough, updateBlock: updateBlock)
}
func animateInsert(passthrough: Bool = false, _ insertBlock: @escaping ((ComponentDisplayableView, UIView, CGRect) -> Void)) -> ViewAnimatorWrapperRenderNode<View, Self> {
func animateInsert(passthrough: Bool = false, _ insertBlock: @escaping ((ComponentDisplayableView, UIView, CGRect) -> Void)) -> ViewAnimatorWrapperRenderNode<Self> {
ViewAnimatorWrapperRenderNode(content: self, passthrough: passthrough, insertBlock: insertBlock)
}
func animateDelete(passthrough: Bool = false, _ deleteBlock: @escaping ((ComponentDisplayableView, UIView, () -> Void) -> Void)) -> ViewAnimatorWrapperRenderNode<View, Self> {
func animateDelete(passthrough: Bool = false, _ deleteBlock: @escaping ((ComponentDisplayableView, UIView, () -> Void) -> Void)) -> ViewAnimatorWrapperRenderNode<Self> {
ViewAnimatorWrapperRenderNode(content: self, passthrough: passthrough, deleteBlock: deleteBlock)
}
}

0 comments on commit b173b82

Please sign in to comment.