/*
conjuntos.js

Uma biblioteca que implementa algumas funcoes de
Teoria dos Conjuntos, em JavaScript.

Versao:1.0.0

Autor: Jeronimo Fagundes da Silva
(jeronimo@jeronimohome.com) (http://jeronimohome.com)

Voce pode usar essa biblioteca livremente, e tambem
realizar as alteracoes que achar necessario.
Apenas nao esqueca de manter nessa biblioteca os devidos creditos.
Caso queira enviar-me suas modificacoes/contribucoes para essa
biblioteca, envie para jeronimo@jeronimohome.com, e,
se for possivel, publicarei como uma nova release, tambem com os
devidos creditos ao autor das modificacoes.
*/

//Definicao de elemento
function elemento(novo_valor){
  this.valor = new String(novo_valor);
}

//Definicao de conjunto
function conjunto(nome_conjunto){
  this.nome = nome_conjunto;
  this.elementos = new Array();

  //Funcoes de manipulacao
  
  //Insere elemento no conjunto
  //Valores de retorno possiveis:
  // 1 : inserido com sucesso
  // 0 : nao conseguiu inserir
  // -1 : o elemento ja existe no conjunto
  this.inserir = function inserir(novo_elem){
    i = this.elementos.length;
    l=0;
    for(k=0;k<i;k++){
      if(this.elementos[k].valor.toString()==novo_elem.valor.toString()){
        l=1;
        break;
      }
    }
    if(l==0){
        j = this.elementos.push(novo_elem);
        if(i!=(j+1)){
          return(0);
        }
        else {
          return(1);
        }
    }
    else return(-1);
    
  }
  
  //Retira elemento do conjunto
  //Valores de retorno possiveis:
  // true : retirado com sucesso
  // false : nao havia tal elemento no conjunto
  this.retirar = function retirar(elem){
    j=false;
    for(i=0; i<this.elementos.length; i++){
      if(this.elementos[i].valor.toString()==elem.valor.toString()){
        j=true;
        break;
      }
    }
    if(j){
      var temp = new Array();
      for(k=0; k<i; k++){
        temp.push(this.elementos.shift());
      }
      this.elementos.shift();
      for(k=0; k<i; k++){
        this.elementos.push(temp.shift());
      }
      return(true);
    }
    else{
      return(false);
    }
  }
  
  //Verifica se elemento esta no conjunto
  //Valores de retorno possiveis:
  // true : o elemento esta no conjunto
  // false : o elemento nao esta no conjunto
  this.contem = function contem(elem){
    for(i=0; i<this.elementos.length; i++){
      if(this.elementos[i].valor.toString() == elem.valor.toString()){
        return(true);
      }
    }
    return(false);
  }
  
  //Imprime o conjunto
  this.mostra = function mostra(){
    retorno = new String();
    retorno = this.nome + " = { ";
    for(i=0; i<this.elementos.length; i++){
      if(i!=this.elementos.length -1){
        retorno = retorno + this.elementos[i].valor + ", ";
      }
      else {
        retorno = retorno + this.elementos[i].valor;
      }
    }
    retorno = retorno  + " }";
    return(retorno);
  }
}

