content: -- |
  -- Copyright: Edward Kmett, Oleg Grenrus
  -- License: BSD-3-Clause
  --
  
  {-# LANGUAGE NoImplicitPrelude #-}
  {-# LANGUAGE Safe              #-}
  
  module Data.Bifoldable1 where
  
  import Control.Applicative (Const (..))
  import Data.Bifoldable     (Bifoldable (..))
  import Data.Semigroup      (Arg (..), Semigroup (..))
  import Prelude             (Either (..), id)
  
  class Bifoldable t => Bifoldable1 t where
       bifold1 :: Semigroup m => t m m -> m
       bifold1 = bifoldMap1 id id
       {-# INLINE bifold1 #-}
  
       bifoldMap1 :: Semigroup m => (a -> m) -> (b -> m) -> t a b -> m
  
  instance Bifoldable1 Arg where
      bifoldMap1 f g (Arg a b) = f a <> g b
  
  instance Bifoldable1 Either where
      bifoldMap1 f _ (Left a) = f a
      bifoldMap1 _ g (Right b) = g b
      {-# INLINE bifoldMap1 #-}
  
  instance Bifoldable1 (,) where
      bifoldMap1 f g (a, b) = f a <> g b
      {-# INLINE bifoldMap1 #-}
  
  instance Bifoldable1 ((,,) x) where
      bifoldMap1 f g (_,a,b) = f a <> g b
      {-# INLINE bifoldMap1 #-}
  
  instance Bifoldable1 ((,,,) x y) where
      bifoldMap1 f g (_,_,a,b) = f a <> g b
      {-# INLINE bifoldMap1 #-}
  
  instance Bifoldable1 ((,,,,) x y z) where
      bifoldMap1 f g (_,_,_,a,b) = f a <> g b
      {-# INLINE bifoldMap1 #-}
  
  instance Bifoldable1 Const where
      bifoldMap1 f _ (Const a) = f a
      {-# INLINE bifoldMap1 #-}
  