-- 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 ()
instance Data.Commutative.CommutativeId ()
instance Data.Commutative.Commutative (Data.Commutative.CommEndo a)
instance Data.Commutative.CommutativeId (Data.Commutative.CommEndo a)
instance Data.Commutative.Commutative Data.Monoid.Any
instance Data.Commutative.CommutativeId Data.Monoid.Any
instance Data.Commutative.Commutative Data.Monoid.All
instance Data.Commutative.CommutativeId Data.Monoid.All
instance Data.Commutative.Commutative (Data.Commutative.OneOf a)
instance Data.Commutative.CommutativeId (Data.Commutative.OneOf a)
instance GHC.Num.Num a => Data.Commutative.Commutative (Data.Monoid.Sum a)
instance GHC.Num.Num a => Data.Commutative.CommutativeId (Data.Monoid.Sum a)
instance GHC.Num.Num a => Data.Commutative.Commutative (Data.Monoid.Product a)
instance GHC.Num.Num a => Data.Commutative.CommutativeId (Data.Monoid.Product a)

module Data.Mergeable
class Mergeable t where mergeMap f = merge (commute . f) cempty merge f i xs = appCommEndo (mergeMap (CommEndo . f) xs) i
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 where mergeMap1 f = merge1 . fmap f merge1 = mergeMap1 id
mergeMap1 :: (Mergeable1 t, Commutative m) => (a -> m) -> t a -> m
merge1 :: (Mergeable1 t, Commutative m) => t m -> m
instance Data.Mergeable.Mergeable []
instance Data.Mergeable.Mergeable1 Data.List.NonEmpty.NonEmpty
