<?php 
 
namespace Infrastructure\Repository; 
 
use ArrayIterator; 
use Domain\Page; 
use RuntimeException; 
 
class PageRepository 
{ 
    /** 
     * @var array $pages 
     */ 
    protected $pages = []; 
 
    /** 
     * @param Page $page 
     */ 
    public function store(Page $page): void 
    { 
        $this->pages[$page->getUrl()] = $page; 
    } 
 
    /** 
     * @param string $url 
     * 
     * @return Page 
     */ 
    public function get(string $url): ?Page 
    { 
        return $this->pages[$url] ?? null; 
    } 
 
    /** 
     * Get Iterator for stored pages. 
     * 
     * @return ArrayIterator iterator. 
     */ 
    public function getPagesIterator(): ArrayIterator 
    { 
        return new ArrayIterator($this->pages); 
    } 
 
    /** 
     * Sort the contents of the repository using the uasort() function. Affects the crawl order 
     * of the contents of the repository using an iterator obtained from PageRepository :: getPagesIterator (). 
     * 
     * @param callable $compareFunction - callable function for uasort function. 
     * @throws RuntimeException 
     */ 
    public function order(callable $compareFunction): void 
    { 
        if (!uasort($this->pages, $compareFunction)) { 
            throw new RuntimeException('Error sorting results.'); 
        } 
    } 
} 
 
 |