anchor.diff:        return false;
       }
     }
  -  bool _collapse(List<Cell> cells) {
  +
  +  bool _collapse(List<Cell> cells, bool collapseAcrossEmpty) {
  +    if (!collapseAcrossEmpty) {
  +      // only keep the cells before the first empty one
  +      cells = cells.takeWhile((cell) => !cell.empty).toList();
  +    }
  +
       bool changed = false;
       for (int i = 0; i < cells.length - 1; ++i) {
         Cell cell = cells[i];
  
positive.code:     }
    }
  
    void left() {
      doDirection("left");
    }
  
negative.code:   num runDelay = 50;
    Timer currentTimer;
  
    List<Strategy> strategies;
  
    Strategy strategy;
  
    AppController(Element element, Scope scope) {
      strategies = [const RandomStrategy(), const UpLeftRightDownStrategy(), const AntiGreedyStrategy(1),
          const AntiGreedyStrategy(2)];
      for (int i = 1; i < 10; ++i) {
        strategies.add(new GreedyStrategy(i));
      }
      for (int i = 1; i < 10; ++i) {
        strategies.add(new GreedyDownStrategy(i));
      }
      for (int i = 1; i < 10; ++i) {
        strategies.add(new EdgeStrategy(i));
      }
  
      strategy = strategies.first;
  
      element.onKeyDown.listen(keyDown);
  