All pastes #201076 Raw Edit

Something

public text v1 · immutable
#201076 ·published 2006-10-13 16:05 UTC
rendered paste body
module Teatro (nuevoT,
               salasT,
               funcionesT,
               elencoEstableT,
               sueldoT,
               nombrarArtistaT,
               eliminarArtistaT,
               programarFuncionT,
               venderEntradaT,
               costoDeUnaFuncionT,
               balanceT,
               unaAlLadoDeLaOtraT,
               ) where
                       
import Tipos
import Funcion
import Entrada
import Sala
import Fecha
import Hora
 
data Teatro = Tea [Sala] [Funcion] [Nombre] [Moneda] [Entrada] deriving (Eq)
 
instance Show Teatro 
        where show t = show (funcionesT t) ++ show (elencoEstableT t)
 
nuevoT :: [Sala] -> Teatro
nuevoT ss = Tea ss [] [] [] []
 
salasT :: Teatro -> [Sala]
salasT (Tea ss _ _ _ _) = ss
 
funcionesT :: Teatro -> [Funcion]
funcionesT (Tea _ fs _ _ _) = fs
 
elencoEstableT :: Teatro -> [Nombre]
elencoEstableT (Tea _ _ acts _ _) = acts
 
sueldoT :: Teatro -> Nombre -> Moneda
sueldoT (Tea _ _ acts ss _) nom | nom `elem` acts = ss !! (pos nom acts)
								| otherwise = error "el artista no esta"
 
nombrarArtistaT :: Teatro -> Nombre -> Moneda -> Teatro
nombrarArtistaT (Tea sls fncs acts ss es) nom sue = Tea sls fncs (nom:acts) (sue:ss) es
 
eliminarArtistaT :: Teatro -> Nombre -> Teatro
eliminarArtistaT teatro@(Tea sls funs acts ss es) artista = (Tea sls funs artistaQuitado sueldoQuitado es)
                              where artistaQuitado = (sacarElementoN (pos artista (elencoEstableT teatro)) acts)
                                    sueldoQuitado = (sacarElementoN  (pos artista (elencoEstableT teatro)) ss)
 
programarFuncionT :: Teatro -> Funcion -> Teatro
programarFuncionT (Tea sls fncs acts ss es) fun = Tea sls (fun:fncs) acts ss es
 
venderEntradaT :: Teatro -> Entrada -> Teatro
venderEntradaT (Tea sala funcion estable sueldo entradas) e = Tea sala funcion estable sueldo (e:entradas)
 
costoDeUnaFuncionT :: Teatro -> Funcion -> Moneda
costoDeUnaFuncionT t f = calcularCosto t f
 
balanceT :: Teatro -> Fecha -> Moneda
balanceT t f = sumaBalances t (funcionesHastaLaFecha t f)
 
unaAlLadoDeLaOtraT :: Teatro -> Nombre -> Fecha -> Hora -> Int -> [(Entrada, Entrada)]
unaAlLadoDeLaOtraT t sal fec hor n = iterarSectores t s f n 
                        where s = buscarSala t sal
                              f = buscarFuncion t sal fec hor


----------------
-- Auxiliares --
----------------
 
pos :: Eq a => a -> [a] -> Int
pos a [] = error "La lista no puede estar vacia"
pos a xs | not(a `elem` xs)  = error "El elemento no esta en la lista"
pos a xs = auxPos a xs 0
 
auxPos :: Eq a => a -> [a] -> Int -> Int
auxPos a l i | a == l !! i = i
             | a /= l !! i = auxPos a l (i + 1) 
 
 
-- Devuelve una lista a la que se le saco el elemento de indice n
sacarElementoN :: Int -> [e] -> [e]
sacarElementoN n [] = error "La lista no puede estar vacia"
sacarElementoN n l | n >= length(l) = error "Debe indicar un indice valido"
                   | otherwise = auxSacarElementoN n l 0
 
auxSacarElementoN :: Int -> [e] -> Int -> [e]
auxSacarElementoN n l i | i == (length l) = l
auxSacarElementoN n (x:xs) c | c == n = xs
                             | otherwise = [x] ++ auxSacarElementoN n xs (c+1)
 
-- calcula el costo de una funcion
calcularCosto :: Teatro -> Funcion -> Moneda
calcularCosto t f = (sumarSueldosEstables t (elencoF f)) + (sumarSueldosContratados f (contratadosF f))
 
