The system simulation will be started upon subscription and stopped after subscription is disposed.

System state is represented as a `State` parameter.
Events are represented by the `Event` parameter.

@param initialState The initial state of the system.
@param reduce Calculates the new system state from the existing state and a transition event (system integrator, reducer).
@param feedback The feedback loops that produce events depending on the current system state.
@returns The current state of the system.
function system(initialState, reduce, feedback) {
    return rx.defer(function () {
        var state = new rx.ReplaySubject(1);
        var scheduler = rx.queueScheduler;
        var events = feedback.map(function (x) { return x(state, scheduler); });
        var mergedEvent = rx.merge.apply(rx, events).pipe(observeOn_1.observeOn(scheduler));
        var eventsWithEffects = mergedEvent
            .pipe(scan_1.scan(reduce, initialState), tap_1.tap(function (x) {
            state.next(x);
        }), subscribeOn_1.subscribeOn(scheduler), startWith_1.startWith(initialState), observeOn_1.observeOn(scheduler));
        var hackOnSubscribed = rx.defer(function () {
            state.next(initialState);
            return rx.empty();
        });
        return rx.merge.apply(rx, [eventsWithEffects, hackOnSubscribed]).pipe(catchError_1.catchError(function (e) {
            dispatchError(e);
            return rx.throwError(e);
        }));
    });
}