private void createPatternsImpl(final AngleUnitFlapPattern seed,
			final LineType typeToBeAdded, final int indexToAdd, final int additionCount,
			final int aimedAdditionCount) {

		recursionCount++;

		if (acceptablePatternCondition.holds(seed)) {
			patterns.add(seed.cloneInstance());
		}

		if (additionCount == aimedAdditionCount) {
			LOGGER.debug(seed);
			return;
		}

		int remainChances = tailIndex + 1 - indexToAdd;
		int possibleMaxAdditionCount = additionCount + remainChances;
		if (possibleMaxAdditionCount < aimedAdditionCount) {
			return;
		}

		if (indexToAdd > tailIndex) {
			return;
		}

		for (int i = indexToAdd; i <= tailIndex; i++) {
			if (!seed.isEmptyAt(i)) {
				continue;
			}

			seed.set(i, typeToBeAdded);
			if (!pruningCondition.holds(seed)) {
				createPatternsImpl(seed, typeToBeAdded, i + 1, additionCount + 1,
						aimedAdditionCount);
			}

			seed.set(i, LineType.EMPTY);
		}
	}