sumarSueldosEstables :: Teatro -> [Nombre] -> Moneda
sumarSueldosEstables t [] = 0
sumarSueldosEstables t (x:[]) = (sueldoT t x) `div` 30
sumarSueldosEstables t (x:xs) = ((sueldoT t x) `div` 30) + (sumarSueldosEstables t xs)
 
sumarSueldosContratados :: Funcion -> [Nombre] -> Moneda
sumarSueldosContratados f [] = 0
sumarSueldosContratados f (x:[]) = cachetF f x
sumarSueldosContratados f (x:xs) = (cachetF f x) + (sumarSueldosContratados f xs)
 
 
-- devuelve la lista de funciones que tuvieron lugar hasta una cierta fecha
funcionesHastaLaFecha :: Teatro -> Fecha -> [Funcion]
funcionesHastaLaFecha t fec = auxFuncionesHastaLaFecha (funcionesT t) fec
 
auxFuncionesHastaLaFecha :: [Funcion] -> Fecha -> [Funcion]
auxFuncionesHastaLaFecha [] _ = []
auxFuncionesHastaLaFecha (fu:funs) fec | (fechaF fu) <= fec = fu:(auxFuncionesHastaLaFecha funs fec)
                                       | otherwise = auxFuncionesHastaLaFecha funs fec
 
-- devuelve las entradas vendidas a una cierta funcion
entradasParaUnaFuncion :: Teatro -> Funcion -> [Entrada]
entradasParaUnaFuncion (Tea _ _ _ _ es) fun = auxEntradasParaUnaFuncion es fun
 
auxEntradasParaUnaFuncion :: [Entrada] -> Funcion -> [Entrada]
auxEntradasParaUnaFuncion [] fun = []
auxEntradasParaUnaFuncion (e:es) fun | esEntrada e fun = e:(auxEntradasParaUnaFuncion es fun)
                                     | otherwise = auxEntradasParaUnaFuncion es fun
 
-- determina si una entrada corresponde a una funcion
esEntrada :: Entrada -> Funcion -> Bool
esEntrada e fun = (fechaE e == fechaF fun) &&
                  (horaE e == horaF fun) &&
                  (salaE e == salaF fun)
 
-- devuelve la recaudacion de una cierta funcion
recaudacionDeUnaFuncion :: Teatro -> Funcion -> Moneda
recaudacionDeUnaFuncion t f = auxRecaudacionDeUnaFuncion (entradasParaUnaFuncion t f) f
 
auxRecaudacionDeUnaFuncion :: [Entrada] -> Funcion -> Moneda
auxRecaudacionDeUnaFuncion [] _ = 0
auxRecaudacionDeUnaFuncion (e:es) fun = (preciosF fun) !! (sectorE e) +
                                        (auxRecaudacionDeUnaFuncion es fun)
 
-- devuelve el balance de una funcion
balanceDeUnaFuncion :: Teatro -> Funcion -> Moneda
balanceDeUnaFuncion t fun = (recaudacionDeUnaFuncion t fun) - (costoDeUnaFuncionT t fun)
 
-- suma los balances de la lista de funciones que se proporciona
sumaBalances :: Teatro -> [Funcion] -> Moneda
sumaBalances t [] = 0
sumaBalances t (fu:funs) = (balanceDeUnaFuncion t fu) + (sumaBalances t funs) 

-- lista de entradas vendidas
entradasVendidasT :: Teatro -> [Entrada]
entradasVendidasT (Tea sls fncs acts ss es) = es


-- dada un par ordenado y otros datos devuelve un par de entradas
crearEntradas :: (Int, Int) -> Fecha -> Hora -> Nombre -> Int -> Int 
                        -> (Entrada, Entrada)
crearEntradas par fec h sal sec fi = (
        nuevaE fec h sal sec fi (fst par),
        nuevaE fec h sal sec fi (snd par)
        )

-- aplica crearEntradas a una lista de pares de enteros
crearListaEntradas :: [(Int, Int)] -> Fecha -> Hora -> Nombre -> Int -> Int
                        -> [(Entrada, Entrada)]
crearListaEntradas [] _ _ _ _ _ = []
crearListaEntradas (p:ps) fec hor nom sec fil = 
        (crearEntradas p fec hor nom sec fil):(crearListaEntradas ps fec hor nom sec fil)

