Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
This repository was archived by the owner on Dec 12, 2021. It is now read-only.
/RxAutomatonPublic archive

🤖 RxSwift + State Machine, inspired by Redux and Elm.

License

NotificationsYou must be signed in to change notification settings

inamiy/RxAutomaton

Repository files navigation

RxAutomaton

RxSwift port ofReactiveAutomaton (State Machine).

Terminology

Whenever the word "signal" or "(signal) producer" appears (derived fromReactiveCocoa), they mean "hot-observable" and "cold-observable".

Example

(Demo app is bundled in the project)

To make a state transition diagram like abovewith additional effects, follow these steps:

// 1. Define `State`s and `Input`s.enumState{case loggedOut, loggingIn, loggedIn, loggingOut}enumInput{case login, loginOK, logout, logoutOKcase forceLogout}// Additional effects (`Observable`s) while state-transitioning.// (NOTE: Use `Observable.empty()` for no effect)letloginOKProducer= /* show UI, setup DB, request APIs, ..., and send `Input.loginOK` */let logoutOKProducer= /* show UI, clear cache, cancel APIs, ..., and send `Input.logoutOK` */let forcelogoutOKProducer= /* do something more special, ..., and send `Input.logoutOK` */let canForceLogout: State-> Bool=[.loggingIn,.loggedIn].contains// 2. Setup state-transition mappings.letmappings:[Automaton<State,Input>.EffectMapping]=[  /*  Input      |   fromState => toState        |      Effect       */  /* ----------------------------------------------------------------*/.login       |.loggedOut=>.loggingIn     | loginOKProducer,.loginOK     |.loggingIn=>.loggedIn      |.empty(),.logout      |.loggedIn=>.loggingOut    | logoutOKProducer,.logoutOK    |.loggingOut=>.loggedOut     |.empty(),.forceLogout | canForceLogout=>.loggingOut | forceLogoutOKProducer]// 3. Prepare input pipe for sending `Input` to `Automaton`.let(inputSignal, inputObserver)= Observable<Input>.pipe()// 4. Setup `Automaton`.letautomaton=Automaton(    state:.loggedOut,    input: inputSignal,    mapping:reduce(mappings),  // combine mappings using `reduce` helper    strategy:.latest   // NOTE: `.latest` cancels previous running effect)// Observe state-transition replies (`.success` or `.failure`).automaton.replies.subscribe(next:{ replyinprint("received reply =\(reply)")})// Observe current state changes.automaton.state.asObservable().subscribe(next:{ stateinprint("current state =\(state)")})

And let's test!

letsend= inputObserver.onNextexpect(automaton.state.value)==.loggedIn    // already logged insend(Input.logout)expect(automaton.state.value)==.loggingOut  // logging out...// `logoutOKProducer` will automatically send `Input.logoutOK` later// and transit to `State.loggedOut`.expect(automaton.state.value)==.loggedOut   // already logged outsend(Input.login)expect(automaton.state.value)==.loggingIn   // logging in...// `loginOKProducer` will automatically send `Input.loginOK` later// and transit to `State.loggedIn`.// 👨🏽 < But wait, there's more!// Let's send `Input.forceLogout` immediately after `State.loggingIn`.send(Input.forceLogout)                       // 💥💣💥expect(automaton.state.value)==.loggingOut  // logging out...// `forcelogoutOKProducer` will automatically send `Input.logoutOK` later// and transit to `State.loggedOut`.

License

MIT

About

🤖 RxSwift + State Machine, inspired by Redux and Elm.

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors6


[8]ページ先頭

©2009-2025 Movatter.jp