    {-
        Copyright 2013-2019 Mario Blazevic

        License: BSD3 (see BSD3-LICENSE.txt file)
    -}

    -- | This module defines the 'Monoid' => 'CommutativeMonoid' => 'ReductiveMonoid' => 'CancellativeMonoid' constraint
    -- synonym hierarchy.
    --
    -- Since most practical monoids in Haskell are not commutative, the last two of these synonyms have two symmetric
    -- superclasses each:
    --
    -- * 'LeftReductiveMonoid'
    --
    -- * 'LeftCancellativeMonoid'
    --
    -- * 'RightReductiveMonoid'
    --
    -- * 'RightCancellativeMonoid'
    --
    -- This module and its constraint synonyms are provided for compatibility with the older versions of the
    -- @monoid-sublasses@ library. Starting with version 1.0, the classes from the "Data.Semigroup.Cancellative" module
    -- are recommended instead.

    {-# LANGUAGE Haskell2010, ConstraintKinds, FlexibleInstances #-}

    module Data.Monoid.Cancellative {- from 1.1 DEPRECATED "Use \"Data.Semigroup.Cancellative\" and \"Data.Monoid.GCD\" instead" -} (
       module Data.Semigroup.Cancellative,
       module Data.Monoid.GCD,
       -- * Symmetric, commutative monoid classes
       CommutativeMonoid, ReductiveMonoid, CancellativeMonoid,
       -- * Asymmetric monoid classes
       LeftReductiveMonoid, RightReductiveMonoid,
       LeftCancellativeMonoid, RightCancellativeMonoid
       )
    where

    import Data.Monoid (Monoid)

    import Data.Semigroup.Cancellative
    import Data.Monoid.GCD

    {- from 1.1-}
    {- DEPRECATED CommutativeMonoid "Use Data.Semigroup.Cancellative.Commutative instead." -}
    {- DEPRECATED ReductiveMonoid "Use Data.Semigroup.Cancellative.Reductive instead." -}
    {- DEPRECATED LeftReductiveMonoid "Use Data.Semigroup.Cancellative.LeftReductive instead." -}
    {- DEPRECATED RightReductiveMonoid "Use Data.Semigroup.Cancellative.RightReductive instead." -}
    {- DEPRECATED CancellativeMonoid "Use Data.Semigroup.Cancellative.Cancellative instead." -}
    {- DEPRECATED LeftCancellativeMonoid "Use Data.Semigroup.Cancellative.LeftCancellative instead." -}
    {- DEPRECATED RightCancellativeMonoid "Use Data.Semigroup.Cancellative.RightCancellative instead." -}
    type CommutativeMonoid m = (Monoid m, Commutative m)
    type ReductiveMonoid m = (Monoid m, Reductive m)
    type LeftReductiveMonoid m = (Monoid m, LeftReductive m)
    type RightReductiveMonoid m = (Monoid m, RightReductive m)
    type CancellativeMonoid m = (Monoid m, Cancellative m)
    type LeftCancellativeMonoid m = (Monoid m, LeftCancellative m)
    type RightCancellativeMonoid m = (Monoid m, RightCancellative m)