primeroYUltimo :: [[a]] -> [(a,a)]
primeroYUltimo [] = []
primeroYUltimo (x:xs) = (x !! 0, x !! (length(x) - 1)):(primeroYUltimo xs)


-- devuelve todas las sublistas de N enteros consecutivos
-- que estan contenidas en la lista ordenada que se proporciona
sublConsecDeLargoN :: [Int] -> Int -> [[Int]]
sublConsecDeLargoN l 0 = error "El largo de la sublista debe ser mayor que 0"
sublConsecDeLargoN [] n = []
sublConsecDeLargoN l n | length l < n = []
sublConsecDeLargoN (x:xs) n | esConsecutiva (headN (x:xs) n) = (headN (x:xs) n):(sublConsecDeLargoN xs n)
                            | otherwise = sublConsecDeLargoN xs n

-- determina si una lista ordenada esta hecha de enteros consecutivos
esConsecutiva :: [Int] -> Bool
esConsecutiva [] = error "La lista no puede ser vacia"
esConsecutiva (i:[]) = True
esConsecutiva (i1:i2:is) = (i2 == i1 + 1) && esConsecutiva (i2:is)

-- toma la sublista que va desde el indice 0 hasta el indice n
headN :: [e] -> Int -> [e]
headN l n | n > length l = error "No puedo tomar una sublista mas grande que la lista!"
headN l 0 = []
headN (x:xs) n = x:(headN xs (n-1))

-- determina si una butaca esta ocupada en una cierta funcion
esAsientoVacio :: Teatro -> Funcion -> Int -> Int -> Int -> Bool
esAsientoVacio t fun sec fil but = 
        not (hayEntradaVendida (entradasVendidasT t) fun sec fil but)

-- de ser posible, devuelve el objeto funcion correspondiente
-- a los datos proporcionados
buscarFuncion :: Teatro -> Nombre -> Fecha -> Hora -> Funcion
buscarFuncion t sal fec hor = auxBuscarFuncion (funcionesT t) sal fec hor

auxBuscarFuncion :: [Funcion] -> Nombre -> Fecha -> Hora -> Funcion
auxBuscarFuncion [] sal fec hor = error "Ninguna funcion de la lista cumple los datos pedidos!"
auxBuscarFuncion (f:fs) sal fec hor | salaF f == sal && fechaF f == fec && horaF f == hor = f
                                    | otherwise = auxBuscarFuncion fs sal fec hor

-- de ser posible, devuelve el objeto sala con el nombre proporcionado
-- a los datos proporcionados
buscarSala :: Teatro -> Nombre -> Sala
buscarSala t sal = auxBuscarSala (salasT t) sal

auxBuscarSala :: [Sala] -> Nombre -> Sala
auxBuscarSala [] sal = error "Ninguna sala de la lista cumple los datos pedidos!"
auxBuscarSala (s:ss) sal | nombreS s == sal = s
                         | otherwise = auxBuscarSala ss sal

-- determina si en la lista de entradas que se proporciona hay alguna
-- que sea para l
hayEntradaVendida :: [Entrada] -> Funcion -> Int -> Int -> Int -> Bool
hayEntradaVendida [] f sec fil but = False
hayEntradaVendida (e:es) f sec fil but | sectorE e == sec &&
                                         filaE e == fil &&
                                         butacaE e == but &&
                                         esEntrada e f = True
                                       | otherwise = False || hayEntradaVendida es f sec fil but


-- devuelve una lista de las butacas vacias  en una cierta funcion
-- para un sector y una fila dados
listaButacasVacias :: Teatro -> Sala -> Funcion -> Int -> Int -> [Int]
listaButacasVacias t sal fun sec fil = auxListaButacasVacias t sal fun sec fil 0

auxListaButacasVacias :: Teatro -> Sala -> Funcion -> Int -> Int -> Int -> [Int]
auxListaButacasVacias t sal fun sec fil c | c >= butacasS sal sec fil = []
                                          | esAsientoVacio t fun sec fil c = 
                                                c:auxListaButacasVacias t sal fun sec fil (c+1)
                                          | otherwise = auxListaButacasVacias t sal fun sec fil (c+1)

