gh-EmergeTools-Pow/Sources/Pow/Infrastructure/AnyContinuousEffect.swift
Joe Fabisevich 5b95fe95b0
Moving Pow to @emergetools (#36)
Co-authored-by: Robert Böhnke <robb@robb.is>
Co-authored-by: Kasper Lahti <kasper@lahti.email>
2023-11-29 12:08:53 -03:00

39 lines
1.1 KiB
Swift

import SwiftUI
internal struct AnyContinuousEffect {
private var _viewModifier: (Bool) -> AnyContinuousViewModifier
static func modifier(_ modifier: @escaping (Bool) -> some ViewModifier & Continuous) -> Self {
AnyContinuousEffect(_viewModifier: { isActive in
modifier(isActive).eraseToAnyContinuousViewModifier()
})
}
func viewModifier(_ isActive: Bool) -> AnyContinuousViewModifier {
_viewModifier(isActive)
}
}
internal struct AnyContinuousViewModifier: ViewModifier {
private var _body: (AnyView) -> AnyView
init<Modifier: ViewModifier & Continuous>(_ modifier: Modifier) {
self._body = { content in
AnyView(content.modifier(modifier))
}
}
func body(content: Content) -> AnyView {
_body(AnyView(content))
}
}
internal extension ViewModifier where Self: Continuous {
func eraseToAnyContinuousViewModifier() -> AnyContinuousViewModifier {
AnyContinuousViewModifier(self)
}
}
internal protocol Continuous {
var isActive: Bool { get }
}