public function checkInOrderSequence($events)
{
if (!count($events)) {
return null;
}
$isMatch = true;
$matchingEvents = array();
$earliestEvent = null;
foreach ($events as $event) {
if ($event instanceof Event) {
if (!$earliestEvent || $event->sequenceNumber() > $earliestEvent->sequenceNumber()) {
$matchingEvents[] = $earliestEvent = $event;
continue;
}
} elseif ($event instanceof EventCollection) {
if (!$event->hasEvents()) {
throw new InvalidArgumentException('Cannot verify event order with empty results.');
}
foreach ($event->allEvents() as $subEvent) {
if (!$earliestEvent || $subEvent->sequenceNumber() > $earliestEvent->sequenceNumber()) {
$matchingEvents[] = $earliestEvent = $subEvent;
continue 2;
}
}
} else {
throw new InvalidArgumentException(sprintf('Cannot verify event order with supplied value %s.', $this->assertionRenderer->renderValue($event)));
}
$isMatch = false;
break;
}
if ($isMatch) {
return $this->assertionRecorder->createSuccess($matchingEvents);
}
}