-- devuelve una lista de pares de entradas cuyas butacas intermedias
-- estan vacias en la funcion correspondiente
listaParesNDistantes :: Teatro -> Sala -> Funcion -> Int -> Int -> Int -> [(Entrada, Entrada)]
listaParesNDistantes t sal fun sec fil n = crearListaEntradas listaents fec hor nomsal sec fil
                where listaents = primeroYUltimo sublsconsec
                      sublsconsec = sublConsecDeLargoN butsvacias n
                      butsvacias = listaButacasVacias t sal fun sec fil
                      fec = fechaF fun
                      hor = horaF fun
                      nomsal = salaF fun

-- itera sobre las filas
iterarFilas :: Teatro -> Sala -> Funcion -> Int -> Int -> [(Entrada, Entrada)]
iterarFilas t sal fun sec n = auxIterarFilas t sal fun sec n 0

auxIterarFilas :: Teatro -> Sala -> Funcion -> Int -> Int -> Int -> [(Entrada, Entrada)]
auxIterarFilas t sal fun sec n c | c >= filasS sal sec = []
                                 | otherwise = (listaParesNDistantes t sal fun sec c n) ++
                                                auxIterarFilas t sal fun sec n (c+1)

-- itera sobre los sectores
iterarSectores :: Teatro -> Sala -> Funcion -> Int -> [(Entrada, Entrada)]
iterarSectores t sal fun n = auxIterarSectores t sal fun n 0

auxIterarSectores :: Teatro -> Sala -> Funcion -> Int -> Int -> [(Entrada, Entrada)]
auxIterarSectores t sal fun n c | c >= (sectoresS sal) = []
                                | otherwise = (iterarFilas t sal fun c n) ++
                                              (auxIterarSectores t sal fun n (c+1))


--                     		                 *********
-- 									         *Pruebas*
--                   		                 *********

s1 = nuevaS "Dorada" [[1],[8,8,8],[10,10,10]]
s2 = nuevaS "Plateada" [[2,1],[3,5],[1],[1,1]]
s3 = nuevaS "Bronce" [[1]]

f11 = nuevaF "Dorada" "El Rey" (nuevaFe 20 10 2006) (nuevaH 21 0) 80 [120,80,50]
f12 = agregarEstableF f11 "E2"
f13 = agregarEstableF f12 "E6"
f14 = agregarEstableF f13 "E7"
f15 = agregarContratadoF f14 "C1" 120
f16 = agregarContratadoF f15 "C2" 80
f17 = agregarContratadoF f16 "C3" 70

fe1 = nuevaFe 20 10 2006
ho1 = nuevaH 21 0

e01_El_Rey = nuevaE (nuevaFe 20 10 2006) (nuevaH 21 0) ("Dorada") 0 0 0
e02_El_Rey = nuevaE (nuevaFe 20 10 2006) (nuevaH 21 0) ("Dorada") 1 0 0
e03_El_Rey = nuevaE (nuevaFe 20 10 2006) (nuevaH 21 0) ("Dorada") 1 0 1
e04_El_Rey = nuevaE (nuevaFe 20 10 2006) (nuevaH 21 0) ("Dorada") 1 0 2
e05_El_Rey = nuevaE (nuevaFe 20 10 2006) (nuevaH 21 0) ("Dorada") 1 0 3
e06_El_Rey = nuevaE (nuevaFe 20 10 2006) (nuevaH 21 0) ("Dorada") 1 0 4
e07_El_Rey = nuevaE (nuevaFe 20 10 2006) (nuevaH 21 0) ("Dorada") 1 0 5
e08_El_Rey = nuevaE (nuevaFe 20 10 2006) (nuevaH 21 0) ("Dorada") 1 0 6
e09_El_Rey = nuevaE (nuevaFe 20 10 2006) (nuevaH 21 0) ("Dorada") 1 1 4
e10_El_Rey = nuevaE (nuevaFe 20 10 2006) (nuevaH 21 0) ("Dorada") 2 0 0
e11_El_Rey = nuevaE (nuevaFe 20 10 2006) (nuevaH 21 0) ("Dorada") 2 0 6
e12_El_Rey = nuevaE (nuevaFe 20 10 2006) (nuevaH 21 0) ("Dorada") 2 0 9
e13_El_Rey = nuevaE (nuevaFe 20 10 2006) (nuevaH 21 0) ("Dorada") 2 1 2
e14_El_Rey = nuevaE (nuevaFe 20 10 2006) (nuevaH 21 0) ("Dorada") 2 1 4
e15_El_Rey = nuevaE (nuevaFe 20 10 2006) (nuevaH 21 0) ("Dorada") 2 2 0
e16_El_Rey = nuevaE (nuevaFe 20 10 2006) (nuevaH 21 0) ("Dorada") 2 2 1


