class RandomListChangeIterator<Solution_> extends UpcomingSelectionIterator<Move<Solution_>> {

    private final SingletonInverseVariableSupply inverseVariableSupply;
    private final IndexVariableSupply indexVariableSupply;
    private final ListVariableDescriptor<Solution_> listVariableDescriptor;
    private final Iterator<Object> valueIterator;
    private final Iterator<ElementRef> destinationIterator;

    public RandomListChangeIterator(
            SingletonInverseVariableSupply inverseVariableSupply,
            IndexVariableSupply indexVariableSupply,
            EntityIndependentValueSelector<Solution_> valueSelector,
            DestinationSelector<Solution_> destinationSelector) {
        this.inverseVariableSupply = inverseVariableSupply;
        this.indexVariableSupply = indexVariableSupply;
        this.listVariableDescriptor = (ListVariableDescriptor<Solution_>) valueSelector.getVariableDescriptor();
        this.valueIterator = valueSelector.iterator();
        this.destinationIterator = destinationSelector.iterator();
    }

    @Override
    protected Move<Solution_> createUpcomingSelection() {<FILL_FUNCTION_BODY>}
}

        if (!valueIterator.hasNext() || !destinationIterator.hasNext()) {
            return noUpcomingSelection();
        }

        Object upcomingValue = valueIterator.next();
        ElementRef destination = destinationIterator.next();

        return new ListChangeMove<>(
                listVariableDescriptor,
                inverseVariableSupply.getInverseSingleton(upcomingValue),
                indexVariableSupply.getIndex(upcomingValue),
                destination.getEntity(),
                destination.getIndex());
    
<methods>public non-sealed void <init>() ,public boolean hasNext() ,public Move<Solution_> next() ,public java.lang.String toString() <variables>protected boolean hasUpcomingSelection,protected boolean upcomingCreated,protected Move<Solution_> upcomingSelection