{-# LANGUAGE TypeFamilies #-}

module HaskellWorks.Data.Sign
    ( Sign(..)
    ) where

import Data.Int
import Data.Word

class Sign a where
  type SignOf a
  sign :: a -> SignOf a

instance Sign Word where
  type SignOf Word = Int
  sign = fromIntegral
  {-# INLINE sign #-}

instance Sign Word8 where
  type SignOf Word8 = Int8
  sign = fromIntegral
  {-# INLINE sign #-}

instance Sign Word16 where
  type SignOf Word16 = Int16
  sign = fromIntegral
  {-# INLINE sign #-}

instance Sign Word32 where
  type SignOf Word32 = Int32
  sign = fromIntegral
  {-# INLINE sign #-}

instance Sign Word64 where
  type SignOf Word64 = Int64
  sign = fromIntegral
  {-# INLINE sign #-}

instance Sign Int where
  type SignOf Int = Int
  sign = fromIntegral
  {-# INLINE sign #-}

instance Sign Int8 where
  type SignOf Int8 = Int8
  sign = fromIntegral
  {-# INLINE sign #-}

instance Sign Int16 where
  type SignOf Int16 = Int16
  sign = fromIntegral
  {-# INLINE sign #-}

instance Sign Int32 where
  type SignOf Int32 = Int32
  sign = fromIntegral
  {-# INLINE sign #-}

instance Sign Int64 where
  type SignOf Int64 = Int64
  sign = fromIntegral
  {-# INLINE sign #-}