-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/


-- | swap and assoc: Symmetric and Semigroupy Bifunctors
--   
--   Provides generalisations of <tt>swap :: (a,b) -&gt; (b,a)</tt> and
--   <tt>assoc :: ((a,b),c) -&gt; (a,(b,c))</tt> to <tt>Bifunctor</tt>s
--   supporting similar operations (e.g. <tt>Either</tt>, <tt>These</tt>).
@package assoc
@version 1.0.2

module Data.Bifunctor.Assoc

-- | "Semigroup-y" <a>Bifunctor</a>s.
--   
--   <pre>
--   <a>assoc</a> . <a>unassoc</a> = <a>id</a>
--   <a>unassoc</a> . <a>assoc</a> = <a>id</a>
--   <a>assoc</a> . <a>bimap</a> (<a>bimap</a> f g) h = <a>bimap</a> f (<a>bimap</a> g h) . <a>assoc</a>
--   </pre>
--   
--   This library doesn't provide <tt>Monoidal</tt> class, with left and
--   right unitors. Are they useful in practice?
class Bifunctor p => Assoc p
assoc :: Assoc p => p (p a b) c -> p a (p b c)
unassoc :: Assoc p => p a (p b c) -> p (p a b) c
instance Data.Bifunctor.Assoc.Assoc (,)
instance Data.Bifunctor.Assoc.Assoc Data.Either.Either
instance Data.Bifunctor.Assoc.Assoc Data.Functor.Const.Const
instance Data.Bifunctor.Assoc.Assoc Data.Tagged.Tagged
instance Data.Bifunctor.Assoc.Assoc p => Data.Bifunctor.Assoc.Assoc (Data.Bifunctor.Flip.Flip p)

module Data.Bifunctor.Swap

-- | Symmetric <a>Bifunctor</a>s.
--   
--   <pre>
--   <a>swap</a> . <a>swap</a> = <a>id</a>
--   </pre>
--   
--   If <tt>p</tt> is a <a>Bifunctor</a> the following property is assumed
--   to hold:
--   
--   <pre>
--   <a>swap</a> . <a>bimap</a> f g = <a>bimap</a> g f . <a>swap</a>
--   </pre>
--   
--   <a>Swap</a> isn't a subclass of <a>Bifunctor</a>, as for example
--   
--   <pre>
--   &gt;&gt;&gt; newtype Bipredicate a b = Bipredicate (a -&gt; b -&gt; Bool)
--   </pre>
--   
--   is not a <a>Bifunctor</a> but has <a>Swap</a> instance
--   
--   <pre>
--   &gt;&gt;&gt; instance Swap Bipredicate where swap (Bipredicate p) = Bipredicate (flip p)
--   </pre>
class Swap p
swap :: Swap p => p a b -> p b a
instance Data.Bifunctor.Swap.Swap (,)
instance Data.Bifunctor.Swap.Swap Data.Either.Either
instance Data.Bifunctor.Swap.Swap p => Data.Bifunctor.Swap.Swap (Data.Bifunctor.Flip.Flip p)
instance (Data.Bifunctor.Swap.Swap p, Data.Bifunctor.Swap.Swap q) => Data.Bifunctor.Swap.Swap (Data.Bifunctor.Product.Product p q)
instance (Data.Bifunctor.Swap.Swap p, Data.Bifunctor.Swap.Swap q) => Data.Bifunctor.Swap.Swap (Data.Bifunctor.Sum.Sum p q)
instance (GHC.Base.Functor f, Data.Bifunctor.Swap.Swap p) => Data.Bifunctor.Swap.Swap (Data.Bifunctor.Tannen.Tannen f p)
instance (f GHC.Types.~ g, GHC.Base.Functor f, Data.Bifunctor.Swap.Swap p) => Data.Bifunctor.Swap.Swap (Data.Bifunctor.Biff.Biff p f g)
instance Data.Bifunctor.Swap.Swap ((,,) x)
instance Data.Bifunctor.Swap.Swap ((,,,) x y)
instance Data.Bifunctor.Swap.Swap ((,,,,) x y z)
instance Data.Bifunctor.Swap.Swap ((,,,,,) x y z w)
instance Data.Bifunctor.Swap.Swap ((,,,,,,) x y z w v)
