{-# LANGUAGE TypeFamilies         #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Data.MonadicStreamFunction.Instances.Num where

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

instance (Monad m, Num b) => Num (MSF m a b) where
  (+)         = elementwise2 (+)
  (-)         = elementwise2 (-)
  (*)         = elementwise2 (*)
  abs         = elementwise abs
  signum      = elementwise signum
  negate      = elementwise negate
  fromInteger = constantly . fromInteger

instance (Monad m, Fractional b) => Fractional (MSF m a b) where
  fromRational = constantly . fromRational
  (/)          = elementwise2 (/)
  recip        = elementwise recip

instance (Monad m, Floating b) => Floating (MSF m a b) where
  pi      = constantly   pi
  exp     = elementwise  exp
  log     = elementwise  log
  sqrt    = elementwise  sqrt
  (**)    = elementwise2 (**)
  logBase = elementwise2 logBase
  sin     = elementwise  sin
  cos     = elementwise  cos
  tan     = elementwise  tan
  asin    = elementwise  asin
  acos    = elementwise  acos
  atan    = elementwise  atan
  sinh    = elementwise  sinh
  cosh    = elementwise  cosh
  tanh    = elementwise  tanh
  asinh   = elementwise  asinh
  acosh   = elementwise  acosh
  atanh   = elementwise  atanh