pathToRepository = $pathToRepository; } public function load(): void { if (!is_file($this->pathToRepository) || !is_readable($this->pathToRepository)) { throw new \Exception("Unable to locate repository {$this->pathToRepository}"); } if (($fp = fopen($this->pathToRepository, 'r')) === FALSE) { throw new \Exception("Unable to read from repository {$this->pathToRepository}"); } while (($data = fgetcsv($fp)) !== FALSE) { $this->repository[] = new Bookmark( $data[0], // Id. $data[1], // Url. $data[2], // Title. $data[3], // Tag. $data[4], // Added At. (bool)$data[4], // Read. ); } fclose($fp); } public function sort(bool $asc = true): BookmarkRepository { usort($this->repository, function ($a, $b) use ($asc) { return $asc ? $a->addedAt <=> $b->addedAt : $b->addedAt <=> $a->addedAt; }); return $this; } public function filter(string $tag): BookmarkRepository { $this->repository = array_filter( $this->repository, fn($bookmark) => $bookmark->tag === $tag ); return $this; } public function add(Bookmark $bookmark): bool { if (($fp = fopen($this->pathToRepository, 'a')) === FALSE) { throw new \Exception("Unable to open repository {$this->pathToRepository}"); } $saved = fputcsv($fp, [ $bookmark->id, $bookmark->url, $bookmark->title, $bookmark->tag, $bookmark->addedAt, (int)$bookmark->unread, ]); fclose($fp); return $saved !== false; } public function current(): mixed { return $this->repository[$this->position]; } public function key(): mixed { return $this->position; } public function next(): void { ++$this->position; } public function rewind(): void { $this->position = 0; } public function valid(): bool { return isset($this->repository[$this->position]); } }