@Override
    public ValueSet canonicalize(boolean removeSafeConstants)
    {
        if (removeSafeConstants) {
            // Since we cannot create a set with multiple entries but same "constant", we just use number of entries
            return new EquatableValueSet(
                    type,
                    whiteList,
                    singleton(new ValueEntry(INTEGER, Utils.nativeValueToBlock(INTEGER, (long) entries.size()))));
        }
        return new EquatableValueSet(
                type,
                whiteList,
                // As comparing blocks is messy, we just sort by block hash hoping for the best
                entries.stream().sorted(comparing(ValueEntry::hashCode)).collect(toLinkedSet()));
    }
@Test
    public void testCanonicalize()
            throws Exception
    {
        assertSameSet(EquatableValueSet.all(type(BIGINT)), EquatableValueSet.all(type(BIGINT)), false);
        assertSameSet(
                EquatableValueSet.of(type(BIGINT), 0L, 1L, 3L),
                EquatableValueSet.of(type(BIGINT), 0L, 1L, 3L),
                false);

        assertDifferentSet(
                EquatableValueSet.of(type(BIGINT), 0L, 1L, 3L),
                EquatableValueSet.of(type(BIGINT), 0L, 1L, 2L),
                false);
        assertDifferentSet(EquatableValueSet.all(type(BIGINT)), EquatableValueSet.none(type(BIGINT)), false);
        assertDifferentSet(EquatableValueSet.all(type(BIGINT)), EquatableValueSet.all(type(VARCHAR)), false);

        assertSameSet(
                EquatableValueSet.of(type(BIGINT), 0L, 1L, 3L),
                EquatableValueSet.of(type(BIGINT), 0L, 1L, 2L),
                true);
        assertSameSet(EquatableValueSet.all(type(BIGINT)), EquatableValueSet.all(type(BIGINT)), true);

        assertDifferentSet(
                EquatableValueSet.of(type(BIGINT), 0L, 1L, 3L),
                EquatableValueSet.of(type(INTEGER), 0L, 1L, 3L),
                true);
        assertDifferentSet(EquatableValueSet.all(type(BIGINT)), EquatableValueSet.all(type(BOOLEAN)), true);
    }