function KeyboardMoveSelection(
    config,
    keyboard,
    modeling,
    rules,
    selection
) {

  var self = this;

  this._config = assign({}, DEFAULT_CONFIG, config || {});

  keyboard.addListener(HIGHER_PRIORITY, function(event) {

    var keyEvent = event.keyEvent;

    var direction = KEY_TO_DIRECTION[keyEvent.key];

    if (!direction) {
      return;
    }

    if (keyboard.isCmd(keyEvent)) {
      return;
    }

    var accelerated = keyboard.isShift(keyEvent);

    self.moveSelection(direction, accelerated);

    return true;
  });


  /**
   * Move selected elements in the given direction,
   * optionally specifying accelerated movement.
   *
   * @param {string} direction
   * @param {boolean} [accelerated=false]
   */
  this.moveSelection = function(direction, accelerated) {

    var selectedElements = selection.get();

    if (!selectedElements.length) {
      return;
    }

    var speed = this._config[
      accelerated ?
        'moveSpeedAccelerated' :
        'moveSpeed'
    ];

    var delta = DIRECTIONS_DELTA[direction](speed);

    var canMove = rules.allowed('elements.move', {
      shapes: selectedElements
    });

    if (canMove) {
      modeling.moveElements(selectedElements, delta);
    }
  };

}
Enables to move selection with keyboard arrows.
Use with Shift for modified speed (default=1, with Shift=10).
Pressed Cmd/Ctrl turns the feature off.

@param {Object} config
@param {number} [config.moveSpeed=1]
@param {number} [config.moveSpeedAccelerated=10]
@param {Keyboard} keyboard
@param {Modeling} modeling
@param {Rules} rules
@param {Selection} selection