module Party where import Employee import Data.Tree -- Exercise 1 glCons :: Employee -> GuestList -> GuestList glCons e@Emp { empFun = ef } (GL es cf) = GL (e:es) (cf + ef) -- mappend (a.k.a. (<>)) has been moved to Semigroup instance Semigroup GuestList where (<>) (GL es1 f1) (GL es2 f2) = GL (es1 ++ es2) (f1 + f2) instance Monoid GuestList where mempty = GL [] 0 moreFun :: GuestList -> GuestList -> GuestList moreFun gl1@(GL _ f1) gl2@(GL _ f2) | f1 >= f2 = gl1 | otherwise = gl2 -- Exercise 2 treeFold :: (a -> [b] -> b) -> Tree a -> b treeFold f (Node l subs) = f l $ map (\t -> treeFold f t) subs