All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.cookingfox.lapasse.impl.state.manager.DefaultRxStateManager Maven / Gradle / Ivy

The newest version!
package com.cookingfox.lapasse.impl.state.manager;

import com.cookingfox.lapasse.api.event.Event;
import com.cookingfox.lapasse.api.state.State;
import com.cookingfox.lapasse.api.state.manager.RxStateManager;
import com.cookingfox.lapasse.api.state.manager.StateManager;
import com.cookingfox.lapasse.api.state.observer.OnStateChanged;
import com.cookingfox.lapasse.api.state.observer.StateChanged;
import com.cookingfox.lapasse.impl.state.observer.StateChangedVo;
import rx.Observable;
import rx.Subscriber;
import rx.functions.Action0;
import rx.subscriptions.Subscriptions;

/**
 * Default implementation of {@link StateManager}.
 *
 * @param  The concrete type of the state object.
 */
public class DefaultRxStateManager
        extends DefaultStateManager
        implements RxStateManager {

    //----------------------------------------------------------------------------------------------
    // CONSTRUCTOR
    //----------------------------------------------------------------------------------------------

    public DefaultRxStateManager(S initialState) {
        super(initialState);
    }

    //----------------------------------------------------------------------------------------------
    // PUBLIC METHODS
    //----------------------------------------------------------------------------------------------

    @Override
    public Observable> observeStateChanges() {
        return Observable.create(new Observable.OnSubscribe>() {
            @Override
            public void call(final Subscriber> subscriber) {
                // create new listener
                final OnStateChanged listener = new OnStateChanged() {
                    @Override
                    public void onStateChanged(final S state, final Event event) {
                        // wrap parameters with VO
                        subscriber.onNext(new StateChangedVo<>(event, state));
                    }
                };

                // add listener
                addStateChangedListener(listener);

                // remove listener on unsubscribe
                subscriber.add(Subscriptions.create(new Action0() {
                    @Override
                    public void call() {
                        // complete subscriber
                        subscriber.onCompleted();

                        // remove listener, if not yet cleared
                        if (stateChangedListeners.contains(listener)) {
                            removeStateChangedListener(listener);
                        }
                    }
                }));
            }
        });
    }

}