{-# LANGUAGE DataKinds              #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE MultiParamTypeClasses  #-}
{-# LANGUAGE TypeFamilies           #-}
module CLaSH.Class.Num where

import GHC.TypeLits

-- | Implicitly adding or subtracting values of two different (sub-)types.
class Add a b where
  type AResult a b
  plus  :: a -> b -> AResult a b
  minus :: a -> b -> AResult a b

-- | Implicitly multiplying values of two different (sub-)types.
class Mult a b where
  type MResult a b
  mult :: a -> b -> MResult a b

-- | Coerce a value to be represented by a different number of bits
class Resize f where
  resize :: (KnownNat a, KnownNat b) => f a -> f b