    {-# LANGUAGE CPP #-}
    {-# LANGUAGE FlexibleContexts #-}
    {-# LANGUAGE Safe #-}
    -----------------------------------------------------------------------------
    -- |
    -- Copyright   :  (C) 2011-2015 Edward Kmett
    -- License     :  BSD-style (see the file LICENSE)
    --
    -- Maintainer  :  Edward Kmett <ekmett@gmail.com>
    -- Stability   :  provisional
    -- Portability :  portable
    --
    ----------------------------------------------------------------------------
    module Data.Semigroup.Traversable
      ( Traversable1(..)
      -- * Defining Traversable1 instances
      -- $traversable1instances
      , traverse1Maybe
      , gtraverse1
      , gsequence1
      -- * Default superclass instance helpers
      , foldMap1Default
      ) where

    import Control.Applicative
    #if !(MIN_VERSION_base(4,11,0))
    import Data.Semigroup
    #endif
    import Data.Semigroup.Traversable.Class
    import Data.Functor.Bind.Class
    import GHC.Generics

    -- | Default implementation of 'foldMap1' given an implementation of 'Traversable1'.
    foldMap1Default :: (Traversable1 f, Semigroup m) => (a -> m) -> f a -> m
    foldMap1Default :: forall (f :: * -> *) m a.
    (Traversable1 f, Semigroup m) =>
    (a -> m) -> f a -> m
    foldMap1Default a -> m
    f = Const m (f (ZonkAny 0)) -> m
    forall {k} a (b :: k). Const a b -> a
    getConst (Const m (f (ZonkAny 0)) -> m)
    -> (f a -> Const m (f (ZonkAny 0))) -> f a -> m
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . (a -> Const m (ZonkAny 0)) -> f a -> Const m (f (ZonkAny 0))
    forall (t :: * -> *) (f :: * -> *) a b.
    (Traversable1 t, Apply f) =>
    (a -> f b) -> t a -> f (t b)
    forall (f :: * -> *) a b. Apply f => (a -> f b) -> f a -> f (f b)
    traverse1 (m -> Const m (ZonkAny 0)
    forall {k} a (b :: k). a -> Const a b
    Const (m -> Const m (ZonkAny 0)) -> (a -> m) -> a -> Const m (ZonkAny 0)
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . a -> m
    f)

    -- | Generic 'traverse1'. Caveats:
    --
    --   1. Will not compile if @t@ is an empty constructor.
    --   2. Will not compile if @t@ has some fields that don't mention @a@, for exmaple @data Bar a = MkBar a Int@
    --
    -- @since 5.3.8
    gtraverse1 ::
      (Traversable1 (Rep1 t), Apply f, Generic1 t) =>
      (a -> f b) ->
      t a ->
      f (t b)
    gtraverse1 :: forall (t :: * -> *) (f :: * -> *) a b.
    (Traversable1 (Rep1 t), Apply f, Generic1 t) =>
    (a -> f b) -> t a -> f (t b)
    gtraverse1 a -> f b
    f t a
    x = Rep1 t b -> t b
    forall a. Rep1 t a -> t a
    forall k (f :: k -> *) (a :: k). Generic1 f => Rep1 f a -> f a
    to1 (Rep1 t b -> t b) -> f (Rep1 t b) -> f (t b)
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    <$> (a -> f b) -> Rep1 t a -> f (Rep1 t b)
    forall (t :: * -> *) (f :: * -> *) a b.
    (Traversable1 t, Apply f) =>
    (a -> f b) -> t a -> f (t b)
    forall (f :: * -> *) a b.
    Apply f =>
    (a -> f b) -> Rep1 t a -> f (Rep1 t b)
    traverse1 a -> f b
    f (t a -> Rep1 t a
    forall a. t a -> Rep1 t a
    forall k (f :: k -> *) (a :: k). Generic1 f => f a -> Rep1 f a
    from1 t a
    x)

    -- | Generic 'sequence1'. Caveats are the same for 'gtraverse1'.
    --
    -- @since 5.3.8
    gsequence1 ::
      (Traversable1 (Rep1 t), Apply f, Generic1 t) =>
      t (f b) ->
      f (t b)
    gsequence1 :: forall (t :: * -> *) (f :: * -> *) b.
    (Traversable1 (Rep1 t), Apply f, Generic1 t) =>
    t (f b) -> f (t b)
    gsequence1 = (Rep1 t b -> t b) -> f (Rep1 t b) -> f (t b)
    forall a b. (a -> b) -> f a -> f b
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    fmap Rep1 t b -> t b
    forall a. Rep1 t a -> t a
    forall k (f :: k -> *) (a :: k). Generic1 f => Rep1 f a -> f a
    to1 (f (Rep1 t b) -> f (t b))
    -> (t (f b) -> f (Rep1 t b)) -> t (f b) -> f (t b)
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . Rep1 t (f b) -> f (Rep1 t b)
    forall (t :: * -> *) (f :: * -> *) b.
    (Traversable1 t, Apply f) =>
    t (f b) -> f (t b)
    forall (f :: * -> *) b. Apply f => Rep1 t (f b) -> f (Rep1 t b)
    sequence1 (Rep1 t (f b) -> f (Rep1 t b))
    -> (t (f b) -> Rep1 t (f b)) -> t (f b) -> f (Rep1 t b)
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . t (f b) -> Rep1 t (f b)
    forall a. t a -> Rep1 t a
    forall k (f :: k -> *) (a :: k). Generic1 f => f a -> Rep1 f a
    from1

    -- $traversable1instances
    -- Defining 'Traversable1' instances for types with both 'Traversable1' and 'Traversable'
    -- substructures can be done with 'traverse1Maybe', '(<*.>)', and '(<.*>)'.
    --
    -- > data Foo a = Foo (Maybe a) (Maybe a) a [a]
    -- >   deriving (Functor, Traversable, Foldable)
    -- > instance Traversable1 Foo where
    -- >   traverse1 f (Foo ma ma' a as) = Foo <$> traverseMaybe ma <*> traverseMaybe ma' <*.> f a <.*> traverseMaybe as
    -- > instance Foldable1 Foo where
    -- >   foldMap1 = foldMap1Default