dunai-0.8.3: src/Data/MonadicStreamFunction/Instances/Num.hs
{-# OPTIONS_GHC -fno-warn-orphans #-}
-- |
-- Copyright : (c) Ivan Perez and Manuel Baerenz, 2016
-- License : BSD3
-- Maintainer : ivan.perez@keera.co.uk
--
-- Number instances for 'MSF's that produce numbers. This allows you to use
-- numeric operators with 'MSF's that output numbers, for example, you can
-- write:
--
-- @
-- msf1 :: MSF Input Double -- defined however you want
-- msf2 :: MSF Input Double -- defined however you want
-- msf3 :: MSF Input Double
-- msf3 = msf1 + msf2
-- @
--
-- instead of
--
-- @
-- msf3 = (msf1 &&& msf2) >>> arr (uncurry (+))
-- @
--
-- Instances are provided for the type classes 'Num', 'Fractional' and
-- 'Floating'.
module Data.MonadicStreamFunction.Instances.Num where
-- Internal imports
import Control.Arrow.Util (constantly, elementwise, elementwise2)
import Data.MonadicStreamFunction.Core (MSF)
-- | 'Num' instance for 'MSF's.
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
-- | 'Fractional' instance for 'MSF's.
instance (Monad m, Fractional b) => Fractional (MSF m a b) where
fromRational = constantly . fromRational
(/) = elementwise2 (/)
recip = elementwise recip
-- | 'Floating' instance for 'MSF's.
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