Skip to content

Extras

The extras module provides various flexible utilities for composing Mobius loops in a way that fits your project.

CompositeLogger

Multiple MobiusLoop.Logger instances can be combined with a CompositeLogger.

val myLogger = CompositeLogger.from(
    MyLoggingBackendLogger("MyScreen"),
    SimpleLogger("MyScreen")
)

val loop = Mobius.loop(MyUpdate(), effectHandler)
    .logger(myLogger)
    .startFrom(MyModel())

Effect Handler Decorators

CompositeEffectHandler

CompositeEffectHandler delegates to a provided list of Effect handlers. This can be useful for reusing handlers with multiple loops, and keeping handlers small and focused.

val effectHandler = CompositeEffectHandler.from(
    Connectable { output -> AnalyticsHandler(output) },
    Connectable { output -> UserStateHandler(output) },
    Connectable { output -> MyScreenHandler(output) }
)

val loop = Mobius.loop(MyScreenUpdate(), effectHandler)
    .startFrom(MyScreenModel())

MappedEffectHandler

MappedEffectHandler allows you to transform in the Effect inputs and Event outputs to fit your loop.

val myScreenUserStateHandler = Connectable { output -> UserStateHandler(output) }
    .mapped(
        mapEffect = { effect: MyScreenEffect ->
            when (effect) {
                MyScreenEffect.Logout -> UserStateEffect.Logout
                MyScreenEffect.RefreshUserState -> UserStateEffect.Refresh
                else -> null // Ignore the effect
            }
        },
        mapEvent = { event: UserStateEvent ->
            when (event) {
                UserStateEvent.LoggedOut -> MyScreenEvent.LoggedOut
                is UserStateEvent.UserUpdated -> MyScreenEvent.UserUpdated(event.user)
                else -> null // Ignore the event
            }
        }
    )
val effectHandler = CompositeEffectHandler.from(
    myScreenUserStateHandler,
    Connectable { output -> MyScreenHandler(output) }
)