-----------------------------------------------------------------------------
-- |
-- Module      :  Diagrams.Core
-- Copyright   :  (c) 2011 diagrams-core team (see LICENSE)
-- License     :  BSD-style (see LICENSE)
-- Maintainer  :  diagrams-discuss@googlegroups.com
--
-- The core library of primitives forming the basis of an embedded
-- domain-specific language for describing and rendering diagrams.
-- Normal users of the diagrams library should almost never need to
-- import anything from this package directly; instead, import modules
-- (especially @Diagrams.Prelude@) from the diagrams-lib package,
-- which re-exports most things of value to users.
--
-- For most library code needing access to core internals, it should
-- be sufficient to import this module, which simply re-exports useful
-- functionality from other modules in the core library.  Library
-- writers needing finer-grained access or functionality may
-- occasionally find it useful to directly import one of the
-- constituent core modules.
--
-- The diagrams library relies heavily on custom types and classes. Many
-- of the relevant definitions are in the "Diagrams.Core.Types" module.
-- Indeed the definition of the diagram type @QDiagram@ is contained in:
-- 'Diagrams.Core.Types.QDiagram'. 
--
-- The best place to start when learning
-- about diagrams\' types is the user manual:
-- <http://projects.haskell.org/diagrams/doc/manual.html#type-reference>
-- The following list shows which types are contained in each module of
-- "Diagrams.Core".
--
-- * "Diagrams.Core.Types"
--
--     * @Annotation@, 
--     * @UpAnnots b v m@, @DownAnnots v@,
--     * @QDiaLeaf b v m@, @Measure v@,
--     * @Subdiagram b v m@,  @SubMap b v m@,
--     * @Prim b v@, @Backend b v@, 
--     * @DNode b v a@, @DTree b v a@,
--     * @RNode b v a@, @RTree b v a@,
--     * @NullBackend@, @Renderable t b@,
--     * @D v@.
--
-- * "Diagrams.Core.Envelope"
--
--     * @Envelope v@, @Enveloped v@,
--     * @OrderedField s@.
--
-- * "Diagrams.Core.Juxtapose"
--
--     * @Juxtaposable a@.
--
-- * "Diagrams.Core.Names"
--
--     * @AName@, @Name@, @IsName a@,
--     * @Qualifiable q@.
--
-- * "Diagrams.Core.HasOrigin"
--
--     * @HasOrigin t@.
--
-- * "Diagrams.Core.Points"
--
--     * @Point v@.
--
-- * "Diagrams.Core.Query"
--
--     * @Query v m@.
--
-- *  "Diagrams.Core.Style"
--
--     * @AttributeClass a@, @Attribute v@,
--     * @Style v@, @HasStyle@.
--
-- * "Diagrams.Core.Trace"
--
--     * @SortedList a@,
--     * @Trace v@, @Traced a@.
--
-- * "Diagrams.Core.Transform"
--
--     * @u :-: v@, @HasLinearMap@,
--     * @Transformation v@, @Transformable t@,
--     * @TransInv t@.
--
-- * "Diagrams.Core.V"
--
--     * @V a@.
-----------------------------------------------------------------------------

module Diagrams.Core
       ( -- * Associated vector spaces

         V

         -- * Points

       , Point, origin, (*.)
       , _relative

         -- * Transformations

         -- ** Utilities
       , basis
       , dimension
       , determinant

         -- ** Invertible linear transformations
       , (:-:), (<->), linv, lapp

         -- ** General transformations
       , Transformation
       , inv, transp, transl
       , dropTransl
       , apply
       , papply
       , fromLinear

         -- ** Some specific transformations
       , translation, translate, moveTo, place
       , scaling, scale
       , avgScale

         -- ** The Transformable class

       , Transformable(..)

         -- ** Translational invariance

       , TransInv(TransInv)

         -- * Names

       , AName
       , Name, IsName(..)
       , Qualifiable(..), (.>)

         -- ** Subdiagram maps

       , SubMap(..)
       , fromNames
       , rememberAs

       , lookupSub

         -- * Attributes and styles

       , AttributeClass
       , Attribute, mkAttr, mkTAttr, mkGTAttr, unwrapAttr

       , Style, HasStyle(..)
       , getAttr, combineAttr
       , applyAttr, applyTAttr, applyGTAttr

         -- * Envelopes

       , Envelope(..)
       , appEnvelope, onEnvelope, mkEnvelope
       , Enveloped(..)
       , envelopeVMay, envelopeV, envelopePMay, envelopeP
       , diameter, radius

         -- * Traces

       , Trace(Trace)
       , SortedList, mkSortedList, getSortedList
       , appTrace, mkTrace
       , Traced(..)
       , traceV, traceP
       , maxTraceV, maxTraceP
       , rayTraceV, rayTraceP
       , maxRayTraceV, maxRayTraceP

         -- * Things with local origins

       , HasOrigin(..), moveOriginBy

         -- * Juxtaposable things

       , Juxtaposable(..), juxtaposeDefault

         -- * Queries

       , Query(..)

         -- * Primtives

       , Prim(..)

         -- * Diagrams

       , QDiagram, Diagram, mkQD, pointDiagram
       , envelope, trace, subMap, names, query, sample
       , value, resetValue, clearValue

       , nameSub
       , withName
       , withNameAll
       , withNames
       , localize

       , href

       , setEnvelope, setTrace

       , atop

         -- ** Subdiagrams

       , Subdiagram(..), mkSubdiagram
       , getSub, rawSub
       , location
       , subPoint

         -- * Measurements
       , Measure(..)
       , fromOutput
       , toOutput
       , atMost
       , atLeast

         -- * Backends

       , Backend(..)
       , Renderable(..)

       , renderDia
       , renderDiaT

         -- ** The null backend

       , NullBackend, D

         -- * Convenience classes

       , HasLinearMap
       , OrderedField
       , Monoid'

       ) where

import           Diagrams.Core.Compile
import           Diagrams.Core.Envelope
import           Diagrams.Core.HasOrigin
import           Diagrams.Core.Juxtapose
import           Diagrams.Core.Names
import           Diagrams.Core.Points
import           Diagrams.Core.Query
import           Diagrams.Core.Style
import           Diagrams.Core.Trace
import           Diagrams.Core.Transform
import           Diagrams.Core.Types
import           Diagrams.Core.V

import           Data.Monoid.WithSemigroup (Monoid')