{-|
Module      : Multilinear.Generic
Description : Re-export default tensor implementation and provides simple tensor converters
Copyright   : (c) Artur M. Brodzki, 2018
License     : BSD3
Maintainer  : artur@brodzki.org
Stability   : experimental
Portability : Windows/POSIX

-}

module Multilinear.Generic (
    module Multilinear.Generic.Sequential,
    toMultiCore, toSequential
) where

import           Data.Vector                    as Boxed
import           Multilinear.Generic.Sequential
import qualified Multilinear.Generic.Sequential as Sequential
import qualified Multilinear.Generic.MultiCore  as MultiCore

-- | Convert Sequential tensor to MultiCore
toMultiCore :: Sequential.Tensor a -> MultiCore.Tensor a
toMultiCore (Sequential.Scalar x) = MultiCore.Scalar x
toMultiCore (Sequential.SimpleFinite i ts) = MultiCore.SimpleFinite i ts
toMultiCore (Sequential.FiniteTensor i ts) = MultiCore.FiniteTensor i $ Boxed.map toMultiCore ts

-- | Convert MultiCore tensor to Sequential
toSequential :: MultiCore.Tensor a -> Sequential.Tensor a
toSequential (MultiCore.Scalar x) = Sequential.Scalar x
toSequential (MultiCore.SimpleFinite i ts) = Sequential.SimpleFinite i ts
toSequential (MultiCore.FiniteTensor i ts) = Sequential.FiniteTensor i $ Boxed.map toSequential ts