protected BlockingQueue<Combination> permuteWithEqualOrMorePositionsThanObjects(List<DataObject> remainingObjects,
                                                                                  List<Position> remainingPositions,
                                                                                  Combination currentCombination,
                                                                                  BlockingQueue<Combination> runningList) throws InterruptedException {
        if (Thread.currentThread().isInterrupted()) {
            return null;
        } else if (remainingObjects.isEmpty()) {
            if (!currentCombination.isEmpty()) runningList.put(currentCombination);
        } else {
            List<DataObject> updatedRemainingObjects = new ArrayList<>(remainingObjects);
            DataObject remainingObject = remainingObjects.get(0);
            updatedRemainingObjects.remove(remainingObject);
            for (Position remainingPosition : remainingPositions) {
                List<Position> updatedRemainingPositions = new ArrayList<>(remainingPositions);
                updatedRemainingPositions.remove(remainingPosition);

                Combination updatedCombination = new Combination(currentCombination);
                updatedCombination.addMapping(remainingPosition, remainingObject);

                permuteWithEqualOrMorePositionsThanObjects(updatedRemainingObjects,
                        updatedRemainingPositions,
                        updatedCombination,
                        runningList);
            }
        }

        return runningList;
    }