<?php

namespace Graphp\Algorithms;

use Graphp\Algorithms\BaseGraph;
use Fhaculty\Graph\Edge\Directed as EdgeDirected;
use Fhaculty\Graph\Edge\Undirected as EdgeUndirected;

/**
 * Basic algorithms for working with the undirected or directed Graphs (digraphs) / Walks.
 *
 * @link http://en.wikipedia.org/wiki/Glossary_of_graph_theory#Direction
 * @link http://en.wikipedia.org/wiki/Digraph_%28mathematics%29
 */
class Directed extends BaseDual
{
    /**
     * checks whether the graph has any directed edges
     *
     * This method is intentionally not named "isDirected()" (aka digraph),
     * because that might be misleading in regards to empty and/or mixed graphs.
     *
     * @return boolean
     */
    public function hasDirected()
    {
        foreach ($this->set->getEdges() as $edge) {
            if ($edge instanceof EdgeDirected) {
                return true;
            }
        }

        return false;
    }

    /**
     * checks whether the graph has any undirected edges
     *
     * This method is intentionally not named "isUndirected()",
     * because that might be misleading in regards to empty and/or mixed graphs.
     *
     * @return boolean
     */
    public function hasUndirected()
    {
        foreach ($this->set->getEdges() as $edge) {
            if ($edge instanceof EdgeUndirected) {
                return true;
            }
        }

        return false;
    }

    /**
     * checks whether this is a mixed graph (contains both directed and undirected edges)
     *
     * @return boolean
     * @uses self::hasDirected()
     * @uses self::hasUndirected()
     */
    public function isMixed()
    {
        return ($this->hasDirected() && $this->hasUndirected());
    }
}
