module Message where data Message a b = Low a | High b deriving (Eq, Ord, Show) isHigh (High _) = True isHigh _ = False isLow (Low _) = True isLow _ = False stripHigh (High a) = Just a stripHigh _ = Nothing stripLow (Low b) = Just b stripLow _ = Nothing mapMessage fl fh' (Low l) = Low (fl l) mapMessage fl fh' (High h) = High (fh' h) message fl fh (Low l) = fl l message fl fh (High h) = fh h aLow f (Low l) = Low (f l) aLow f (High h) = High h aHigh f (High h) = High (f h) aHigh f (Low l) = Low l pushMsg (High xs) = fmap High xs pushMsg (Low xs) = fmap Low xs instance Functor (Message a) where fmap = aHigh