<?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$wtrue)){
                    
$stream->nowWritable();
                }
                if (
in_array($resource$rtrue)){
                    
$stream->nowReadable();
                }
            }
        }
    }
}