module Web.Route.Invertible.Monoid.Prioritized
( Prioritized(..)
) where
import Data.Semigroup (Semigroup((<>)))
data Prioritized a = Prioritized
{ priority :: !Int
, prioritized :: !a
} deriving (Eq, Show)
instance Functor Prioritized where
fmap f (Prioritized p x) = Prioritized p (f x)
instance Semigroup a => Semigroup (Prioritized a) where
a1@(Prioritized p1 x1) <> a2@(Prioritized p2 x2) = case compare p1 p2 of
LT -> a2
GT -> a1
EQ -> Prioritized p1 (x1 <> x2)
instance Monoid a => Monoid (Prioritized a) where
mempty = Prioritized minBound mempty
mappend a1@(Prioritized p1 x1) a2@(Prioritized p2 x2) = case compare p1 p2 of
LT -> a2
GT -> a1
EQ -> Prioritized p1 (mappend x1 x2)