for testing and deploying your application
for finding and fixing issues
for empowering human code reviews
<?php
namespace Recurrence;
use Recurrence\Model\Recurrence;
use Recurrence\Provider\DatetimeProviderFactory;
use Recurrence\Validator\RecurrenceValidator;
/**
* Class DatetimeProvider
* @package Recurrence
*/
class DatetimeProvider
{
* @param Recurrence $recurrence
* @return array<\DateTime>
public function provide(Recurrence $recurrence)
RecurrenceValidator::validate($recurrence);
$provider = DatetimeProviderFactory::create($recurrence);
$datetimes = $provider->provide($recurrence);
if (!$recurrence->hasConstraints()) {
return $datetimes;
}
$filteredDatetimes = [];
$previousDatetime = null;
foreach ($datetimes as $key => $datetime) {
$filteredDatetime = $datetime;
// Apply each constraint on current datetime
foreach ($recurrence->getConstraints() as $constraint) {
$filteredDatetime = $constraint->apply($recurrence, $filteredDatetime);
if ($recurrence->hasPeriodEndAt() && $datetime > $recurrence->getPeriodEndAt()) {
break;
// Avoid duplicate datetime due to constraint updates
if (empty($filteredDatetimes) || $previousDatetime != $filteredDatetime) {
$filteredDatetimes[] = $filteredDatetime;
$previousDatetime = $filteredDatetime;
return $filteredDatetimes;