-- Copyright (c) David Amos, 2009. All rights reserved.


{-# LANGUAGE EmptyDataDecls, ScopedTypeVariables #-}

module Math.Common.IntegerAsType where

class IntegerAsType a where
    value :: a -> Integer

-- multiplication of IntegerAsType

data M a b = M a b
instance (IntegerAsType a, IntegerAsType b) => IntegerAsType (M a b) where
    value :: M a b -> Integer
value _ = a -> Integer
forall a. IntegerAsType a => a -> Integer
value (a
forall a. HasCallStack => a
undefined :: a) Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* b -> Integer
forall a. IntegerAsType a => a -> Integer
value (b
forall a. HasCallStack => a
undefined :: b)

data TMinus1
instance IntegerAsType TMinus1 where value :: TMinus1 -> Integer
value _ = -1

data TZero
instance IntegerAsType TZero where value :: TZero -> Integer
value _ = 0

data TOne
instance IntegerAsType TOne where value :: TOne -> Integer
value _ = 1

data T2
instance IntegerAsType T2 where value :: T2 -> Integer
value _ = 2

data T3
instance IntegerAsType T3 where value :: T3 -> Integer
value _ = 3

data T5
instance IntegerAsType T5 where value :: T5 -> Integer
value _ = 5

data T7
instance IntegerAsType T7 where value :: T7 -> Integer
value _ = 7

data T11
instance IntegerAsType T11 where value :: T11 -> Integer
value _ = 11

data T13
instance IntegerAsType T13 where value :: T13 -> Integer
value _ = 13

data T17
instance IntegerAsType T17 where value :: T17 -> Integer
value _ = 17

data T19
instance IntegerAsType T19 where value :: T19 -> Integer
value _ = 19

data T23
instance IntegerAsType T23 where value :: T23 -> Integer
value _ = 23

data T29
instance IntegerAsType T29 where value :: T29 -> Integer
value _ = 29

data T31
instance IntegerAsType T31 where value :: T31 -> Integer
value _ = 31

data T37
instance IntegerAsType T37 where value :: T37 -> Integer
value _ = 37

data T41
instance IntegerAsType T41 where value :: T41 -> Integer
value _ = 41

data T43
instance IntegerAsType T43 where value :: T43 -> Integer
value _ = 43

data T47
instance IntegerAsType T47 where value :: T47 -> Integer
value _ = 47

data T53
instance IntegerAsType T53 where value :: T53 -> Integer
value _ = 53

data T59
instance IntegerAsType T59 where value :: T59 -> Integer
value _ = 59

data T61
instance IntegerAsType T61 where value :: T61 -> Integer
value _ = 61

data T67
instance IntegerAsType T67 where value :: T67 -> Integer
value _ = 67

data T71
instance IntegerAsType T71 where value :: T71 -> Integer
value _ = 71

data T73
instance IntegerAsType T73 where value :: T73 -> Integer
value _ = 73

data T79
instance IntegerAsType T79 where value :: T79 -> Integer
value _ = 79

data T83
instance IntegerAsType T83 where value :: T83 -> Integer
value _ = 83

data T89
instance IntegerAsType T89 where value :: T89 -> Integer
value _ = 89

data T97
instance IntegerAsType T97 where value :: T97 -> Integer
value _ = 97