module Copilot.Language.Operators.Integral
( div
, mod
) where
import Copilot.Core (Typed, typeOf)
import qualified Copilot.Core as Core
import Copilot.Language.Stream
import qualified Prelude as P
div :: (Typed a, P.Integral a) => Stream a -> Stream a -> Stream a
(Const 0) `div` _ = Const 0
_ `div` (Const 0) = Core.badUsage "in div: division by zero"
x `div` (Const 1) = x
x `div` y = Op2 (Core.Div typeOf) x y
mod :: (Typed a, P.Integral a) => Stream a -> Stream a -> Stream a
_ `mod` (Const 0) = Core.badUsage "in mod: division by zero"
(Const 0) `mod` _ = (Const 0)
(Const x) `mod` (Const y) = Const (x `P.mod` y)
x `mod` y = Op2 (Core.Mod typeOf) x y