MobiusCore/Source/EffectHandlers/EffectRouterDSL.swift (34 lines of code) (raw):

// Copyright Spotify AB. // SPDX-License-Identifier: Apache-2.0 public extension EffectRouter where Effect: Equatable { /// Add a route for effects which are equal to `constant`. /// /// - Parameter `constant`: the effect that should be handled by this route. func routeEffects( equalTo constant: Effect ) -> _PartialEffectRouter<Effect, Effect, Event> { return routeEffects(withParameters: { effect in effect == constant ? effect : nil }) } } public extension _PartialEffectRouter { /// Route to the anonymous `EffectHandler` defined by the `handle` closure. /// /// - Parameter handle: A closure which defines an `EffectHandler`. func to( _ handle: @escaping (EffectParameters, EffectCallback<Event>) -> Disposable ) -> EffectRouter<Effect, Event> { return to(AnyEffectHandler(handle: handle)) } /// Route to a side-effecting closure. /// /// - Parameter fireAndForget: a function which given some input carries out a side effect. func to( _ fireAndForget: @escaping (EffectParameters) -> Void ) -> EffectRouter<Effect, Event> { return to { parameters, callback in fireAndForget(parameters) callback.end() return AnonymousDisposable {} } } /// Route to a closure which returns an optional event when given the parameters as input. /// /// - Parameter eventClosure: a function which returns an optional event given some input. No events will be /// propagated if this function returns `nil`. func toEvent( _ eventClosure: @escaping (EffectParameters) -> Event? ) -> EffectRouter<Effect, Event> { return to { parameters, callback in if let event = eventClosure(parameters) { callback.send(event) } callback.end() return AnonymousDisposable {} } } }