function add$2(init, update, params, react) {
    let shift = 1,
      op;
    if (init instanceof Operator) {
      op = init;
    } else if (init && init.prototype instanceof Operator) {
      op = new init();
    } else if (isFunction(init)) {
      op = new Operator(null, init);
    } else {
      shift = 0;
      op = new Operator(init, update);
    }
    this.rank(op);
    if (shift) {
      react = params;
      params = update;
    }
    if (params) this.connect(op, op.parameters(params, react));
    this.touch(op);
    return op;
  }
Add an operator to the dataflow graph. This function accepts a
variety of input argument types. The basic signature supports an
initial value, update function and parameters. If the first parameter
is an Operator instance, it will be added directly. If it is a
constructor for an Operator subclass, a new instance will be instantiated.
Otherwise, if the first parameter is a function instance, it will be used
as the update function and a null initial value is assumed.
@param {*} init - One of: the operator to add, the initial value of
  the operator, an operator class to instantiate, or an update function.
@param {function} [update] - The operator update function.
@param {object} [params] - The operator parameters.
@param {boolean} [react=true] - Flag indicating if this operator should
  listen for changes to upstream operators included as parameters.
@return {Operator} - The added operator.