-- |
-- 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 = (m -> m) -> (m -> m) -> t m m -> m
forall m a b. Semigroup m => (a -> m) -> (b -> m) -> t a b -> m
forall (t :: * -> * -> *) m a b.
(Bifoldable1 t, Semigroup m) =>
(a -> m) -> (b -> m) -> t a b -> m
bifoldMap1 m -> m
forall a. a -> a
id m -> m
forall a. a -> a
id
     {-# INLINE bifold1 #-}

     bifoldMap1 :: Semigroup m => (a -> m) -> (b -> m) -> t a b -> m

instance Bifoldable1 Arg where
    bifoldMap1 :: forall m a b. Semigroup m => (a -> m) -> (b -> m) -> Arg a b -> m
bifoldMap1 a -> m
f b -> m
g (Arg a
a b
b) = a -> m
f a
a m -> m -> m
forall a. Semigroup a => a -> a -> a
<> b -> m
g b
b

instance Bifoldable1 Either where
    bifoldMap1 :: forall m a b.
Semigroup m =>
(a -> m) -> (b -> m) -> Either a b -> m
bifoldMap1 a -> m
f b -> m
_ (Left a
a) = a -> m
f a
a
    bifoldMap1 a -> m
_ b -> m
g (Right b
b) = b -> m
g b
b
    {-# INLINE bifoldMap1 #-}

instance Bifoldable1 (,) where
    bifoldMap1 :: forall m a b. Semigroup m => (a -> m) -> (b -> m) -> (a, b) -> m
bifoldMap1 a -> m
f b -> m
g (a
a, b
b) = a -> m
f a
a m -> m -> m
forall a. Semigroup a => a -> a -> a
<> b -> m
g b
b
    {-# INLINE bifoldMap1 #-}

instance Bifoldable1 ((,,) x) where
    bifoldMap1 :: forall m a b. Semigroup m => (a -> m) -> (b -> m) -> (x, a, b) -> m
bifoldMap1 a -> m
f b -> m
g (x
_,a
a,b
b) = a -> m
f a
a m -> m -> m
forall a. Semigroup a => a -> a -> a
<> b -> m
g b
b
    {-# INLINE bifoldMap1 #-}

instance Bifoldable1 ((,,,) x y) where
    bifoldMap1 :: forall m a b.
Semigroup m =>
(a -> m) -> (b -> m) -> (x, y, a, b) -> m
bifoldMap1 a -> m
f b -> m
g (x
_,y
_,a
a,b
b) = a -> m
f a
a m -> m -> m
forall a. Semigroup a => a -> a -> a
<> b -> m
g b
b
    {-# INLINE bifoldMap1 #-}

instance Bifoldable1 ((,,,,) x y z) where
    bifoldMap1 :: forall m a b.
Semigroup m =>
(a -> m) -> (b -> m) -> (x, y, z, a, b) -> m
bifoldMap1 a -> m
f b -> m
g (x
_,y
_,z
_,a
a,b
b) = a -> m
f a
a m -> m -> m
forall a. Semigroup a => a -> a -> a
<> b -> m
g b
b
    {-# INLINE bifoldMap1 #-}

instance Bifoldable1 Const where
    bifoldMap1 :: forall m a b. Semigroup m => (a -> m) -> (b -> m) -> Const a b -> m
bifoldMap1 a -> m
f b -> m
_ (Const a
a) = a -> m
f a
a
    {-# INLINE bifoldMap1 #-}