-- |
-- Module      : Ordenacion_de_estructuras
-- Description : Ordenación de estructuras.
-- Copyright   : Exercitium (14-05-14)
-- License     : GPL-3
-- Maintainer  : JoseA.Alonso@gmail.com
-- 
-- Las notas de los dos primeros exámenes se pueden representar mediante
-- el siguiente tipo de dato
--
-- > data Notas = Notas String Int Int
-- >              deriving (Read, Show, Eq)
-- 
-- Por ejemplo, (Notas "Juan" 6 5) representar las notas de un alumno
-- cuyo nombre es Juan, la nota del primer examen es 6 y la del segundo
-- es 5.
-- 
-- Definir la función
-- 
-- > ordenadas :: [Notas] -> [Notas]
-- 
-- tal que __(ordenadas ns)__ es la lista de las notas ns ordenadas
-- considerando primero la nota del examen 2, a continuación la del
-- examen 1 y finalmente el nombre. Por ejemplo,
-- 
-- >>> ordenadas [Notas "Juan" 6 5, Notas "Luis" 3 7] 
-- [Notas "Juan" 6 5,Notas "Luis" 3 7]
-- >>> ordenadas [Notas "Juan" 6 5, Notas "Luis" 3 4] 
-- [Notas "Luis" 3 4,Notas "Juan" 6 5]
-- >>> ordenadas [Notas "Juan" 6 5, Notas "Luis" 7 4] 
-- [Notas "Luis" 7 4,Notas "Juan" 6 5]
-- >>> ordenadas [Notas "Juan" 6 4, Notas "Luis" 7 4] 
-- [Notas "Juan" 6 4,Notas "Luis" 7 4]
-- >>> ordenadas [Notas "Juan" 6 4, Notas "Luis" 5 4] 
-- [Notas "Luis" 5 4,Notas "Juan" 6 4]
-- >>> ordenadas [Notas "Juan" 5 4, Notas "Luis" 5 4] 
-- [Notas "Juan" 5 4,Notas "Luis" 5 4]
-- >>> ordenadas [Notas "Juan" 5 4, Notas "Eva" 5 4] 
-- [Notas "Eva" 5 4,Notas "Juan" 5 4]

module Ordenacion_de_estructuras where

import Data.List (sort)

-- | Tipo se las notas.
data Notas = Notas String Int Int
  deriving (Read, Show, Eq)

-- | Definición.
ordenadas :: [Notas] -> [Notas]
ordenadas ns =
  [Notas n x y | (y,x,n) <- sort [(y1,x1,n1) | (Notas n1 x1 y1) <- ns]]