{-|
Module      : Multilinear.NVector
Description : N-Vectors constructors (finitely- or infinitely-dimensional)
Copyright   : (c) Artur M. Brodzki, 2018
License     : BSD3
Maintainer  : artur@brodzki.org
Stability   : experimental
Portability : Windows/POSIX

- This module provides convenient constructors that generate a n-vector (tensor with n upper indices with finite or infinite size).  
- Finitely-dimensional n-vectors provide much greater performance than infinitely-dimensional

-}

module Multilinear.NVector (
  -- * Generators
  Multilinear.NVector.fromIndices,
  Multilinear.NVector.const
) where

import qualified Data.Vector.Unboxed         as Unboxed
import           Multilinear

{-| Generate n-vector as function of its indices -}
fromIndices :: (
    Num a, Unboxed.Unbox a, Multilinear t a
  ) => String       -- ^ Indices names (one characted per index)
    -> [Int]        -- ^ Indices sizes
    -> ([Int] -> a) -- ^ Generator function
    -> t a          -- ^ Generated n-vector
fromIndices u usize f = Multilinear.fromIndices u [] usize [] $ \uis [] -> f uis

{-| Generate n-vector with all components equal to @v@ -}
const :: (
    Num a, Unboxed.Unbox a, Multilinear t a
  ) => String -- ^ Indices names (one characted per index)
    -> [Int]  -- ^ Indices sizes
    -> a      -- ^ n-vector elements value
    -> t a    -- ^ Generated n-vector
const u usize = Multilinear.const u [] usize []