<?php
/** @license MIT
 * Copyright 2017 J. King, Dustin Wilson et al.
 * See LICENSE and AUTHORS files for details */

declare(strict_types=1);

namespace JKingWeb\Arsse\Db;

abstract class AbstractResult implements Result {
    protected $pos = 0;
    protected $cur = null;

    // actual public methods

    public function getValue() {
        if ($this->valid()) {
            $out = array_shift($this->cur);
            $this->next();
            return $out;
        } else {
            return null;
        }
    }

    public function getRow(): ?array {
        if ($this->valid()) {
            $out = $this->cur;
            $this->next();
            return $out;
        } else {
            return null;
        }
    }

    public function getAll(): array {
        return iterator_to_array($this, false);
    }

    abstract public function changes(): int;

    abstract public function lastId(): int;

    // PHP iterator methods

    abstract public function valid();

    public function next() {
        $this->cur = null;
        $this->pos += 1;
    }

    public function current() {
        return $this->cur;
    }

    public function key() {
        return $this->pos;
    }

    public function rewind() {
        if ($this->pos) {
            throw new Exception("resultReused");
        }
    }
}