{-# LANGUAGE TypeFamilies           #-}
module Data.MonadicStreamFunction.Instances.VectorSpace where


import Control.Arrow.Util
import Data.MonadicStreamFunction.Core
import Data.MonadicStreamFunction.Instances
import Data.VectorSpace


-- These conflict with Data.VectorSpace.Instances
instance (Monad m, RModule v) => RModule (MStreamF m a v) where
    type Groundring (MStreamF m a v) = Groundring v
    zeroVector   = constantly zeroVector
    r *^ msf     = elementwise (r *^) msf
    negateVector = elementwise negateVector
    (^+^)        = elementwise2 (^+^)
    (^-^)        = elementwise2 (^-^)

instance (Monad m, VectorSpace v) => VectorSpace (MStreamF m a v) where
    msf ^/ r = elementwise (^/ r) msf