--------------------------------------------------------------------------------
-- |
--
-- Module      :  Data.Act
-- Description :  Actions of sets, semigroups, monoids or groups.
-- Copyright   :  (c) Alice Rixte 2024
-- License     :  BSD 3
-- Maintainer  :  alice.rixte@u-bordeaux.fr
-- Stability   :  unstable
-- Portability :  non-portable (GHC extensions)
--
-- == Presentation
--
-- An action lifts an element (the "/actor/") of some type @s@, the /acting/
-- type, into a function of another type @x@ which we call the "/actee/".
--
-- The class hierarchy for actions is fine-grained, which means it is flexible
-- but sometimes cumbersome to deal with. In particular, this allows to specify
-- specific properties on the action for a semidirect product to be a semigroup
-- or a monoid (see @'Data.Semidirect'@). Here is a tree summarizing the class
-- hierarchy and their laws:
--
-- @
-- 'LAct'                     /Set action/
--  => 'LActSg'               /Semigroup action/
--      => 'LActMn'           /Monoid action/
--           => 'LTorsor'     /Torsor/
--  => 'LActDistrib'          /Distributive action/
--  => 'LActNeutral'          /Neutral preserving action/
--  => 'LActGen'              /Action generated by a set/
--      => 'LActCyclic'       /Cyclic action (generated by a single element)/
-- @
--
--
-- == Instances driven by the acting type
--
-- The action classes do not have functional dependencies, which can make it
-- awkward to work with them. To avoid overlapping issues, this library chooses
-- to drive instances by the second parameter, i.e. to _never_ write instances
-- of the form
--
-- @
-- instance LAct SomeType s
-- instance RAct SomeType s
-- @
--
--
-- If you need such an instance, you should make a newtype. This library already
-- provides some, such as @'ActSelf'@,  @'ActTrivial'@, @'ActSelf''@, @'ActFold''@
-- and @'ActMap'@.
--
-- == Design choices compared to existing libraries
--
-- This library is inspired by the already existing action libraries.
--
-- * The deriving mechanism is inspired by the one from the @acts@ library. The
--   main difference between this library and the @acts@ library is that  @acts@
--   drives its instances by the actee parameter.
--
-- * The @monoid-extras@ library drives its instances by the acting type, but
--   does not provide a deriving mechanism. This library started as an extension
--   of @monoid-extras@, but the design choices made it diverge from it.
--
-- * The idea of specifying action properties using empty classes comes from the
--   @semigroups-actions@ library, which inspired some design of this library.
--   This library offers everything @semigroups-actions@ offers, and more.
--
--------------------------------------------------------------------------------

module Data.Act
  ( module Data.Act.Act
  , module Data.Act.Torsor
  , module Data.Act.Cyclic
  ) where

import Data.Act.Act
import Data.Act.Torsor
import Data.Act.Cyclic