|
13 | 13 |
|
14 | 14 | namespace Laudis\Neo4j\Databags;
|
15 | 15 |
|
16 |
| -use function bin2hex; |
17 |
| -use Exception; |
18 |
| -use function random_bytes; |
19 |
| -use function substr; |
| 16 | +use function array_unique; |
20 | 17 |
|
21 | 18 | final class Bookmark
|
22 | 19 | {
|
23 | 20 | /** @var list<string> */
|
24 |
| - private array $bookmarks; |
| 21 | + private array $values; |
25 | 22 |
|
26 | 23 | /**
|
27 | 24 | * @param list<string> $bookmarks
|
28 | 25 | */
|
29 |
| - public function __construct(?array $bookmarks = null) |
| 26 | + public function __construct(?iterable $bookmarks = null) |
30 | 27 | {
|
31 |
| - $this->bookmarks = $bookmarks ?? []; |
| 28 | + $this->values = $bookmarks ?? []; |
32 | 29 | }
|
33 | 30 |
|
34 | 31 | public function isEmpty(): bool
|
35 | 32 | {
|
36 |
| - return count($this->bookmarks) === 0; |
| 33 | + return count($this->values) === 0; |
37 | 34 | }
|
38 | 35 |
|
39 | 36 | /**
|
40 | 37 | * @return list<string>
|
41 | 38 | */
|
42 | 39 | public function values(): array
|
43 | 40 | {
|
44 |
| - return $this->bookmarks; |
| 41 | + return $this->values; |
45 | 42 | }
|
46 | 43 |
|
47 | 44 | /**
|
48 |
| - * @throws Exception |
| 45 | + * @param iterable<Bookmark>|null $bookmarks |
49 | 46 | */
|
50 |
| - public function withIncrement(?string $bookmark = null): self |
| 47 | + public static function from(?iterable $bookmarks): self |
51 | 48 | {
|
52 |
| - $copy = $this->bookmarks; |
53 |
| - if ($bookmark === null) { |
54 |
| - $bookmark = $this->generateUuidV4(); |
55 |
| - } |
56 |
| - $copy[] = $bookmark; |
57 |
| - |
58 |
| - return new self($copy); |
59 |
| - } |
| 49 | + $bookmarks ??= []; |
| 50 | + $values = []; |
60 | 51 |
|
61 |
| - /** |
62 |
| - * @throws Exception |
63 |
| - */ |
64 |
| - private function generateUuidV4(): string |
65 |
| - { |
66 |
| - $uuid = random_bytes(16); |
67 |
| - $uuid[6] = ((int) $uuid[6]) & 0x0F | 0x40; |
68 |
| - $uuid[8] = ((int) $uuid[8]) & 0x3F | 0x80; |
69 |
| - $uuid = bin2hex($uuid); |
| 52 | + foreach ($bookmarks as $bookmark) { |
| 53 | + array_push($values, ...$bookmark->values()); |
| 54 | + $values = array_values(array_unique($values)); |
| 55 | + } |
70 | 56 |
|
71 |
| - return substr($uuid, 0, 8).'-' |
72 |
| - .substr($uuid, 8, 4).'-' |
73 |
| - .substr($uuid, 12, 4).'-' |
74 |
| - .substr($uuid, 16, 4).'-' |
75 |
| - .substr($uuid, 20, 12); |
| 57 | + return new self($values); |
76 | 58 | }
|
77 | 59 | }
|
0 commit comments