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

com.github.davidmoten.rx.StateMachine Maven / Gradle / Ivy

package com.github.davidmoten.rx;

import com.github.davidmoten.rx.util.BackpressureStrategy;

import rx.Observable.Transformer;
import rx.Subscriber;
import rx.functions.Func0;
import rx.functions.Func2;
import rx.functions.Func3;

public final class StateMachine {

    private StateMachine() {
        // prevent instantiation
    }

    public static interface Transition
            extends Func3, State> {

        // override so IDEs have better suggestions for parameters
        @Override
        public State call(State state, In value, Subscriber subscriber);

    }

    public static interface Completion extends Func2, Boolean> {

        // override so IDEs have better suggestions for parameters
        @Override
        public Boolean call(State state, Subscriber subscriber);

    }

    public static Builder builder() {
        return new Builder();
    }

    public static final class Builder {

        private Builder() {
            // prevent instantiation from other packages
        }

        public  Builder2 initialStateFactory(Func0 initialState) {
            return new Builder2(initialState);
        }

        public  Builder2 initialState(final State initialState) {
            return new Builder2(Functions.constant0(initialState));
        }

    }

    public static final class Builder2 {

        private final Func0 initialState;

        private Builder2(Func0 initialState) {
            this.initialState = initialState;
        }

        public  Builder3 transition(
                Transition transition) {
            return new Builder3(initialState, transition);
        }

    }

    public static final class Builder3 {

        private final Func0 initialState;
        private final Transition transition;
        private Completion completion = CompletionAlwaysTrueHolder.instance();
        private BackpressureStrategy backpressureStrategy = BackpressureStrategy.BUFFER;
        private int initialRequest = Transformers.DEFAULT_INITIAL_BATCH;

        private Builder3(Func0 initialState, Transition transition) {
            this.initialState = initialState;
            this.transition = transition;
        }

        public Builder3 completion(Completion completion) {
            this.completion = completion;
            return this;
        }

        public Builder3 backpressureStrategy(
                BackpressureStrategy backpressureStrategy) {
            this.backpressureStrategy = backpressureStrategy;
            return this;
        }

        public Builder3 initialRequest(int value) {
            this.initialRequest = value;
            return this;
        }

        public Transformer build() {
            return Transformers.stateMachine(initialState, transition, completion,
                    backpressureStrategy, initialRequest);
        }

    }

    private static final class CompletionAlwaysTrueHolder {

        private static final Completion INSTANCE = new Completion() {
            @Override
            public Boolean call(Object t1, Subscriber t2) {
                return true;
            }
        };

        @SuppressWarnings("unchecked")
        static  Completion instance() {
            return (Completion) INSTANCE;
        }
    }
}