<?php

namespace NoccyLabs\Ipc\Interop\Channel;

/**
 * The MultiChannel is used to create a single channel and allow other threads
 * to each grab an end of it. Think for example a web server that could write
 * log output to a channel (as it´the MultiStreamChannel is always open); one
 * thread could grab a channel to dump it to the console, and another thread
 * could write to a logfile.
 */
class MultiStreamChannel implements ChannelInterface
{

    protected $clients = [];

    /**
     * Create a new client to receive data sent to the channel
     *
     * @return StreamChannel
     */
    public function createClient(): StreamChannel
    {
        [ $a, $b ] = StreamChannel::createPair();
        $this->clients[] = $a;
        return $b;
    }

    /**
     * {@inheritDoc}
     *
     * @return boolean
     */
    public function isOpen(): bool
    {
        return true;
    }

    /**
     * {@inheritDoc}
     *
     * @param mixed $data
     * @return void
     */
    public function send($data)
    {
        foreach ($this->clients as $client) {
            $client->send($data);
        }
    }

    /**
     * {@inheritDoc}
     *
     * @return mixed
     */
    public function receive()
    {
        foreach ($this->clients as $client) {
            if ($read = $client->receive()) {
                return $read;
            }
        }
        return false;
    }

}