/**
  * Create a signal collection from array.
  *
  * @param  array $array
  * @return GraphCommons\Graph\SignalCollection
  * @throws \InvalidArgumentException
  */
 public static final function fromArray(array $array) : SignalCollection
 {
     if (empty($array)) {
         throw new \InvalidArgumentException('Empty signals array given!');
     }
     $signals = new SignalCollection();
     foreach ($array as $array) {
         if (!isset($array['action'], $array['parameters'])) {
             throw new \InvalidArgumentException("Signal 'action' and 'parameters' fields are required!");
         }
         $signal = (new Signal())->setAction($array['action'])->setParameters($array['parameters']);
         $signals->add($signal);
     }
     return $signals;
 }
 /**
  * Fill a lib's graph object.
  *
  * @param  GraphCommons\Graph\Graph $graph
  * @param  array|object $g
  * @return GraphCommons\Graph\Graph
  */
 private final function fillGraph(Graph $graph, $g) : Graph
 {
     // force input being an object
     $g = Util::toObject($g);
     if (isset($g->id)) {
         $graph->setId($g->id)->setName($g->name)->setDescription($g->description)->setSubtitle($g->subtitle)->setStatus($g->status)->setCreatedAt($g->created_at);
         // add signals if exists
         if (isset($g->signals)) {
             $array = [];
             foreach ($g->signals as $i => $signal) {
                 $action = $signal->action;
                 unset($signal->action);
                 $array[$i]['action'] = Signal::detectAction($action);
                 $array[$i]['parameters'] = Util::toArray($signal);
             }
             $graph->setSignals(SignalCollection::fromArray($array));
         }
     }
     return $graph;
 }