var utils = require("./utils");
/**
 * Apply the operators that apply to the 'file:changed' event
 * @param {Rx.Observable} subject
 * @param options
 * @return {Rx.Observable<{type: string, files: Array<any>}>}
 */
function fileChanges(subject, options) {
    var operators = [
        {
            option: "reloadThrottle",
            fnName: "throttle"
        },
        {
            option: "reloadDelay",
            fnName: "delay"
        }
    ];
    var scheduler = options.getIn(["debug", "scheduler"]);
    /**
     * Create a stream buffered/debounced stream of events
     */
    var initial = getAggregatedDebouncedStream(subject, options, scheduler);
    return applyOperators(operators, initial, options, scheduler)
        .map(function (items) {
        var paths = items.map(function (x) { return x.path; });
        if (utils.willCauseReload(paths, options.get("injectFileTypes").toJS())) {
            return {
                type: "reload",
                files: items
            };
        }
        return {
            type: "inject",
            files: items
        };
    });
}
module.exports.fileChanges = fileChanges;
/**
 * Apply the operators that apply to the 'browser:reload' event
 * @param {Rx.Observable} subject
 * @param options
 * @returns {Rx.Observable}
 */
function applyReloadOperators(subject, options) {
    var operators = [
        {
            option: "reloadDebounce",
            fnName: "debounce"
        },
        {
            option: "reloadThrottle",
            fnName: "throttle"
        },
        {
            option: "reloadDelay",
            fnName: "delay"
        }
    ];
    return applyOperators(operators, subject, options, options.getIn(["debug", "scheduler"]));
}
module.exports.applyReloadOperators = applyReloadOperators;
/**
 * @param items
 * @param subject
 * @param options
 * @param scheduler
 */
function applyOperators(items, subject, options, scheduler) {
    return items.reduce(function (subject, item) {
        var value = options.get(item.option);
        if (value > 0) {
            return subject[item.fnName].call(subject, value, scheduler);
        }
        return subject;
    }, subject);
}
/**
 * @param subject
 * @param options
 * @param scheduler
 */
function getAggregatedDebouncedStream(subject, options, scheduler) {
    return subject
        .filter(function (x) {
        return options.get("watchEvents").indexOf(x.event) > -1;
    })
        .buffer(subject.debounce(options.get("reloadDebounce"), scheduler));
}
//# sourceMappingURL=file-event-handler.js.map