f21 = nuevaF "Plateada" "Rio 2" (nuevaFe 21 10 2006) (nuevaH 23 25) 20 [50,40,30,20]
f22 = agregarEstableF f21 "E4"
f23 = agregarEstableF f22 "E1"
f24 = agregarContratadoF f23 "C1" 120
f25 = agregarContratadoF f24 "C2" 80
f26 = agregarContratadoF f25 "C5" 100
f27 = agregarContratadoF f26 "C6" 70
f28 = agregarEstableF f27 "E2"
f29 = agregarEstableF f28 "E7"

fe2 = nuevaFe 21 10 2006
ho2 = nuevaH 23 25
-- s2 = nuevaS "Plateada" [[2,1],[3,5],[1],[1,1]]

e01_Rio_2 = nuevaE (nuevaFe 21 10 2006) (nuevaH 23 25) ("Plateada") 0 0 1
e02_Rio_2 = nuevaE (nuevaFe 21 10 2006) (nuevaH 23 25) ("Plateada") 0 1 0
e03_Rio_2 = nuevaE (nuevaFe 21 10 2006) (nuevaH 23 25) ("Plateada") 1 0 0
e04_Rio_2 = nuevaE (nuevaFe 21 10 2006) (nuevaH 23 25) ("Plateada") 1 1 2
e05_Rio_2 = nuevaE (nuevaFe 21 10 2006) (nuevaH 23 25) ("Plateada") 3 0 0


f31 = nuevaF "Bronce" "Mi Mujer" (nuevaFe 25 12 2006) (nuevaH 23 00) 59 [500]
f32 = agregarEstableF f31 "E3"
f33 = agregarEstableF f32 "E1"

fe3 = nuevaFe 25 12 2006
ho3 = nuevaH 23 00

-- s3 = nuevaS "Bronce" [[1]]

e01_Mi_Mujer = nuevaE (nuevaFe 25 12 2006) (nuevaH 23 00) ("Bronce") 0 0 0


el_Rey = f17
rio_2 = f29
mi_Mujer = f33

t11 = nuevoT [s1,s2,s3]

t21 = nombrarArtistaT t11 "E1" 500
t22 = nombrarArtistaT t21 "E2" 1000
t23 = nombrarArtistaT t22 "E3" 200
t24 = nombrarArtistaT t23 "E4" 700
t25 = nombrarArtistaT t24 "E5" 450
t26 = nombrarArtistaT t25 "E6" 150
t27 = nombrarArtistaT t26 "E7" 1500

t31 = programarFuncionT t27 el_Rey
t32 = programarFuncionT t31 rio_2
t33 = programarFuncionT t32 mi_Mujer


obrasF :: [Funcion] -> [Nombre]
obrasF  []    = []
obrasF (f:fs) = obraF f : obrasF fs

t401 = venderEntradaT t33 e01_El_Rey
t402 = venderEntradaT t401 e02_El_Rey
t403 = venderEntradaT t402 e03_El_Rey
t404 = venderEntradaT t403 e04_El_Rey
t405 = venderEntradaT t404 e05_El_Rey
t406 = venderEntradaT t405 e06_El_Rey
t407 = venderEntradaT t406 e07_El_Rey
t408 = venderEntradaT t407 e08_El_Rey
t409 = venderEntradaT t408 e09_El_Rey
t410 = venderEntradaT t409 e10_El_Rey
t411 = venderEntradaT t410 e11_El_Rey
t412 = venderEntradaT t411 e12_El_Rey
t413 = venderEntradaT t412 e13_El_Rey
t414 = venderEntradaT t413 e14_El_Rey
t415 = venderEntradaT t414 e15_El_Rey
t416 = venderEntradaT t415 e16_El_Rey

t501 = venderEntradaT t416 e01_Rio_2
t502 = venderEntradaT t501 e02_Rio_2
t503 = venderEntradaT t502 e03_Rio_2
t504 = venderEntradaT t503 e04_Rio_2
t505 = venderEntradaT t504 e05_Rio_2

t601 = venderEntradaT t505 e01_Mi_Mujer

