public DataTableDiff calculateUnorderedDiffs() {
        List<SimpleEntry<List<String>, DiffType>> diffTableRows = new ArrayList<>();

        // 1. add all "to" row in extra table
        // 2. iterate over "from", when a common row occurs, remove it from
        // extraRows
        // finally, only extra rows are kept and in same order that in "to".
        ArrayList<List<String>> extraRows = new ArrayList<>(to.cells());

        for (List<String> row : from.cells()) {
            if (!extraRows.remove(row)) {
                diffTableRows.add(
                    new SimpleEntry<>(row, DiffType.DELETE));
            } else {
                diffTableRows.add(
                    new SimpleEntry<>(row, DiffType.NONE));
            }
        }

        for (List<String> cells : extraRows) {
            diffTableRows.add(
                new SimpleEntry<>(cells, DiffType.INSERT));
        }

        return DataTableDiff.create(diffTableRows);
    }
@Test
    void unordered_diff_with_itself_in_different_order() {
        assertTrue(new TableDiffer(table(), otherTableWithDifferentOrder()).calculateUnorderedDiffs().isEmpty());
    }