module Message where data Message a b = Low a | High b deriving (Message a b -> Message a b -> Bool (Message a b -> Message a b -> Bool) -> (Message a b -> Message a b -> Bool) -> Eq (Message a b) forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a forall a b. (Eq a, Eq b) => Message a b -> Message a b -> Bool /= :: Message a b -> Message a b -> Bool $c/= :: forall a b. (Eq a, Eq b) => Message a b -> Message a b -> Bool == :: Message a b -> Message a b -> Bool $c== :: forall a b. (Eq a, Eq b) => Message a b -> Message a b -> Bool Eq, Eq (Message a b) Eq (Message a b) -> (Message a b -> Message a b -> Ordering) -> (Message a b -> Message a b -> Bool) -> (Message a b -> Message a b -> Bool) -> (Message a b -> Message a b -> Bool) -> (Message a b -> Message a b -> Bool) -> (Message a b -> Message a b -> Message a b) -> (Message a b -> Message a b -> Message a b) -> Ord (Message a b) Message a b -> Message a b -> Bool Message a b -> Message a b -> Ordering Message a b -> Message a b -> Message a b forall a. Eq a -> (a -> a -> Ordering) -> (a -> a -> Bool) -> (a -> a -> Bool) -> (a -> a -> Bool) -> (a -> a -> Bool) -> (a -> a -> a) -> (a -> a -> a) -> Ord a forall a b. (Ord a, Ord b) => Eq (Message a b) forall a b. (Ord a, Ord b) => Message a b -> Message a b -> Bool forall a b. (Ord a, Ord b) => Message a b -> Message a b -> Ordering forall a b. (Ord a, Ord b) => Message a b -> Message a b -> Message a b min :: Message a b -> Message a b -> Message a b $cmin :: forall a b. (Ord a, Ord b) => Message a b -> Message a b -> Message a b max :: Message a b -> Message a b -> Message a b $cmax :: forall a b. (Ord a, Ord b) => Message a b -> Message a b -> Message a b >= :: Message a b -> Message a b -> Bool $c>= :: forall a b. (Ord a, Ord b) => Message a b -> Message a b -> Bool > :: Message a b -> Message a b -> Bool $c> :: forall a b. (Ord a, Ord b) => Message a b -> Message a b -> Bool <= :: Message a b -> Message a b -> Bool $c<= :: forall a b. (Ord a, Ord b) => Message a b -> Message a b -> Bool < :: Message a b -> Message a b -> Bool $c< :: forall a b. (Ord a, Ord b) => Message a b -> Message a b -> Bool compare :: Message a b -> Message a b -> Ordering $ccompare :: forall a b. (Ord a, Ord b) => Message a b -> Message a b -> Ordering $cp1Ord :: forall a b. (Ord a, Ord b) => Eq (Message a b) Ord, Int -> Message a b -> ShowS [Message a b] -> ShowS Message a b -> String (Int -> Message a b -> ShowS) -> (Message a b -> String) -> ([Message a b] -> ShowS) -> Show (Message a b) forall a. (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a forall a b. (Show a, Show b) => Int -> Message a b -> ShowS forall a b. (Show a, Show b) => [Message a b] -> ShowS forall a b. (Show a, Show b) => Message a b -> String showList :: [Message a b] -> ShowS $cshowList :: forall a b. (Show a, Show b) => [Message a b] -> ShowS show :: Message a b -> String $cshow :: forall a b. (Show a, Show b) => Message a b -> String showsPrec :: Int -> Message a b -> ShowS $cshowsPrec :: forall a b. (Show a, Show b) => Int -> Message a b -> ShowS Show) isHigh :: Message a b -> Bool isHigh (High b _) = Bool True isHigh Message a b _ = Bool False isLow :: Message a b -> Bool isLow (Low a _) = Bool True isLow Message a b _ = Bool False stripHigh :: Message a a -> Maybe a stripHigh (High a a) = a -> Maybe a forall a. a -> Maybe a Just a a stripHigh Message a a _ = Maybe a forall a. Maybe a Nothing stripLow :: Message a b -> Maybe a stripLow (Low a b) = a -> Maybe a forall a. a -> Maybe a Just a b stripLow Message a b _ = Maybe a forall a. Maybe a Nothing mapMessage :: (t -> a) -> (t -> b) -> Message t t -> Message a b mapMessage t -> a fl t -> b fh' (Low t l) = a -> Message a b forall a b. a -> Message a b Low (t -> a fl t l) mapMessage t -> a fl t -> b fh' (High t h) = b -> Message a b forall a b. b -> Message a b High (t -> b fh' t h) message :: (t -> p) -> (t -> p) -> Message t t -> p message t -> p fl t -> p fh (Low t l) = t -> p fl t l message t -> p fl t -> p fh (High t h) = t -> p fh t h aLow :: (t -> a) -> Message t b -> Message a b aLow t -> a f (Low t l) = a -> Message a b forall a b. a -> Message a b Low (t -> a f t l) aLow t -> a f (High b h) = b -> Message a b forall a b. b -> Message a b High b h aHigh :: (t -> b) -> Message a t -> Message a b aHigh t -> b f (High t h) = b -> Message a b forall a b. b -> Message a b High (t -> b f t h) aHigh t -> b f (Low a l) = a -> Message a b forall a b. a -> Message a b Low a l pushMsg :: Message (f a) (f b) -> f (Message a b) pushMsg (High f b xs) = (b -> Message a b) -> f b -> f (Message a b) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap b -> Message a b forall a b. b -> Message a b High f b xs pushMsg (Low f a xs) = (a -> Message a b) -> f a -> f (Message a b) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap a -> Message a b forall a b. a -> Message a b Low f a xs instance Functor (Message a) where fmap :: (a -> b) -> Message a a -> Message a b fmap = (a -> b) -> Message a a -> Message a b forall t b a. (t -> b) -> Message a t -> Message a b aHigh