anchor.diff:      Board.DIRECTIONS.forEach((String dir) {
         Board tmp = new Board.copy(board);
         if (tmp.doDirection(dir)) {
  -        num score = _search(tmp, [dir]);
  +        num score = _search([board, tmp], [dir]);
           if (bestScore == null || score > bestScore) {
             best = dir;
             bestScore = score;
  
positive.code: 
    void keyDown(KeyboardEvent event) {
      switch (event.keyCode) {
        case 37:
          left();
          break;
  
negative.code:     return changed;
    }
  
    bool _collapseCells(Iterable<List<Cell>> cellLists, bool collapseAcrossEmpty) {
      return cellLists.fold(false, (a, cells) => _collapse(cells, collapseAcrossEmpty) || a);
    }
  
    bool left([bool collapseAcrossEmpty = true]) {
      return _collapseCells(rows, collapseAcrossEmpty);
    }
  
    bool right([bool collapseAcrossEmpty = true]) {
      return _collapseCells(rows.map((row) => row.reversed.toList()), collapseAcrossEmpty);
    }
  
    bool up([bool collapseAcrossEmpty = true]) {
      return _collapseCells(columns, collapseAcrossEmpty);
    }
  
    bool down([bool collapseAcrossEmpty = true]) {
      return _collapseCells(columns.map((column) => column.reversed.toList()), collapseAcrossEmpty);
    }
  
    bool doDirection(String direction, [bool collapseAcrossEmpty = true]) {
      switch (direction) {
        case "up":
          return up(collapseAcrossEmpty);
        case "down":
          return down(collapseAcrossEmpty);
        case "left":
          return left(collapseAcrossEmpty);
        case "right":
          return right(collapseAcrossEmpty);
        default:
          throw "unknown direction: $direction";
      }
  