public abstract Projection difference(Projection other);
@Test
    void testDifference() {
        assertThat(
                        Projection.of(new int[] {4, 1, 0, 3, 2})
                                .difference(Projection.of(new int[] {4, 2})))
                .isEqualTo(Projection.of(new int[] {1, 0, 2}));

        assertThat(
                        Projection.of(
                                        new int[][] {
                                            new int[] {4},
                                            new int[] {1, 3},
                                            new int[] {0},
                                            new int[] {3, 1},
                                            new int[] {2}
                                        })
                                .difference(Projection.of(new int[] {4, 2})))
                .isEqualTo(
                        Projection.of(
                                new int[][] {new int[] {1, 3}, new int[] {0}, new int[] {2, 1}}));

        assertThatThrownBy(
                        () ->
                                Projection.of(new int[] {1, 2, 3, 4})
                                        .difference(
                                                Projection.of(
                                                        new int[][] {
                                                            new int[] {2}, new int[] {3, 4}
                                                        })))
                .isInstanceOf(IllegalArgumentException.class);
    }