data Message a b = Low a | High b instance Functor (Message a) instance (Eq a, Eq b) => Eq (Message a b) instance (Ord a, Ord b) => Ord (Message a b) instance (Show a, Show b) => Show (Message a b) isHigh :: Message a b -> Bool isLow :: Message a b -> Bool stripHigh :: Message a1 a2 -> Maybe a2 stripLow :: Message a b -> Maybe a mapMessage :: (t1 -> a) -> (t2 -> b) -> Message t1 t2 -> Message a b aLow :: (t -> a) -> Message t b -> Message a b aHigh :: (t -> b) -> Message a t -> Message a b pushMsg :: Functor f => Message (f a1) (f a2) -> f (Message a1 a2)