{-# LANGUAGE FlexibleInstances, FlexibleContexts, MultiParamTypeClasses, GeneralizedNewtypeDeriving #-}
module Data.Ring.FromNum 
    ( module Data.Ring
    , FromNum(FromNum, getFromNum)
    ) where

import Data.Ring
import Data.Monoid.Reducer

newtype FromNum a = FromNum { getFromNum :: a } deriving (Eq,Show,Num)

instance Num a => Monoid (FromNum a) where
    mempty = fromInteger 0
    mappend = (+)

instance Num a => Group (FromNum a) where
    minus = (-)
    gnegate = negate
    
instance Num a => MultiplicativeMonoid (FromNum a) where
    one = fromInteger 1
    times = (*)

instance Num a => Seminearring (FromNum a)
    
instance Num a => Reducer Integer (FromNum a) where
    unit = fromInteger