200 lines
6 KiB
Haskell
200 lines
6 KiB
Haskell
{-# LANGUAGE BangPatterns #-}
|
|
{-# LANGUAGE DeriveDataTypeable #-}
|
|
{-# LANGUAGE TypeFamilies #-}
|
|
{-# LANGUAGE RebindableSyntax #-}
|
|
{-# LANGUAGE NoImplicitPrelude #-}
|
|
{-# Language CPP #-}
|
|
-- |
|
|
-- Module : Basement.Compat.NumLiteral
|
|
-- License : BSD-style
|
|
-- Maintainer : Foundation
|
|
--
|
|
-- Literal support for Integral and Fractional
|
|
{-# LANGUAGE TypeSynonymInstances #-}
|
|
{-# LANGUAGE FlexibleInstances #-}
|
|
module Basement.Compat.NumLiteral
|
|
( Integral(..)
|
|
, Fractional(..)
|
|
, HasNegation(..)
|
|
) where
|
|
|
|
import Prelude (Int, Integer, Rational, Float, Double)
|
|
import Data.Word (Word8, Word16, Word32, Word64, Word)
|
|
import Data.Int (Int8, Int16, Int32, Int64)
|
|
import Basement.Compat.C.Types
|
|
import qualified Prelude
|
|
import Basement.Compat.Natural
|
|
import Foreign.Ptr (IntPtr)
|
|
|
|
-- | Integral Literal support
|
|
--
|
|
-- e.g. 123 :: Integer
|
|
-- 123 :: Word8
|
|
class Integral a where
|
|
fromInteger :: Integer -> a
|
|
|
|
-- | Fractional Literal support
|
|
--
|
|
-- e.g. 1.2 :: Double
|
|
-- 0.03 :: Float
|
|
class Fractional a where
|
|
fromRational :: Rational -> a
|
|
|
|
-- | Negation support
|
|
--
|
|
-- e.g. -(f x)
|
|
class HasNegation a where
|
|
negate :: a -> a
|
|
|
|
instance Integral Integer where
|
|
fromInteger a = a
|
|
instance Integral Natural where
|
|
fromInteger a = Prelude.fromInteger a
|
|
instance Integral Int where
|
|
fromInteger a = Prelude.fromInteger a
|
|
instance Integral Word where
|
|
fromInteger a = Prelude.fromInteger a
|
|
instance Integral Word8 where
|
|
fromInteger a = Prelude.fromInteger a
|
|
instance Integral Word16 where
|
|
fromInteger a = Prelude.fromInteger a
|
|
instance Integral Word32 where
|
|
fromInteger a = Prelude.fromInteger a
|
|
instance Integral Word64 where
|
|
fromInteger a = Prelude.fromInteger a
|
|
instance Integral Int8 where
|
|
fromInteger a = Prelude.fromInteger a
|
|
instance Integral Int16 where
|
|
fromInteger a = Prelude.fromInteger a
|
|
instance Integral Int32 where
|
|
fromInteger a = Prelude.fromInteger a
|
|
instance Integral Int64 where
|
|
fromInteger a = Prelude.fromInteger a
|
|
instance Integral IntPtr where
|
|
fromInteger a = Prelude.fromInteger a
|
|
|
|
instance Integral Float where
|
|
fromInteger a = Prelude.fromInteger a
|
|
instance Integral Double where
|
|
fromInteger a = Prelude.fromInteger a
|
|
|
|
instance Integral CChar where
|
|
fromInteger a = Prelude.fromInteger a
|
|
instance Integral CSChar where
|
|
fromInteger a = Prelude.fromInteger a
|
|
instance Integral CUChar where
|
|
fromInteger a = Prelude.fromInteger a
|
|
instance Integral CShort where
|
|
fromInteger a = Prelude.fromInteger a
|
|
instance Integral CUShort where
|
|
fromInteger a = Prelude.fromInteger a
|
|
instance Integral CInt where
|
|
fromInteger a = Prelude.fromInteger a
|
|
instance Integral CUInt where
|
|
fromInteger a = Prelude.fromInteger a
|
|
instance Integral CLong where
|
|
fromInteger a = Prelude.fromInteger a
|
|
instance Integral CULong where
|
|
fromInteger a = Prelude.fromInteger a
|
|
instance Integral CPtrdiff where
|
|
fromInteger a = Prelude.fromInteger a
|
|
instance Integral CSize where
|
|
fromInteger a = Prelude.fromInteger a
|
|
instance Integral CWchar where
|
|
fromInteger a = Prelude.fromInteger a
|
|
instance Integral CSigAtomic where
|
|
fromInteger a = Prelude.fromInteger a
|
|
instance Integral CLLong where
|
|
fromInteger a = Prelude.fromInteger a
|
|
instance Integral CULLong where
|
|
fromInteger a = Prelude.fromInteger a
|
|
#if MIN_VERSION_base(4, 10, 0)
|
|
instance Integral CBool where
|
|
fromInteger a = Prelude.fromInteger a
|
|
#endif
|
|
instance Integral CIntPtr where
|
|
fromInteger a = Prelude.fromInteger a
|
|
instance Integral CUIntPtr where
|
|
fromInteger a = Prelude.fromInteger a
|
|
instance Integral CIntMax where
|
|
fromInteger a = Prelude.fromInteger a
|
|
instance Integral CUIntMax where
|
|
fromInteger a = Prelude.fromInteger a
|
|
instance Integral CClock where
|
|
fromInteger a = Prelude.fromInteger a
|
|
instance Integral CTime where
|
|
fromInteger a = Prelude.fromInteger a
|
|
instance Integral CUSeconds where
|
|
fromInteger a = Prelude.fromInteger a
|
|
instance Integral CSUSeconds where
|
|
fromInteger a = Prelude.fromInteger a
|
|
instance Integral COff where
|
|
fromInteger a = Prelude.fromInteger a
|
|
instance Integral CFloat where
|
|
fromInteger a = Prelude.fromInteger a
|
|
instance Integral CDouble where
|
|
fromInteger a = Prelude.fromInteger a
|
|
|
|
instance HasNegation Integer where
|
|
negate = Prelude.negate
|
|
instance HasNegation Int where
|
|
negate = Prelude.negate
|
|
instance HasNegation Int8 where
|
|
negate = Prelude.negate
|
|
instance HasNegation Int16 where
|
|
negate = Prelude.negate
|
|
instance HasNegation Int32 where
|
|
negate = Prelude.negate
|
|
instance HasNegation Int64 where
|
|
negate = Prelude.negate
|
|
instance HasNegation Word where
|
|
negate = Prelude.negate
|
|
instance HasNegation Word8 where
|
|
negate = Prelude.negate
|
|
instance HasNegation Word16 where
|
|
negate = Prelude.negate
|
|
instance HasNegation Word32 where
|
|
negate = Prelude.negate
|
|
instance HasNegation Word64 where
|
|
negate = Prelude.negate
|
|
|
|
instance HasNegation Float where
|
|
negate = Prelude.negate
|
|
instance HasNegation Double where
|
|
negate = Prelude.negate
|
|
|
|
instance HasNegation CChar where
|
|
negate = Prelude.negate
|
|
instance HasNegation CSChar where
|
|
negate = Prelude.negate
|
|
instance HasNegation CShort where
|
|
negate = Prelude.negate
|
|
instance HasNegation CInt where
|
|
negate = Prelude.negate
|
|
instance HasNegation CLong where
|
|
negate = Prelude.negate
|
|
instance HasNegation CPtrdiff where
|
|
negate = Prelude.negate
|
|
instance HasNegation CWchar where
|
|
negate = Prelude.negate
|
|
instance HasNegation CLLong where
|
|
negate = Prelude.negate
|
|
instance HasNegation CIntMax where
|
|
negate = Prelude.negate
|
|
|
|
instance HasNegation CFloat where
|
|
negate = Prelude.negate
|
|
instance HasNegation CDouble where
|
|
negate = Prelude.negate
|
|
|
|
instance Fractional Rational where
|
|
fromRational a = Prelude.fromRational a
|
|
instance Fractional Float where
|
|
fromRational a = Prelude.fromRational a
|
|
instance Fractional Double where
|
|
fromRational a = Prelude.fromRational a
|
|
|
|
instance Fractional CFloat where
|
|
fromRational a = Prelude.fromRational a
|
|
instance Fractional CDouble where
|
|
fromRational a = Prelude.fromRational a
|