testTipoTeatro = 																																				[(unaAlLadoDeLaOtraT t601 "Dorada" fe1 ho1 15) == []																						,(unaAlLadoDeLaOtraT t601 "Dorada" fe1 ho1 10) == []																						,(unaAlLadoDeLaOtraT t601 "Dorada" fe1 ho1 8) == 																					[(nuevaE fe1 ho1 "Dorada" 1 2 0,nuevaE fe1 ho1 "Dorada" 1 2 7)																										,(nuevaE fe1 ho1 "Dorada" 2 2 2,nuevaE fe1 ho1 "Dorada" 2 2 9)]																																																,(unaAlLadoDeLaOtraT t601 "Dorada" fe1 ho1 4) == 																					[(nuevaE fe1 ho1 "Dorada" 1 1 0,nuevaE fe1 ho1 "Dorada" 1 1 3)																										,(nuevaE fe1 ho1 "Dorada" 1 2 0,nuevaE fe1 ho1 "Dorada" 1 2 3)																										,(nuevaE fe1 ho1 "Dorada" 1 2 1,nuevaE fe1 ho1 "Dorada" 1 2 4)																										,(nuevaE fe1 ho1 "Dorada" 1 2 2,nuevaE fe1 ho1 "Dorada" 1 2 5)																										,(nuevaE fe1 ho1 "Dorada" 1 2 3,nuevaE fe1 ho1 "Dorada" 1 2 6)																										,(nuevaE fe1 ho1 "Dorada" 1 2 4,nuevaE fe1 ho1 "Dorada" 1 2 7)																										,(nuevaE fe1 ho1 "Dorada" 2 0 1,nuevaE fe1 ho1 "Dorada" 2 0 4)																										,(nuevaE fe1 ho1 "Dorada" 2 0 2,nuevaE fe1 ho1 "Dorada" 2 0 5)																										,(nuevaE fe1 ho1 "Dorada" 2 1 5,nuevaE fe1 ho1 "Dorada" 2 1 8)																										,(nuevaE fe1 ho1 "Dorada" 2 1 6,nuevaE fe1 ho1 "Dorada" 2 1 9)																										,(nuevaE fe1 ho1 "Dorada" 2 2 2,nuevaE fe1 ho1 "Dorada" 2 2 5)																										,(nuevaE fe1 ho1 "Dorada" 2 2 3,nuevaE fe1 ho1 "Dorada" 2 2 6)																										,(nuevaE fe1 ho1 "Dorada" 2 2 4,nuevaE fe1 ho1 "Dorada" 2 2 7)																										,(nuevaE fe1 ho1 "Dorada" 2 2 5,nuevaE fe1 ho1 "Dorada" 2 2 8)																										,(nuevaE fe1 ho1 "Dorada" 2 2 6,nuevaE fe1 ho1 "Dorada" 2 2 9)]																										,(unaAlLadoDeLaOtraT t601 "Dorada" fe1 ho1 6) == 																					[(nuevaE fe1 ho1 "Dorada" 1 2 0,nuevaE fe1 ho1 "Dorada" 1 2 5)																										,(nuevaE fe1 ho1 "Dorada" 1 2 1,nuevaE fe1 ho1 "Dorada" 1 2 6)																										,(nuevaE fe1 ho1 "Dorada" 1 2 2,nuevaE fe1 ho1 "Dorada" 1 2 7)																										,(nuevaE fe1 ho1 "Dorada" 2 2 2,nuevaE fe1 ho1 "Dorada" 2 2 7)																										,(nuevaE fe1 ho1 "Dorada" 2 2 3,nuevaE fe1 ho1 "Dorada" 2 2 8)																										,(nuevaE fe1 ho1 "Dorada" 2 2 4,nuevaE fe1 ho1 "Dorada" 2 2 9)]																										,(unaAlLadoDeLaOtraT t601 "Plateada" fe2 ho2 2) == 																					[(nuevaE fe2 ho2 "Plateada" 1 0 1,nuevaE fe2 ho2 "Plateada" 1 0 2)																										,(nuevaE fe2 ho2 "Plateada" 1 1 0,nuevaE fe2 ho2 "Plateada" 1 1 1)																										,(nuevaE fe2 ho2 "Plateada" 1 1 3,nuevaE fe2 ho2 "Plateada" 1 1 4)]																										,(unaAlLadoDeLaOtraT t601 "Bronce" fe3 ho3 3) == [] 																					,(unaAlLadoDeLaOtraT t601 "Bronce" fe3 ho3 3) == []																														,(costoDeUnaFuncionT t601 el_Rey)   == 358																													,(costoDeUnaFuncionT t601 rio_2)    == 492 																													,(costoDeUnaFuncionT t601 mi_Mujer) == 22 																													,(balanceT t601 (nuevaFe 19 10 2006)) == 0																																							,(balanceT t601 fe1) == (1110 - 358)																																							,(balanceT t601 fe2) == (1110 + 200 - 358 - 492)																																							,(balanceT t601 fe3) == (1110 + 200 + 500 - 358 - 492 - 22)																																							,(balanceT t601 (nuevaFe 29 2 2020)) == (1110 + 200 + 500 - 358 - 492 - 22)																		,(salasT t601) == [s1,s2,s3]																														,(funcionesT t601) == [mi_Mujer,rio_2,el_Rey]																										,(elencoEstableT t601) == ["E7","E6","E5","E4","E3","E2","E1"]																							,(sueldoT t601 "E5") == 450																														,(sueldoT t601 "E7") == 1500																														,(eliminarArtistaT t25 "E5") == t24]

