// --------------------------------------------------------------------------------------------
// archivo  : xssets
// objetivo : header de funciones para manejo de conjuntos|
// --------------------------------------------------------------------------------------------

#ifndef __xsSets_H__
#define __xsSets_H__

// Incluyo la librería Easy
#include "xsEasyC.h"
#include "xslists.h"

// Se Incluyen librerías de c
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "ctype.h"
#include <stdbool.h>
#include <stdarg.h>


// Define el tipo de acuerdo
DefineTipo Lista Conjunto;
DefineTipo ElementoLista ElementoConjunto;

// Objetivo : Obtener la diferencia entre el Conjunto A y el Conjunto B
// Retorna  : Al conjunto A se le eliminan los elementos que estén en B
Conjunto conjuntoDiferencia(Conjunto conjuntoA,    // El Conjunto A
                            Conjunto conjuntoB);   // El Conjunto B

// Objetivo : Obtener la diferencia Simétrica entre el Conjunto A y el Conjunto B
// Retorna  : El conjunto de Elementos que solo están en A  que solo están en B
Conjunto conjuntoDiferenciaSimetrica(Conjunto conjuntoA,    // El Conjunto A
                                     Conjunto conjuntoB);   // El Conjunto B
									 
// Objetivo : Verificar si 2 Conjuntos son disjuntos; es decir que su intersección es vacío
// Retorna  : VERDAD/FALSO
Logico conjuntoDisjunto(Conjunto conjuntoA,    // El Conjunto A
                        Conjunto conjuntoB);   // El Conjunto B

									 
// Objetivo : Obtener un Elemento del Conjunto
// Retorna  : El Elemento del Conjunto
ElementoConjunto conjuntoElemento(Conjunto conjunto,    // El Conjunto
                                  Entero   indice );    // El Indice

// Objetivo : Eliminar un Elemento del Conjunto por Indice
// Retorna  : VERDAD/FALSO
Logico conjuntoEliminar(Conjunto* conjunto,    // Conjunto
                        Entero    indice);     // Indice

// Objetivo : Imprimir los Elementos del Conjunto
// Retorna  : Nada
Vacio conjuntoImprimir(Conjunto conjunto);  // Conjunto a Imprimir

// Objetivo : Imprimir Información de un Elemento del Conjunto
// Retorna  : Nada
Vacio conjuntoImprimirElemento(ElementoConjunto elemento);  // Elemento

// Objetivo : Inicializar el Conjunto
// Retorna  : Nada
Vacio conjuntoInicializar(Conjunto* conjunto);  // Conjunto a Inicializar

// Objetivo : Insertar un Elemento en un Conjunto
// Retorna  : Verdad/Falso
Vacio conjuntoInsertar(Conjunto* conjunto,   // Conjunto donde se inserta
                       Entero    tipo,       // El tipo de dato
	     		       ...);                 // El Dato

					   
// Objetivo : Obtener la Intersección entre el Conjunto A y el Conjunto B
// Retorna  : Un Conjunto con los elementos que son comunes en A y B
Conjunto conjuntoInterseccion(Conjunto conjuntoA,    // El Conjunto A
                              Conjunto conjuntoB);   // El Conjunto B

							
// Objetivo : Obtener el Numero de Elementos del Conjunto
// Retorna  : El número de Elementos del Conjunto; o 0 si está vacío
Entero conjuntoLongitud(Conjunto conjunto);

// Objetivo : Obtener el Producto Cartesiano del Conjunto A y el Conjunto B
// Retorna  : Un Conjunto de pares ordenados del Conjunto A y el Conjunto B
Conjunto conjuntoProductoCartesiano(Conjunto conjuntoA,    // El Conjunto A
                                    Conjunto conjuntoB);   // El Conjunto B


// Objetivo : Obtener el Tipo de Elementos del Conjunto, cuando todos son del mismo Tipo
// Retorna  : El Tipo de Conjunto
Entero conjuntoTipo(Conjunto conjunto);    // Conjunto


// Objetivo : Obtener la Unión entre el Conjunto A y el Conjunto B
// Retorna  : Un Conjunto con los elementos de A y B
Conjunto conjuntoUnion(Conjunto conjuntoA,    // El Conjunto A
                       Conjunto conjuntoB);   // El Conjunto B


// Objetivo : Vaciar los Elementos del Conjunto
// Retorna  : Nada. El Conjunto queda vacío
Vacio conjuntoVaciar(Conjunto* conjunto);    // Conjunto que quedará vacío
							
// Objetivo : Verifica si el Conjunto está vacío
// Retorna  : VERDAD/FALSO
Logico conjuntoVacio(Conjunto conjunto);    


// fin de la Definición del Archivo
#endif