<?php /** @noinspection PhpIllegalPsrClassPathInspection */

namespace Kicken\Chat;


class StreamSelector {
    /** @var ISelectable[] */
    private array $mStreams = [];

    public function __construct(){
    }

    public function addStream(ISelectable $s) : void{
        $this->mStreams[] = $s;
    }

    public function hasStreams() : bool{
        return count($this->mStreams) > 0;
    }

    public function select(?int $seconds = null, ?int $microseconds = null) : void{
        $r = [];
        $w = [];
        $e = [];

        foreach ($this->mStreams as $stream){
            if (($resource = $stream->getResource()) !== null){
                $r[] = $resource;
                $e[] = $resource;
                if ($stream->hasPendingWrites()){
                    $w[] = $resource;
                }
            }
        }

        if (stream_select($r, $w, $e, $seconds, $microseconds)){
            foreach ($this->mStreams as $stream){
                $resource = $stream->getResource();
                if (in_array($resource, $w, true)){
                    $stream->nowWritable();
                }
                if (in_array($resource, $r, true)){
                    $stream->nowReadable();
                }
            }
        }
    }
}