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)