module Data.Graph.Comfort.TypeConstructor (
Wrap(Wrap, unwrap),
) where
import Data.Functor.Classes (Eq1(eq1), Ord1(compare1), Show1(showsPrec1))
import Data.Traversable (Traversable, traverse)
import Data.Foldable (Foldable, foldMap)
newtype Wrap f a = Wrap {unwrap :: f a}
instance (Eq1 f, Eq a) => Eq (Wrap f a) where
Wrap x == Wrap y = eq1 x y
instance (Ord1 f, Ord a) => Ord (Wrap f a) where
compare (Wrap x) (Wrap y) = compare1 x y
instance (Show1 f, Show a) => Show (Wrap f a) where
showsPrec p (Wrap x) = showsPrec1 p x
instance Functor f => Functor (Wrap f) where
fmap f (Wrap a) = Wrap (fmap f a)
instance Foldable f => Foldable (Wrap f) where
foldMap f (Wrap a) = foldMap f a
instance Traversable f => Traversable (Wrap f) where
traverse f (Wrap a) = fmap Wrap $ traverse f a