{-# LANGUAGE FlexibleContexts      #-}
{-# LANGUAGE FlexibleInstances     #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE MultiWayIf            #-}
{-# LANGUAGE RankNTypes            #-}
{-# LANGUAGE TypeFamilies          #-}
-----------------------------------------------------------------------------
-- |
-- Module      :  Data.Dense
-- Copyright   :  (c) Christopher Chalmers
-- License     :  BSD3
--
-- Maintainer  :  Christopher Chalmers
-- Stability   :  provisional
-- Portability :  non-portable
--
-- This module provides a large subset of the full functionality of
-- "dense" without exporting names that conflict with names in prelude,
-- so it can often be imported unqualified. It also includes reexported
-- classes and data types from other modules. However it does not
-- contain much functions necessary to construct arrays, for that see
-- "Data.Dense.Generic" or one of the type specific modules intended to
-- be imported qualified. Typical imports for shaped will look like
-- this:
--
-- @
-- import           "Data.Dense"
-- import qualified "Data.Dense.Unboxed" as U
-- @
--
-- For boxed-specific arrays (a la "Data.Vector") see "Data.Dense.Boxed".
-----------------------------------------------------------------------------
module Data.Dense
  (
    -- * Array types
    Array
  , BArray
  , UArray
  , SArray
  , PArray

    -- * Indexing
  , Layout
  , HasLayout (..)
  , Shape
  , extent
  , size

    -- ** Folds over indexes
  , indexes
  , indexesBetween
  , indexesFrom

    -- ** Lenses
  , vector

    -- ** Traversals
  , values
  , values'
  , valuesBetween

  -- * Construction

  -- ** Flat arrays
  , flat

  -- ** Shaped from lists
  , fromListInto
  , fromListInto_

  -- ** Shaped from vectors
  , fromVectorInto
  , fromVectorInto_

  -- ** Generating
  -- | See "Data.Shaped.Generic".

  -- * Functions on arrays

  -- ** Empty arrays
  -- | See 'Control.Lens.Empty.AsEmpty' class or "Data.Shaped.Generic".

  -- ** Indexing
  -- | See 'Control.Lens.At.Ixed' class.

  -- ** Modifying arrays
  -- | See "Data.Shaped.Generic".

  -- ** Slices

  -- *** Matrix
  , ixRow
  , rows
  , ixColumn
  , columns

  -- *** 3D
  , ixPlane
  , planes
  , flattenPlane

  -- * Mutable
  , MArray
  , BMArray
  , UMArray
  , SMArray
  , PMArray

  -- * Delayed

  , Delayed

  -- ** Generating delayed

  , delayed
  , seqDelayed
  , delay
  , manifest
  , seqManifest
  , genDelayed
  , indexDelayed
  , affirm
  , seqAffirm

    -- ** Helpful reexports
  , (*^)
  , (^*)
  , (^/)
  , Additive (..)
  , Metric (..)

  -- * Focused

  , Focused

  -- ** Generating focused

  , focusOn
  , unfocus
  , unfocused
  , extendFocus

  -- ** Focus location
  , locale
  , shiftFocus

  -- ** Boundary
  , Boundary (..)
  , peekB
  , peeksB
  , peekRelativeB

    -- ** Helpful reexports
  , Comonad (..)
  , ComonadStore (..)

    -- * Stencils
  , Stencil

    -- ** Constructing stencils
  , stencil
  , mkStencil
  , mkStencilTH

    -- ** Using stencils
  , stencilSum

  -- * Common shapes
  , V1 (..)
  , V2 (..)
  , V3 (..)
  , V4 (..)
  , R1 (..)
  , R2 (..)
  , R3 (..)
  , R4 (..)

  -- ** Extra planes
  , _xz
  , _yz
  , _yx
  , _zy
  , _zx
  ) where

import           Data.Dense.Generic
import           Control.Comonad.Store
import           Linear                hiding (vector)
import           Data.Dense.TH
import           Data.Dense.Stencil