module Data.Monoid.Lifted ( Semigroup1(..) ) where import Data.Functor.Compose class Semigroup1 f where sappend1 :: (a -> a -> a) -> f a -> f a -> f a instance Semigroup1 Maybe where sappend1 _ Nothing Nothing = Nothing sappend1 _ a@(Just _) Nothing = a sappend1 _ Nothing a@(Just _) = a sappend1 f (Just a) (Just b) = Just (f a b) instance (Semigroup1 f, Semigroup1 g) => Semigroup1 (Compose f g) where sappend1 f (Compose a) (Compose b) = Compose ((sappend1 (sappend1 f)) a b)