/** * @param RideNode $feasibleNode * @param RideNodeList $rideNodeList * @throws \Exception * @return mixed */ private function checkIfNodeIsFeasibleForNodeList(RideNode $feasibleNode, RideNodeList $rideNodeList) { /** @var RideNode $listNode */ $listNode = $rideNodeList->getFirstNode(); $counter = 0; while (null !== $listNode) { if ($this->checkOverlappingNodes($feasibleNode, $listNode)) { // overlapping nodes return RideDTO::MAYBE; } elseif ($feasibleNode->endMinute < $listNode->startMinute) { // feasible node is left $rideNodeList->addRideNodeBeforeRideNode($feasibleNode, $listNode); return $this->checkEmptyRidesInNodeList($rideNodeList, $feasibleNode); } elseif ($listNode === $rideNodeList->getLastNode()) { // feasible node is right of last node $rideNodeList->addRideNodeAfterRideNode($feasibleNode, $listNode); return $this->checkEmptyRidesInNodeList($rideNodeList, $feasibleNode); } else { // feasible node is in between two nodes, check next node $listNode = $listNode->nextNode; $counter = $this->incrementAndTestLoopCounter($counter); } } return RideDTO::YES; // vehicle driving pool is empty }