code: function (positionChangeData) {
                  var _this = this;
                  // update positions according to current position change
                  this.updatePosition(positionChangeData);
                  // for each direction:
                  // 1. filter the _points that have a role as the direction's limit
                  // 2. for top and left find max x | y values, and min for right and bottom
                  this.limitDirections.forEach(function (direction) {
                      /** @type {?} */
                      var relevantPoints = _this._points.filter(function (point) {
                          return point.roles.includes(direction);
                      })
                          .map(function (point) {
                          return point[_this.getDirectionAxis(direction)];
                      });
                      /** @type {?} */
                      var limit;
                      if (direction === 'top' || direction === 'left') {
                          limit = Math.max.apply(Math, __spread(relevantPoints));
                      }
                      if (direction === 'right' || direction === 'bottom') {
                          limit = Math.min.apply(Math, __spread(relevantPoints));
                      }
                      _this._limits[direction] = limit;
                  });
                  this.limits.next(this._limits);
                  this.positions.next(Array.from(this._points));
              }
docs: updates limits and point positions and calls next on the observables
  @param {?} positionChangeData - position change event data
  @return {?}