{-# 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 :: Word -> SignOf Word
sign = forall a b. (Integral a, Num b) => a -> b
fromIntegral
  {-# INLINE sign #-}

instance Sign Word8 where
  type SignOf Word8 = Int8
  sign :: Word8 -> SignOf Word8
sign = forall a b. (Integral a, Num b) => a -> b
fromIntegral
  {-# INLINE sign #-}

instance Sign Word16 where
  type SignOf Word16 = Int16
  sign :: Word16 -> SignOf Word16
sign = forall a b. (Integral a, Num b) => a -> b
fromIntegral
  {-# INLINE sign #-}

instance Sign Word32 where
  type SignOf Word32 = Int32
  sign :: Word32 -> SignOf Word32
sign = forall a b. (Integral a, Num b) => a -> b
fromIntegral
  {-# INLINE sign #-}

instance Sign Word64 where
  type SignOf Word64 = Int64
  sign :: Word64 -> SignOf Word64
sign = forall a b. (Integral a, Num b) => a -> b
fromIntegral
  {-# INLINE sign #-}

instance Sign Int where
  type SignOf Int = Int
  sign :: Int -> SignOf Int
sign = forall a b. (Integral a, Num b) => a -> b
fromIntegral
  {-# INLINE sign #-}

instance Sign Int8 where
  type SignOf Int8 = Int8
  sign :: Int8 -> SignOf Int8
sign = forall a b. (Integral a, Num b) => a -> b
fromIntegral
  {-# INLINE sign #-}

instance Sign Int16 where
  type SignOf Int16 = Int16
  sign :: Int16 -> SignOf Int16
sign = forall a b. (Integral a, Num b) => a -> b
fromIntegral
  {-# INLINE sign #-}

instance Sign Int32 where
  type SignOf Int32 = Int32
  sign :: Int32 -> SignOf Int32
sign = forall a b. (Integral a, Num b) => a -> b
fromIntegral
  {-# INLINE sign #-}

instance Sign Int64 where
  type SignOf Int64 = Int64
  sign :: Int64 -> SignOf Int64
sign = forall a b. (Integral a, Num b) => a -> b
fromIntegral
  {-# INLINE sign #-}