Kaskade

General

Category
Free
Tag
FSM
License
Apache License, Version 2.0
Min SDK
21 (Android 5.0–5.0.2 Lollipop)
Registered
Jan 5, 2019
Favorites
1
Link
https://github.com/gumil/Kaskade
See also
Engine
Dalek
EasyFlow
TinyMachine
HAL

Additional

Language
Kotlin
Version
0.4.2 (Aug 27, 2020)
Created
Feb 4, 2018
Updated
Aug 26, 2020 (Retired)
Owner
Miguel Panelo (gumil)
Contributor
Miguel Panelo (gumil)
1
Activity
Badge
Generate
Download
Source code

Kaskade

State Container for Kotlin and Android.

The name comes from cascade, a waterfall, which reflects the objective of the library to make flows easier with unidirectional data flow.

Inspired by MVI or Model View Intent.

Why Kaskade?

  • Lightweight - enforces unidirectional data flow without the use of external dependencies.
  • Modular - can be easily substituted to different implementation with or without the use of another library.
  • Extendable - in relation to modular and lightweight, it's important to extend the API and create user defined implementation to fit specific requirements.
  • Unidirectional - data flows in one direction.
  • Predictable - control on state changes and action triggers.
  • DSL - able to hide complexity in a fluent way.
  • Multiplatform - built for JVM, iOS, and Javascript.

Installation

  1. Add to settings.gradle
enableFeaturePreview('GRADLE_METADATA')
  1. Add the dependency
dependencies {
  // core module
  implementation 'dev.gumil.kaskade:core:0.x.y'
  // coroutines module
  implementation 'dev.gumil.kaskade:coroutines:0.x.y'
  // rx module
  implementation 'dev.gumil.kaskade:rx:0.x.y'
  // livedata module
  implementation 'dev.gumil.kaskade:livedata:0.x.y'
}

(Please replace x and y with the latest version numbers: )

Usage

Create the Action and State objects.

Note: objects are only used here for simplicity in real projects data classes are more appropriate

internal sealed class TestState : State {
    object State1 : TestState()
    object State2 : TestState()
    object State3 : TestState()
}

internal sealed class TestAction : Action {
    object Action1 : TestAction()
    object Action2 : TestAction()
    object Action3 : TestAction()
}

Create Kaskade with TestState.State1 as initial state

val kaskade = Kaskade.create<TestAction, TestState>(TestState.State1) {
    on<TestAction.Action1> {
        TestState.State1
    }

    on<TestAction.Action2> {
        TestState.State2
    }

    on<TestAction.Action3> {
        TestState.State3
    }
}

Adding actions to Action with parameter ActionState

on<TestAction.Action1> { actionState ->
    // do any side effects when returning a new state
    TestState.State1
}

Observing states

kaskade.onStateChanged = {
    // Do something with new state
    render(it)
}

Observing states with Emitter

kaskade.stateEmitter().subscribe {
    // Do something with new state
    render(it)
}

Executing actions

kaskade.dispatch(TestAction.Action1)

Documentation

Check out the wiki for documentation.

Some of the topics covered are:

Sample projects