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