{-# LANGUAGE DataKinds        #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE KindSignatures   #-}
{-# LANGUAGE MagicHash        #-}
{-# LANGUAGE MonoLocalBinds   #-}
{-# LANGUAGE PatternSynonyms  #-}
-- | Scalar is an alias to zero-dimensional DataFrame
module Numeric.Scalar.Internal
    ( Scalar, unScalar, scalar, fromScalar
    , Scf, Scd, Sci, Scw
    , pattern S
    ) where

import Numeric.DataFrame.Internal.PrimArray (broadcast)
import Numeric.DataFrame.Type

-- | Alias for zero-dimensional DataFrame
type Scalar t = DataFrame t ('[] :: [Nat])
type Scf   = Scalar Float
type Scd   = Scalar Double
type Sci   = Scalar Int
type Scw   = Scalar Word

-- | Broadcast scalar value onto a whole data frame
fromScalar :: PrimArray t (DataFrame t ds)
           => Scalar t -> DataFrame t (ds :: [Nat])
fromScalar :: Scalar t -> DataFrame t ds
fromScalar = t -> DataFrame t ds
forall t a. PrimArray t a => t -> a
broadcast (t -> DataFrame t ds)
-> (Scalar t -> t) -> Scalar t -> DataFrame t ds
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Scalar t -> t
forall t. DataFrame t '[] -> t
unScalar
{-# INLINE fromScalar #-}