m4_divert(-1)
m4_dnl simple macros for defining instances for classes in Jhc.Enum


m4_define(MkNumPrim,{{
instance Num $1 where
    (+) = add$1
    (-) = sub$1
    (*) = mul$1
    negate = negate$1
    abs x = if x < 0 then negate$1 x else x
    signum x = if x == 0 then x else (if x > 0 then one$1 else negate one$1)
    fromInteger = fromInteger$1
    fromInt     = fromInt$1

foreign import primitive "$2{{}}2$2" fromInt$1 :: Int -> $1
foreign import primitive "$2{{}}2$2" fromInteger$1 :: Integer -> $1

foreign import primitive "one" one$1    :: $1
foreign import primitive "Add" add$1    :: $1 -> $1 -> $1
foreign import primitive "Sub" sub$1    :: $1 -> $1 -> $1
foreign import primitive "Mul" mul$1    :: $1 -> $1 -> $1
foreign import primitive "Neg" negate$1 :: $1 -> $1
}})

m4_define(MkRealPrim,{{
instance Real $1 where
    toRational x = toInteger x :% 1
    toDouble x   =  toDouble$1 x

foreign import primitive "$2{{}}2F" toDouble$1 :: $1 -> Double
}})

m4_define(MkIntegralPrim,{{
instance Integral $1 where
--    div = div$1
    quot = quot$1
--    mod = mod$1
    rem = rem$1
    toInt = toInt$1
    toInteger = toInteger$1

foreign import primitive "I2I" toInt$1 :: $1 -> Int
foreign import primitive "I2I" toInteger$1 :: $1 -> Integer
--foreign import primitive "Div" div$1   :: $1 -> $1 -> $1
foreign import primitive "Quot" quot$1 :: $1 -> $1 -> $1
--foreign import primitive "Mod" mod$1   :: $1 -> $1 -> $1
foreign import primitive "Rem" rem$1   :: $1 -> $1 -> $1
}})

m4_define(MkIntegralUPrim,{{
instance Integral $1 where
    div   = udiv$1
    quot  = udiv$1
    mod   = umod$1
    rem   = umod$1
    toInt = toInt$1
    toInteger = toInteger$1

foreign import primitive "U2U" toInt$1 :: $1 -> Int
foreign import primitive "U2U" toInteger$1 :: $1 -> Integer
foreign import primitive "UDiv" udiv$1   :: $1 -> $1 -> $1
foreign import primitive "UMod" umod$1   :: $1 -> $1 -> $1
}})


m4_divert
