- }
-
- /**
- * 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;
+
+ function fusionar( $f ) {
+ if(! is_a($f, 'mecon_tiempo_intervalo'))
+ return false;
+ if(! $this->seSuperpone( $f ))
+ return false;
+ if($f->fin->greater($this->fin))
+ $this->fin = $f->fin;
+ if($f->inicio->lower($this->inicio))
+ $this->inicio = $f->inicio;
+ return true;
+ }
+
+ function superponer( $i ) {
+ if(! is_a($i, 'mecon_tiempo_intervalo'))
+ return false;
+ $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) {
+ if (!is_a($h, 'mecon_tiempo_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;