@@ -110,4 +110,85 @@ public struct AtomicTransitionBuilder {
110110 Combined ( Combined ( Combined ( Combined ( Combined ( Combined ( t1, t2) , t3) , t4) , t5) , t6) , t7)
111111 }
112112 #endif
113+
114+ public static func buildOptional< T: AtomicTransition > ( _ component: T ? ) -> _OptionalTransition < T > {
115+ if let component = component {
116+ return _OptionalTransition ( component)
117+ } else {
118+ return _OptionalTransition ( nil )
119+ }
120+ }
121+
122+ public static func buildEither< TrueTransition: AtomicTransition , FalseTransition: AtomicTransition > ( first component: TrueTransition ) -> _ConditionalTransition < TrueTransition , FalseTransition > {
123+ _ConditionalTransition ( trueTransition: component)
124+ }
125+
126+ public static func buildEither< TrueTransition: AtomicTransition , FalseTransition: AtomicTransition > ( second component: FalseTransition ) -> _ConditionalTransition < TrueTransition , FalseTransition > {
127+ _ConditionalTransition ( falseTransition: component)
128+ }
129+ }
130+
131+ public struct _OptionalTransition < Transition: AtomicTransition > : AtomicTransition {
132+ private let transition : Transition ?
133+
134+ init ( _ transition: Transition ? ) {
135+ self . transition = transition
136+ }
137+
138+ public func transition( _ view: TransientView , for operation: TransitionOperation , in container: Container ) {
139+ transition? . transition ( view, for: operation, in: container)
140+ }
113141}
142+
143+ extension _OptionalTransition : MirrorableAtomicTransition where Transition: MirrorableAtomicTransition {
144+ public func mirrored( ) -> _OptionalTransition < Transition . Mirrored > {
145+ . init( transition? . mirrored ( ) )
146+ }
147+ }
148+
149+ extension _OptionalTransition : Equatable where Transition: Equatable { }
150+ extension _OptionalTransition : Hashable where Transition: Hashable { }
151+
152+ public struct _ConditionalTransition < TrueTransition: AtomicTransition , FalseTransition: AtomicTransition > : AtomicTransition {
153+ private typealias Transition = _Either < TrueTransition , FalseTransition >
154+ private let transition : Transition
155+
156+ init ( trueTransition: TrueTransition ) {
157+ self . transition = . left( trueTransition)
158+ }
159+
160+ init ( falseTransition: FalseTransition ) {
161+ self . transition = . right( falseTransition)
162+ }
163+
164+ public func transition( _ view: TransientView , for operation: TransitionOperation , in container: Container ) {
165+ switch transition {
166+ case . left( let trueTransition) :
167+ trueTransition. transition ( view, for: operation, in: container)
168+ case . right( let falseTransition) :
169+ falseTransition. transition ( view, for: operation, in: container)
170+ }
171+ }
172+ }
173+
174+ extension _ConditionalTransition : MirrorableAtomicTransition where TrueTransition: MirrorableAtomicTransition , FalseTransition: MirrorableAtomicTransition {
175+ public func mirrored( ) -> _ConditionalTransition < TrueTransition . Mirrored , FalseTransition . Mirrored > {
176+ switch transition {
177+ case . left( let trueTransition) :
178+ return . init( trueTransition: trueTransition. mirrored ( ) )
179+ case . right( let falseTransition) :
180+ return . init( falseTransition: falseTransition. mirrored ( ) )
181+ }
182+ }
183+ }
184+
185+ extension _ConditionalTransition : Equatable where TrueTransition: Equatable , FalseTransition: Equatable { }
186+ extension _ConditionalTransition : Hashable where TrueTransition: Hashable , FalseTransition: Hashable { }
187+
188+ private enum _Either < Left, Right> {
189+ case left( Left )
190+ case right( Right )
191+ }
192+
193+ extension _Either : Equatable where Left: Equatable , Right: Equatable { }
194+ extension _Either : Hashable where Left: Hashable , Right: Hashable { }
0 commit comments