All Projects โ†’ importre โ†’ kotlin-maze

importre / kotlin-maze

Licence: Apache-2.0 license
๐Ÿš‚ A simple way to implement applications using observable streams

Programming Languages

kotlin
9241 projects

Projects that are alternatives of or similar to kotlin-maze

Reactivesensors
Android library monitoring device hardware sensors with RxJava
Stars: โœญ 161 (+187.5%)
Mutual labels:  rxandroid, rxjava2
Rxbus
Event Bus By RxJava.
Stars: โœญ 2,126 (+3696.43%)
Mutual labels:  rxandroid, rxjava2
Reactivebeacons
Android library scanning BLE beacons nearby with RxJava
Stars: โœญ 171 (+205.36%)
Mutual labels:  rxandroid, rxjava2
Pagingroom
Demonstrates various ways of using Paging library with Room (LiveData, RxJava, custom datasource)
Stars: โœญ 139 (+148.21%)
Mutual labels:  rxandroid, rxjava2
Reactivenetwork
Android library listening network connection state and Internet connectivity with RxJava Observables
Stars: โœญ 2,484 (+4335.71%)
Mutual labels:  rxandroid, rxjava2
Android Clean Architecture Boilerplate
Apply clean architecture on Android
Stars: โœญ 141 (+151.79%)
Mutual labels:  rxandroid, rxjava2
Android Audiorecorder App
Android application to record audio. RxJava2, Dagger2, MVP, RoomDb.
Stars: โœญ 180 (+221.43%)
Mutual labels:  rxandroid, rxjava2
Redgram For Reddit
An Open-Sourced Android Reddit Client
Stars: โœญ 106 (+89.29%)
Mutual labels:  rxandroid, rxjava2
Conductormvp
Multi-project Clean Architecture MVP app in Kotlin using Conductor, Room, RxJava 2, Dagger 2 with custom scopes
Stars: โœญ 192 (+242.86%)
Mutual labels:  rxandroid, rxjava2
Reactivewifi
Android library listening available WiFi Access Points and related information with RxJava Observables
Stars: โœญ 186 (+232.14%)
Mutual labels:  rxandroid, rxjava2
Rxjavapriorityscheduler
RxPS - RxJavaPriorityScheduler - A RxJava Priority Scheduler library for Android and Java applications
Stars: โœญ 138 (+146.43%)
Mutual labels:  rxandroid, rxjava2
RxAnimator
An RxJava2 binding for android Animator
Stars: โœญ 80 (+42.86%)
Mutual labels:  observable, rxjava2
Android Cnblogs
๐Ÿ”ฅ๐Ÿ”ฅ ๅšๅฎขๅ›ญAndroid็ซฏๅผ€ๆบ้กน็›ฎ๏ผŒ็•Œ้ข็ฎ€ๆดๆธ…ๆ–ฐใ€‚
Stars: โœญ 127 (+126.79%)
Mutual labels:  rxandroid, rxjava2
Rxlifecycle
Rx binding of stock Android Activities & Fragment Lifecycle, avoiding memory leak
Stars: โœญ 131 (+133.93%)
Mutual labels:  observable, rxjava2
Marvel
Stars: โœญ 109 (+94.64%)
Mutual labels:  rxandroid, rxjava2
Mvvm Architecture Android Beginners
This repository contains a sample app that implements MVVM architecture using Kotlin, ViewModel, LiveData, and etc.
Stars: โœญ 176 (+214.29%)
Mutual labels:  rxandroid, rxjava2
Mvpframes
ๆ•ดๅˆๅคง้‡ไธปๆตๅผ€ๆบ้กน็›ฎๅนถไธ”ๅฏ้ซ˜ๅบฆ้…็ฝฎๅŒ–็š„ Android MVP ๅฟซ้€Ÿ้›†ๆˆๆก†ๆžถ๏ผŒๆ”ฏๆŒ AndroidX
Stars: โœญ 100 (+78.57%)
Mutual labels:  rxandroid, rxjava2
Refactoring Android App Series Overview
Overview of wonderful series started by Oday and Rakesh for refactoring android application under youtube channel Dry Code.
Stars: โœญ 101 (+80.36%)
Mutual labels:  rxandroid, rxjava2
Androidbasemvp
๐Ÿš€ไธ€ไธชๅฟซ้€ŸๆญๅปบMVP+RxJava2+Retrofit ๅŸบ็ก€ๆก†ๆžถ,ไธป่ฆๆ˜ฏๅฐ่ฃ…ๆœ‰Http็ฝ‘็ปœ่ฏทๆฑ‚ใ€ๆ—ฅๅฟ—ใ€็ผ“ๅญ˜ใ€ๅŠ ่ฝฝ็ญ‰ๅพ…ใ€toastใ€้กต้ข็Šถๆ€ๅธƒๅฑ€็ฎก็†ใ€ๆƒ้™ใ€RxBusใ€Glideๅ›พ็‰‡ๅŠ ่ฝฝ็ญ‰็ป„ไปถ๏ผŒๆ–นไพฟๅฟซ้€Ÿๅผ€ๅ‘ๆ–ฐ้กน็›ฎใ€ๅ‡ๅฐ‘ๅผ€ๅ‘ๆˆๆœฌใ€‚
Stars: โœญ 184 (+228.57%)
Mutual labels:  rxandroid, rxjava2
Prefser
Wrapper for Android SharedPreferences with object serialization and RxJava Observables
Stars: โœญ 228 (+307.14%)
Mutual labels:  rxandroid, rxjava2


