public static Arbitrary<MessageSchema> messageSchema()
    {
        return Combinators.combine(
            withDuplicates(
                3,
                skewedFieldDistribution().list().ofMaxSize(10)
            ),
            groupSchema(MAX_GROUP_DEPTH).list().ofMaxSize(3),
            varDataSchema().list().ofMaxSize(3)
        ).as(MessageSchema::new);
    }
This combinator adds duplicates to an arbitrary list. We prefer this to JQwik's built-in functionality,
as that is inefficient and dominates test runs.
<p>
This method works by generating a list of integers, which represent, in an alternating manner,
the number of items to skip before <i>selecting</i> an item to duplicate
and the number of items to skip before <i>inserting</i> the duplicate.

@param maxDuplicates the maximum number of duplicates to add
@param arbitrary     the arbitrary list to duplicate items in
@param <T>           the type of the list
@return an arbitrary list with duplicates
sbe-tool/src/propertyTest/java/uk/co/real_logic/sbe/properties/arbitraries/SbeArbitraries.java