{-# OPTIONS_GHC -Wall #-}

-- | Higher-kinded numbers that can be represented with an [Int] index into elements.
--
module NumHask.Array
  ( -- * Shapes
    --
    -- $shape
    module NumHask.Array.Shape,

    -- * Numbers with a fixed shape
    --
    -- $fixed
    module NumHask.Array.Fixed,

    -- * Numbers with a dynamic shape
    --
    -- $dynamic

    -- * HMatrix API
    --
    -- $hmatrix

  ) where

import NumHask.Array.Shape
import NumHask.Array.Fixed

-- $shape
--
-- Using [`Int`] as the index for an array nicely represents the practical interests and constraints downstream of this high-level API: densely-packed numbers (reals or integrals), indexed and layered.

-- $fixed
--
-- A design principle of modern haskell (synonymous with ghc usage) is to push computation into compilation. `Representable` is an iconic example. `Shape` must ultimately be known at compile-time, but if it is, we can dispense with a large classes of runtime check which slow pipelines.  This tends to create computation where shape is abstracted and we fold algorithms in and out of structures.

-- $dynamic
--
-- | In many situations, where shape is being tracked or otherwise only known at runtime, a clear module arrangement is:
--
-- >>> import NumHask.Array.Shape
-- >>> import qualified NumHask.Array.Fixed as F
-- >>> import qualified NumHask.Array.Dynamic as D

-- $hmatrix
--
-- | hmatrix remains the speed king within haskell, and numhask-array is no exception. If speed matters then:
--
-- >>> import NumHask.Array.Shape
-- >>> import qualified NumHask.Array.HMatrix as H
--
-- will deliver the NumHask API over a HMatrix representation, and then the current fastest way to multiply matices in boiler-plate haskell.
--
-- FIXME: fill out Fixed API