nur-sery/nur_src/mapper/base/ProducerAggregate.php

79 lines
2.0 KiB
PHP
Raw Permalink Normal View History

2024-04-04 16:26:22 +04:00
<?php
namespace nur\mapper\base;
use ArrayAccess;
use nur\b\coll\TBaseArray;
use nur\b\coll\TGenericArray;
use nur\mapper\base\oobd\IOobdManager;
/**
* Class ProducerAggregate: un aggrégateur de producer, qui fournit les données
* des producers qu'il aggrège
*/
class ProducerAggregate extends Producer implements ArrayAccess {
use TBaseArray, TGenericArray;
function setup(): void {
parent::setup();
foreach ($this->data as &$producer) {
$producer = producer_utils::ensure_producer($producer);
}; unset($producer);
}
function hasOvalue(string $name): bool {
if ($this->_hasOobdValue($name)) {
return true;
} elseif ($this->sharedOobdManager !== null
&& $this->sharedOobdManager->hasOvalue($name)) {
return true;
}
foreach ($this->data as $producer) {
if ($producer instanceof IOobdManager && $producer->hasOvalue($name)) {
return true;
}
}
return false;
}
/**
* l'accès aux données OOB de la chaine de producer n'est possible qu'après
* l'appel de la méthode {@link setup()}
*/
function getOvalue(string $name, $default=null) {
if ($this->_hasOobdValue($name)) {
return $this->_getOobdValue($name, $default);
} elseif ($this->sharedOobdManager !== null
&& $this->sharedOobdManager->hasOvalue($name)) {
return $this->sharedOobdManager->getOvalue($name, $default);
}
foreach ($this->data as $producer) {
if ($producer instanceof IOobdManager && $producer->hasOvalue($name)) {
return $producer->getOvalue($name, $default);
}
}
return null;
}
function producer() {
foreach ($this->data as $producer) {
if ($producer instanceof Producer) {
try {
yield from $producer;
} finally {
$producer->close();
}
$this->return = $producer->getReturn();
} else {
yield from $producer;
}
}
}
protected function teardown(): void {
parent::teardown();
foreach ($this->data as $producer) {
$producer->close();
}
}
}