Initial Release

This commit is contained in:
Jérôme Gamez
2021-12-10 16:09:27 +01:00
commit 10c02d2b49
28 changed files with 986 additions and 0 deletions
+12
View File
@@ -0,0 +1,12 @@
<?php
declare(strict_types=1);
namespace Beste;
use Psr\Clock\ClockInterface;
interface Clock extends ClockInterface
{
}
+47
View File
@@ -0,0 +1,47 @@
<?php
declare(strict_types=1);
namespace Beste\Clock;
use Beste\Clock;
use DateTimeImmutable;
use DateTimeZone;
use Psr\Clock\ClockInterface;
final class FrozenClock implements Clock
{
private DateTimeImmutable $frozenAt;
private function __construct(DateTimeImmutable $frozenAt)
{
$this->frozenAt = $frozenAt;
}
public static function at(DateTimeImmutable $time): self
{
return new self($time);
}
public static function withNowFrom(ClockInterface $clock): self
{
return new self($clock->now());
}
public static function fromUTC(): self
{
return new self(new DateTimeImmutable('now', new DateTimeZone('UTC')));
}
public function setTo(DateTimeImmutable $time): self
{
$this->frozenAt = $time;
return $this;
}
public function now(): DateTimeImmutable
{
return clone $this->frozenAt;
}
}
+42
View File
@@ -0,0 +1,42 @@
<?php
declare(strict_types=1);
namespace Beste\Clock;
use Beste\Clock;
use DateTimeImmutable;
use DateTimeZone;
use InvalidArgumentException;
use Throwable;
final class LocalizedClock implements Clock
{
private DateTimeZone $timeZone;
private function __construct(DateTimeZone $timeZone)
{
$this->timeZone = $timeZone;
}
/**
* @param DateTimeZone|string $timeZone
*/
public static function in($timeZone): self
{
if (is_string($timeZone)) {
try {
$timeZone = new DateTimeZone($timeZone);
} catch (Throwable $e) {
throw new InvalidArgumentException($e->getMessage());
}
}
return new self($timeZone);
}
public function now(): DateTimeImmutable
{
return new DateTimeImmutable('now', $this->timeZone);
}
}
+37
View File
@@ -0,0 +1,37 @@
<?php
declare(strict_types=1);
namespace Beste\Clock;
use Beste\Clock;
use DateTimeImmutable;
use Psr\Clock\ClockInterface;
final class MinuteClock implements Clock
{
private ClockInterface $clock;
private function __construct(ClockInterface $clock)
{
$this->clock = $clock;
}
public static function wrapping(ClockInterface $clock): self
{
return new self($clock);
}
public function now(): DateTimeImmutable
{
return $this->floor($this->clock->now());
}
private function floor(DateTimeImmutable $now): DateTimeImmutable
{
return $now->setTime(
(int) $now->format('H'),
(int) $now->format('i')
);
}
}
+25
View File
@@ -0,0 +1,25 @@
<?php
declare(strict_types=1);
namespace Beste\Clock;
use Beste\Clock;
use DateTimeImmutable;
final class SystemClock implements Clock
{
private function __construct()
{
}
public static function create(): self
{
return new self();
}
public function now(): DateTimeImmutable
{
return new DateTimeImmutable();
}
}
+29
View File
@@ -0,0 +1,29 @@
<?php
declare(strict_types=1);
namespace Beste\Clock;
use Beste\Clock;
use DateTimeImmutable;
use DateTimeZone;
final class UTCClock implements Clock
{
private DateTimeZone $timeZone;
private function __construct()
{
$this->timeZone = new DateTimeZone('UTC');
}
public static function create(): self
{
return new self();
}
public function now(): DateTimeImmutable
{
return new DateTimeImmutable('now', $this->timeZone);
}
}
+17
View File
@@ -0,0 +1,17 @@
<?php
namespace Psr\Clock;
if (class_exists('\Psr\Clock\ClockInterface')) {
return;
}
use DateTimeImmutable;
interface ClockInterface
{
/**
* Returns the current time as a DateTimeImmutable Object
*/
public function now(): DateTimeImmutable;
}