. // }}} namespace App\Util\ds; use Ds\Deque; use Functional as F; class RingBuffer implements \Serializable { private int $capacity; private Deque $elements; public function __construct(int $c) { $this->capacity = $c; $this->elements = new Deque(); } public function serialize() { return serialize($this->capacity) . serialize($this->elements); } public function unserialize($data) { list($this->capacity, $this->elements) = F\map(explode(';', $data), F\ary('unserialize', 1)); } public function add($e) { if ($this->capacity !== 0 && $this->elements->count() >= $this->capacity) { $this->elements->shift(); } $this->elements->unshift($e); } public function remove(int $index) { return $this->elements->remove($index); } }