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


-- | Commutative binary operations.
--   
--   This package provides a trivial class for abelian binary operations,
--   and an analogue to <tt>Data.Foldable</tt>.
@package commutative
@version 0.0.1.4

module Data.Commutative
class Commutative a
commute :: Commutative a => a -> a -> a
(<~>) :: Commutative a => a -> a -> a
class Commutative a => CommutativeId a
cempty :: CommutativeId a => a

-- | <tt>flip</tt> when <tt>False</tt> - simple &amp; pure "predicative"
--   commute.
commuteVia :: Bool -> (a -> a -> a) -> a -> a -> a

-- | Lifted predicative behaviour.
commuteViaF :: Functor f => f Bool -> (a -> a -> a) -> a -> a -> f a

-- | Endomorphisms commutative over composition. <b>Warning</b>: The
--   <tt>Commutative</tt> instance uses <tt>unsafePerformIO</tt> to
--   randomly pick the order.
newtype CommEndo a
CommEndo :: (a -> a) -> CommEndo a
[appCommEndo] :: CommEndo a -> a -> a

-- | In the case of two <tt>Just</tt> values, the commutative instance
--   randomly chooses one of them. <b>Warning</b>: The <tt>Commutative</tt>
--   instance uses <tt>unsafePerformIO</tt> to randomly pick the order.
newtype OneOf a
OneOf :: Maybe a -> OneOf a
[getOneOf] :: OneOf a -> Maybe a
pick1 :: a -> a -> a
instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Commutative.OneOf a)
instance GHC.Show.Show a => GHC.Show.Show (Data.Commutative.OneOf a)
instance Data.Commutative.Commutative (Data.Commutative.OneOf a)
instance Data.Commutative.CommutativeId (Data.Commutative.OneOf a)
instance Data.Commutative.Commutative (Data.Commutative.CommEndo a)
instance Data.Commutative.CommutativeId (Data.Commutative.CommEndo a)
instance Data.Commutative.CommutativeId ()
instance Data.Commutative.CommutativeId Data.Monoid.Any
instance Data.Commutative.CommutativeId Data.Monoid.All
instance GHC.Num.Num a => Data.Commutative.CommutativeId (Data.Monoid.Sum a)
instance GHC.Num.Num a => Data.Commutative.CommutativeId (Data.Monoid.Product a)
instance Data.Commutative.Commutative ()
instance Data.Commutative.Commutative Data.Monoid.Any
instance Data.Commutative.Commutative Data.Monoid.All
instance GHC.Num.Num a => Data.Commutative.Commutative (Data.Monoid.Sum a)
instance GHC.Num.Num a => Data.Commutative.Commutative (Data.Monoid.Product a)

module Data.Mergeable
class Mergeable t
mergeMap :: (Mergeable t, CommutativeId m) => (a -> m) -> t a -> m
merge :: Mergeable t => (a -> b -> b) -> b -> t a -> b
class Functor t => Mergeable1 t
mergeMap1 :: (Mergeable1 t, Commutative m) => (a -> m) -> t a -> m
merge1 :: (Mergeable1 t, Commutative m) => t m -> m
instance Data.Mergeable.Mergeable1 Data.List.NonEmpty.NonEmpty
instance Data.Mergeable.Mergeable []
