- }
-
- /**
- * Corta un intervalo, devolviendo el intervalo previo a la hora de corte.
- * El intervalo actual queda con el intervalo posterior a la hora de corte.
- *
- * @param mixed $h Donde cortar.
- *
- * @return object Intervalo Intervalo anterior a la hora de corte.
- */
- function cortarHora($h)
- {
- if (!is_a($h, 'hora')) return false;
- $class = get_class($this);
- $r = new $class;
- $r->copy($this);
- if($this->inicio->greater($h)) {
- $r->setFin($r->inicio);
- return $r;
- }
- if($this->fin->lowerEqual($h)) {
- $this->setInicio($this->fin);
- }else{
- $this->setInicio($h);
- $r->setFin($h);
- }
- return $r;
- }
-
- /**
- * Corta un intervalo, devolviendo el intervalo previo al intervalo de corte.
- * El intervalo actual queda con el intervalo posterior al intervalo de corte.
- *
- * @param mixed $i Donde cortar.
- *
- * @return object Intervalo Intervalo anterior al intervalo de corte.
- */
- function cortarIntervalo($i)
- {
- if (!is_a($i, 'intervalo')) return false;
- $ant = $this->cortarHora($i->inicio);
- $this->cortarHora($i->fin);
- return $ant;
- }
+
+ function fusionar($i)
+ {
+ if (!$this->seSuperpone($i) && !$this->esAdyacente($i)) {
+ return false;
+ }
+ if ($i->fin->greater($this->fin)) {
+ $this->fin = $i->fin;
+ }
+ if ($i->inicio->lower($this->inicio)) {
+ $this->inicio = $i->inicio;
+ }
+ return true;
+ }
+
+ function superponer($i)
+ {
+ $inicio = $this->inicio;
+ $fin = $this->fin;
+ if ($this->inicio->lower($i->inicio)) {
+ $inicio = $i->inicio;
+ }
+ if ($this->fin->greater($i->fin)) {
+ $fin = $i->fin;
+ }
+ $fin->subtract($inicio);
+ return $fin;
+ }
+
+ /**
+ * Corta un intervalo, devolviendo el intervalo previo al punto de corte.
+ * El intervalo actual queda con el intervalo posterior al punto de corte.
+ * El punto de corte puede ser tanto una hora como un intervalo.
+ *
+ * @param mixed $c Donde cortar.
+ *
+ * @return object Intervalo Intervalo anterior al punto de corte.
+ */
+ function cortar($c)
+ {
+ if(is_a($c, 'mecon_tiempo_hora')) {
+ return $this->cortarHora($c);
+ } elseif (is_a($c, 'mecon_tiempo_intervalo')) {
+ return $this->cortarIntervalo($c);
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * Corta un intervalo, devolviendo el intervalo previo a la hora de corte.
+ * El intervalo actual queda con el intervalo posterior a la hora de corte.
+ *
+ * @param mixed $h Donde cortar.
+ *
+ * @return object Intervalo Intervalo anterior a la hora de corte.
+ */
+ function cortarHora($h)
+ {
+ $class = get_class($this);
+ $r = new $class;
+ $r->copy($this);
+ if($this->inicio->greater($h)) {
+ $r->setFin($r->inicio);
+ return $r;
+ }
+ if($this->fin->lowerEqual($h)) {
+ $this->setInicio($this->fin);
+ } else {
+ $this->setInicio($h);
+ $r->setFin($h);
+ }
+ return $r;
+ }
+
+ /**
+ * Corta un intervalo, devolviendo el intervalo previo al intervalo de corte.
+ * El intervalo actual queda con el intervalo posterior al intervalo de corte.
+ *
+ * @param mixed $i Donde cortar.
+ *
+ * @return object Intervalo Intervalo anterior al intervalo de corte.
+ */
+ function cortarIntervalo($i)
+ {
+ $ant = $this->cortarHora($i->inicio);
+ $this->cortarHora($i->fin);
+ return $ant;
+ }