Skip to content

Commit 12a5789

Browse files
committed
Implement Memoize<T>
1 parent 7948bc2 commit 12a5789

File tree

2 files changed

+54
-19
lines changed

2 files changed

+54
-19
lines changed

src/Reflection/Adapter/ReflectionEnum.php

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
use Roave\BetterReflection\Reflection\ReflectionMethod as BetterReflectionMethod;
1919
use Roave\BetterReflection\Reflection\ReflectionProperty as BetterReflectionProperty;
2020
use Roave\BetterReflection\Util\FileHelper;
21+
use Roave\BetterReflection\Util\Memoize;
2122
use ValueError;
2223

2324
use function array_combine;
@@ -33,12 +34,27 @@
3334
*/
3435
final class ReflectionEnum extends CoreReflectionEnum
3536
{
36-
/** @var list<ReflectionEnumUnitCase>|list<ReflectionEnumBackedCase>|null */
37-
private array|null $cases = null;
37+
/** @var Memoize<list<ReflectionEnumUnitCase>|list<ReflectionEnumBackedCase>> */
38+
private Memoize $cases;
3839

3940
public function __construct(private BetterReflectionEnum $betterReflectionEnum)
4041
{
4142
unset($this->name);
43+
44+
$this->cases = new Memoize(function() {
45+
$isBacked = $this->betterReflectionEnum->isBacked();
46+
$cases = $this->betterReflectionEnum->getCases();
47+
48+
$mappedCases = [];
49+
foreach ($cases as $case) {
50+
if ($isBacked) {
51+
$mappedCases[] = new ReflectionEnumBackedCase($case);
52+
} else {
53+
$mappedCases[] = new ReflectionEnumUnitCase($case);
54+
}
55+
}
56+
return $mappedCases;
57+
});
4258
}
4359

4460
/** @return non-empty-string */
@@ -533,23 +549,7 @@ public function getCase(string $name): ReflectionEnumUnitCase|ReflectionEnumBack
533549
/** @return list<ReflectionEnumUnitCase>|list<ReflectionEnumBackedCase> */
534550
public function getCases(): array
535551
{
536-
if ($this->cases !== null) {
537-
return $this->cases;
538-
}
539-
540-
$isBacked = $this->betterReflectionEnum->isBacked();
541-
$cases = $this->betterReflectionEnum->getCases();
542-
543-
$mappedCases = [];
544-
foreach ($cases as $case) {
545-
if ($isBacked) {
546-
$mappedCases[] = new ReflectionEnumBackedCase($case);
547-
} else {
548-
$mappedCases[] = new ReflectionEnumUnitCase($case);
549-
}
550-
}
551-
552-
return $this->cases = $mappedCases;
552+
return $this->cases->memoize();
553553
}
554554

555555
public function isBacked(): bool

src/Util/Memoize.php

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Roave\BetterReflection\Util;
6+
7+
/** @template T */
8+
final class Memoize {
9+
/**
10+
* @var T
11+
* @psalm-suppress PossiblyNullPropertyAssignmentValue
12+
*/
13+
private mixed $cached = null;
14+
15+
/**
16+
* @var callable(): T
17+
*/
18+
private $fn;
19+
20+
/** @param callable(): T $fn */
21+
public function __construct(callable $fn)
22+
{
23+
$this->fn = $fn;
24+
}
25+
26+
/**
27+
* @return T
28+
*/
29+
public function memoize(): mixed {
30+
if ($this->cached === null) {
31+
$this->cached = ($this->fn)();
32+
}
33+
return $this->cached;
34+
}
35+
}

0 commit comments

Comments
 (0)