----------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------
testOK :: [Bool] -> Bool
testOK  [] = True
testOK (x:xs) = x && testOK xs
----------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------
--Tea [Sala] [Funcion] [Nombre] [Moneda] [Entrada]
teatro1 = Tea [sala1, sala2] [funcion1, funcion2] ["juanf1", "juanf2", "pedrof1", "pedrof2", "raulf1"] [100, 150, 200, 250, 300] lasEntradasdeTeatro1

funcion1 = Fun "sala1" "obra1" (nuevaFe 27 2 1987) (nuevaH 13 05) 30  [100, 50,25] ["juanf1",  "pedrof1", "raulf1"] ["1contraf1", "2contraf1"] [400,500]
funcion2 = Fun "sala2" "obra2" (nuevaFe 31 12 1989) (nuevaH 13 58) 30 [300,100,50] ["juanf2", "pedrof2"] ["1contraf2", "2contraf2", "3contraf2"] [300, 400, 200]

sala1 = nuevaS "sala1" [[5], [5, 5], [5, 5]]
sala2 = nuevaS "sala2" [[3, 3], [5, 5], [6, 6]]

lasEntradasdeTeatro1 = [ (nuevaE (nuevaFe 27 2 1987) (nuevaH 13 05) "sala1" 0 0 1),
 (nuevaE (nuevaFe 27 2 1987) (nuevaH 13 05) "sala1" 1 0 3), 
 (nuevaE (nuevaFe 27 2 1987) (nuevaH 13 05) "sala1" 1 1 1),
 (nuevaE (nuevaFe 27 2 1987) (nuevaH 13 05) "sala1" 1 1 3),
 (nuevaE (nuevaFe 27 2 1987) (nuevaH 13 05) "sala1" 2 0 2),
 (nuevaE (nuevaFe 27 2 1987) (nuevaH 13 05) "sala1" 2 1 0),
 (nuevaE (nuevaFe 31 12 1989) (nuevaH 13 58) "sala2" 0 1 2),
 (nuevaE (nuevaFe 31 12 1989) (nuevaH 13 58) "sala2" 1 0 0),
 (nuevaE (nuevaFe 31 12 1989) (nuevaH 13 58) "sala2" 1 0 4),
 (nuevaE (nuevaFe 31 12 1989) (nuevaH 13 58) "sala2" 1 1 2),
 (nuevaE (nuevaFe 31 12 1989) (nuevaH 13 58) "sala2" 2 0 0),
 (nuevaE (nuevaFe 31 12 1989) (nuevaH 13 58) "sala2" 2 0 5),
 (nuevaE (nuevaFe 31 12 1989) (nuevaH 13 58) "sala2" 2 1 2)]
 