kotlin-maze

Download Build Status

๐Ÿš‚ A simple way to implement applications using observable streams


โ–ˆโ–ˆโ•—  โ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•—     โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ–ˆโ•—   โ–ˆโ–ˆโ•—      โ–ˆโ–ˆโ–ˆโ•—   โ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—
โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•”โ•โ–ˆโ–ˆโ•”โ•โ•โ•โ–ˆโ–ˆโ•—โ•šโ•โ•โ–ˆโ–ˆโ•”โ•โ•โ•โ–ˆโ–ˆโ•‘     โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ–ˆโ–ˆโ•—  โ–ˆโ–ˆโ•‘      โ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•—โ•šโ•โ•โ–ˆโ–ˆโ–ˆโ•”โ•โ–ˆโ–ˆโ•”โ•โ•โ•โ•โ•
โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ• โ–ˆโ–ˆโ•‘   โ–ˆโ–ˆโ•‘   โ–ˆโ–ˆโ•‘   โ–ˆโ–ˆโ•‘     โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•”โ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•”โ–ˆโ–ˆโ–ˆโ–ˆโ•”โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•‘  โ–ˆโ–ˆโ–ˆโ•”โ• โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—  
โ–ˆโ–ˆโ•”โ•โ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•‘   โ–ˆโ–ˆโ•‘   โ–ˆโ–ˆโ•‘   โ–ˆโ–ˆโ•‘     โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•‘โ•šโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•‘โ•šโ•โ•โ•โ•โ•โ–ˆโ–ˆโ•‘โ•šโ–ˆโ–ˆโ•”โ•โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ–ˆโ•”โ•  โ–ˆโ–ˆโ•”โ•โ•โ•  
โ–ˆโ–ˆโ•‘  โ–ˆโ–ˆโ•—โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ•   โ–ˆโ–ˆโ•‘   โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•‘ โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ•‘      โ–ˆโ–ˆโ•‘ โ•šโ•โ• โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•‘  โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—
โ•šโ•โ•  โ•šโ•โ• โ•šโ•โ•โ•โ•โ•โ•    โ•šโ•โ•   โ•šโ•โ•โ•โ•โ•โ•โ•โ•šโ•โ•โ•šโ•โ•  โ•šโ•โ•โ•โ•      โ•šโ•โ•     โ•šโ•โ•โ•šโ•โ•  โ•šโ•โ•โ•šโ•โ•โ•โ•โ•โ•โ•โ•šโ•โ•โ•โ•โ•โ•โ•
                                                                                        

Usage

Create immutable view model

Recommend create class as comparable like data class

data class HelloModel(
    val name: String = ""
)

Implement MazeListener

class HelloFragment : BaseFragment(), MazeListener<HelloModel> {

    override val layoutId: Int = R.layout.fragment_hello

    // Don't be in lifecycle of `Fragment`/`Activity`
    // In this case, `BaseFragment` is set to `retainInstance = true` basically
    // Set initial view model
    private val maze by lazy { Maze(HelloModel()) }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        // Attach maze with user events
        // Event.id is used to filter in `main` function
        maze.attach(this, arrayOf(
            toolbar.navigationClicks()
                .map { ClickEvent(R.id.homeAsUp) },
            inputName.textChanges()
                .map { TextChangeEvent(R.id.inputName, it) }
        ))
    }

    override fun onDestroyView() {
        // Detach
        maze.detach()
        super.onDestroyView()
    }

    // Implement main function
    override fun main(sources: Sources<HelloModel>) = helloMain(sources)

    // Render view model
    override fun render(prev: HelloModel, curr: HelloModel) {
        val hello = getString(R.string.hello_message)
        textHello.text = hello.format(curr.name)
    }

    // Navigate somethings
    override fun navigate(navigation: Navigation) {
        when (navigation) {
            is Back -> activity?.onBackPressed()
        }
    }

    // Cleanup if Activity is finished
    override fun finish() = maze.finish()

    // Handle errors
    override fun error(t: Throwable) {
        t.printStackTrace()
    }
}

Implement main function

Implement main logic using Observables

fun helloMain(sources: Sources<HelloModel>): Sinks<HelloModel> {

    val model = sources.event
        .textChanges(R.id.inputName)
        .map(CharSequence::toString)
        .withLatestFrom(sources.model,
            BiFunction { name: String, model: HelloModel ->
                model.copy(name = name)
            })
        .cacheWithInitialCapacity(1)

    val navigation = sources.event
        .clicks(R.id.homeAsUp)
        .map { Back() }

    // `model` must be `ObservableCache`
    return Sinks(model, navigation)
}

Customize Navigations, Events

You can extend Navigations and/or Events if you want

Please refer to default Navigations, Events

More examples

videos

Install

repositories {
    jcenter()
}

compile "com.importre:kotlin-maze:$maze_version"

for test

testCompile "com.importre:kotlin-maze-test:$maze_version"

Slides

License

Apache 2.0 ยฉ Jaewe Heo

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].