testearUnaAlLadoDeLaOtra = unaAlLadoDeLaOtraT teatro1 "sala1"  (nuevaFe 27 2 1987) (nuevaH 13 05) 3 == loquedebedarpidiendo3ensala1 && unaAlLadoDeLaOtraT teatro1 "sala2"  (nuevaFe 31 12 1989) (nuevaH 13 58) 3 == loquedebedarpidiendo3ensala2 &&
						   unaAlLadoDeLaOtraT teatro1 "sala1"  (nuevaFe 27 2 1987) (nuevaH 13 05) 4 == loquedebedarpidiendo4ensala1 && unaAlLadoDeLaOtraT teatro1 "sala2"  (nuevaFe 31 12 1989) (nuevaH 13 58) 4 == loquedebedarpidiendo4ensala2 &&
						   unaAlLadoDeLaOtraT teatro1 "sala1"  (nuevaFe 27 2 1987) (nuevaH 13 05) 5 == [] && unaAlLadoDeLaOtraT teatro1 "sala2"  (nuevaFe 31 12 1989) (nuevaH 13 58) 5 == []
 
loquedebedarpidiendo3ensala1 = [((nuevaE (nuevaFe 27 2 1987) (nuevaH 13 05) "sala1" 0 0 2), (nuevaE (nuevaFe 27 2 1987) (nuevaH 13 05) "sala1" 0 0 4)),
  ( (nuevaE (nuevaFe 27 2 1987) (nuevaH 13 05) "sala1" 1 0 0),  (nuevaE (nuevaFe 27 2 1987) (nuevaH 13 05) "sala1" 1 0 2)),
  ( (nuevaE (nuevaFe 27 2 1987) (nuevaH 13 05) "sala1" 2 1 1),  (nuevaE (nuevaFe 27 2 1987) (nuevaH 13 05) "sala1" 2 1 3)), 
  ( (nuevaE (nuevaFe 27 2 1987) (nuevaH 13 05) "sala1" 2 1 2),  (nuevaE (nuevaFe 27 2 1987) (nuevaH 13 05) "sala1" 2 1 4))]
  
loquedebedarpidiendo3ensala2 = [( (nuevaE (nuevaFe 31 12 1989) (nuevaH 13 58) "sala2" 0 0 0),  (nuevaE (nuevaFe 31 12 1989) (nuevaH 13 58) "sala2" 0 0 2)), 
 ( (nuevaE (nuevaFe 31 12 1989) (nuevaH 13 58) "sala2" 1 0 1),  (nuevaE (nuevaFe 31 12 1989) (nuevaH 13 58) "sala2" 1 0 3)),
 ( (nuevaE (nuevaFe 31 12 1989) (nuevaH 13 58) "sala2" 2 0 1),  (nuevaE (nuevaFe 31 12 1989) (nuevaH 13 58) "sala2" 2 0 3)), 
 (  (nuevaE (nuevaFe 31 12 1989) (nuevaH 13 58) "sala2" 2 0 2),  (nuevaE (nuevaFe 31 12 1989) (nuevaH 13 58) "sala2" 2 0 4)), 
 ( (nuevaE (nuevaFe 31 12 1989) (nuevaH 13 58) "sala2" 2 1 3),  (nuevaE (nuevaFe 31 12 1989) (nuevaH 13 58) "sala2" 2 1 5))]
 
loquedebedarpidiendo4ensala1 = [((nuevaE (nuevaFe 27 2 1987) (nuevaH 13 05) "sala1" 2 1 1), (nuevaE (nuevaFe 27 2 1987) (nuevaH 13 05) "sala1" 2 1 4))]
loquedebedarpidiendo4ensala2 = [((nuevaE (nuevaFe 31 12 1989) (nuevaH 13 58) "sala2" 2 0 1), (nuevaE (nuevaFe 31 12 1989) (nuevaH 13 58) "sala2" 2 0 4))]
 
testearCostoDeUnaFuncionT = costoDeUnaFuncionT teatro1 funcion1 == (100 `div`30+200 `div` 30+300 `div`30+400+500) &&
							costoDeUnaFuncionT teatro1 funcion2 == (150 `div` 30 + 250 `div` 30 + 300+400+200)
							
testearBalanceDeT = balanceT teatro1 (nuevaFe 1 1 1) == 0 && balanceT  teatro1 (nuevaFe 27 2 1987) == 100+50*3+25*2-(100 `div`30+200 `div` 30+300 `div`30+400+500) &&
					balanceT teatro1 (nuevaFe 31 12 1989) == 100+50*3+25*2-(100 `div`30+200 `div` 30+300 `div`30+400+500)+ 300+100*3+50*3-(150 `div` 30 + 250 `div` 30 + 300+400+200) &&
					balanceT teatro1 (nuevaFe 31 12 2005) == balanceT teatro1 (nuevaFe 31 12 1989)