-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/


-- | Type-level (low cardinality) integers.
--   
--   This package provides unary type level representations of the
--   (positive and negative) integers and basic operations (addition,
--   subtraction, multiplication, division) on these. Due to the unary
--   implementation the practical size of the NumTypes is severely limited
--   making them unsuitable for large-cardinality applications. If you will
--   be working with integers beyond (-20, 20) this package probably isn't
--   for you. It is, however, eminently suitable for applications such as
--   representing physical dimensions (see the <a>Dimensional</a> library).
--   Requires GHC 6.6.1 or later.
@package numtype
@version 1.1


-- | Please refer to the literate Haskell code for documentation of both
--   API and implementation.
module Numeric.NumType
class (NumTypeI n) => NumType n
class (PosTypeI n) => PosType n
class (NegTypeI n) => NegType n
class (NonZeroI n) => NonZero n
class (NumTypeI a, NumTypeI b) => Succ a b | a -> b, b -> a
class (NumTypeI a, NumTypeI b) => Negate a b | a -> b, b -> a
class (Add a b c, Sub c b a) => Sum a b c | a b -> c, a c -> b, b c -> a
class (NumTypeI a, NonZeroI b, NumTypeI c) => Div a b c | a b -> c, c b -> a
class (NumTypeI a, NumTypeI b, NumTypeI c) => Mul a b c | a b -> c
toNum :: (NumTypeI n, Num a) => n -> a
incr :: (Succ a b) => a -> b
decr :: (Succ a b) => b -> a
negate :: (Negate a b) => a -> b
(+) :: (Sum a b c) => a -> b -> c
(-) :: (Sum a b c) => c -> b -> a
(*) :: (Mul a b c) => a -> b -> c
(/) :: (Div a b c) => a -> b -> c
data Zero
data Pos n
data Neg n
type Pos1 = Pos Zero
type Pos2 = Pos Pos1
type Pos3 = Pos Pos2
type Pos4 = Pos Pos3
type Pos5 = Pos Pos4
type Neg1 = Neg Zero
type Neg2 = Neg Neg1
type Neg3 = Neg Neg2
type Neg4 = Neg Neg3
type Neg5 = Neg Neg4
zero :: Zero
pos1 :: Pos1
pos2 :: Pos2
pos3 :: Pos3
pos4 :: Pos4
pos5 :: Pos5
neg1 :: Neg1
neg2 :: Neg2
neg3 :: Neg3
neg4 :: Neg4
neg5 :: Neg5
instance Numeric.NumType.NumTypeI n => Numeric.NumType.NumType n
instance Numeric.NumType.PosTypeI n => Numeric.NumType.PosType n
instance Numeric.NumType.NegTypeI n => Numeric.NumType.NegType n
instance Numeric.NumType.NonZeroI n => Numeric.NumType.NonZero n
instance Numeric.NumType.NumTypeI Numeric.NumType.Zero
instance Numeric.NumType.PosTypeI Numeric.NumType.Zero
instance Numeric.NumType.NegTypeI Numeric.NumType.Zero
instance Numeric.NumType.PosTypeI n => Numeric.NumType.NumTypeI (Numeric.NumType.Pos n)
instance Numeric.NumType.PosTypeI n => Numeric.NumType.PosTypeI (Numeric.NumType.Pos n)
instance Numeric.NumType.PosTypeI n => Numeric.NumType.NonZeroI (Numeric.NumType.Pos n)
instance Numeric.NumType.NegTypeI n => Numeric.NumType.NumTypeI (Numeric.NumType.Neg n)
instance Numeric.NumType.NegTypeI n => Numeric.NumType.NegTypeI (Numeric.NumType.Neg n)
instance Numeric.NumType.NegTypeI n => Numeric.NumType.NonZeroI (Numeric.NumType.Neg n)
instance GHC.Show.Show Numeric.NumType.Zero
instance Numeric.NumType.PosTypeI n => GHC.Show.Show (Numeric.NumType.Pos n)
instance Numeric.NumType.NegTypeI n => GHC.Show.Show (Numeric.NumType.Neg n)
instance Numeric.NumType.Negate Numeric.NumType.Zero Numeric.NumType.Zero
instance (Numeric.NumType.PosTypeI a, Numeric.NumType.NegTypeI b, Numeric.NumType.Negate a b) => Numeric.NumType.Negate (Numeric.NumType.Pos a) (Numeric.NumType.Neg b)
instance (Numeric.NumType.NegTypeI a, Numeric.NumType.PosTypeI b, Numeric.NumType.Negate a b) => Numeric.NumType.Negate (Numeric.NumType.Neg a) (Numeric.NumType.Pos b)
instance Numeric.NumType.Succ Numeric.NumType.Zero (Numeric.NumType.Pos Numeric.NumType.Zero)
instance Numeric.NumType.PosTypeI a => Numeric.NumType.Succ (Numeric.NumType.Pos a) (Numeric.NumType.Pos (Numeric.NumType.Pos a))
instance Numeric.NumType.Succ (Numeric.NumType.Neg Numeric.NumType.Zero) Numeric.NumType.Zero
instance Numeric.NumType.NegTypeI a => Numeric.NumType.Succ (Numeric.NumType.Neg (Numeric.NumType.Neg a)) (Numeric.NumType.Neg a)
instance Numeric.NumType.NumTypeI a => Numeric.NumType.Add Numeric.NumType.Zero a a
instance (Numeric.NumType.PosTypeI a, Numeric.NumType.Succ b c, Numeric.NumType.Add a c d) => Numeric.NumType.Add (Numeric.NumType.Pos a) b d
instance (Numeric.NumType.NegTypeI a, Numeric.NumType.Succ c b, Numeric.NumType.Add a c d) => Numeric.NumType.Add (Numeric.NumType.Neg a) b d
instance Numeric.NumType.NumType a => Numeric.NumType.Sub a Numeric.NumType.Zero a
instance (Numeric.NumType.Succ a' a, Numeric.NumType.PosTypeI b, Numeric.NumType.Sub a' b c) => Numeric.NumType.Sub a (Numeric.NumType.Pos b) c
instance (Numeric.NumType.Succ a a', Numeric.NumType.NegTypeI b, Numeric.NumType.Sub a' b c) => Numeric.NumType.Sub a (Numeric.NumType.Neg b) c
instance (Numeric.NumType.Add a b c, Numeric.NumType.Sub c b a, Numeric.NumType.Sub c a b) => Numeric.NumType.Sum a b c
instance Numeric.NumType.NonZeroI n => Numeric.NumType.Div Numeric.NumType.Zero n Numeric.NumType.Zero
instance (Numeric.NumType.Sum n' (Numeric.NumType.Pos n'') (Numeric.NumType.Pos n), Numeric.NumType.Div n'' (Numeric.NumType.Pos n') n''', Numeric.NumType.PosTypeI n''') => Numeric.NumType.Div (Numeric.NumType.Pos n) (Numeric.NumType.Pos n') (Numeric.NumType.Pos n''')
instance (Numeric.NumType.NegTypeI n, Numeric.NumType.NegTypeI n', Numeric.NumType.Negate n p, Numeric.NumType.Negate n' p', Numeric.NumType.Div (Numeric.NumType.Pos p) (Numeric.NumType.Pos p') (Numeric.NumType.Pos p'')) => Numeric.NumType.Div (Numeric.NumType.Neg n) (Numeric.NumType.Neg n') (Numeric.NumType.Pos p'')
instance (Numeric.NumType.NegTypeI n, Numeric.NumType.Negate n p', Numeric.NumType.Div (Numeric.NumType.Pos p) (Numeric.NumType.Pos p') (Numeric.NumType.Pos p''), Numeric.NumType.Negate (Numeric.NumType.Pos p'') (Numeric.NumType.Neg n'')) => Numeric.NumType.Div (Numeric.NumType.Pos p) (Numeric.NumType.Neg n) (Numeric.NumType.Neg n'')
instance (Numeric.NumType.NegTypeI n, Numeric.NumType.Negate n p', Numeric.NumType.Div (Numeric.NumType.Pos p') (Numeric.NumType.Pos p) (Numeric.NumType.Pos p''), Numeric.NumType.Negate (Numeric.NumType.Pos p'') (Numeric.NumType.Neg n'')) => Numeric.NumType.Div (Numeric.NumType.Neg n) (Numeric.NumType.Pos p) (Numeric.NumType.Neg n'')
instance Numeric.NumType.NumTypeI n => Numeric.NumType.Mul n Numeric.NumType.Zero Numeric.NumType.Zero
instance (Numeric.NumType.PosTypeI p, Numeric.NumType.Div c (Numeric.NumType.Pos p) a) => Numeric.NumType.Mul a (Numeric.NumType.Pos p) c
instance (Numeric.NumType.NegTypeI n, Numeric.NumType.Div c (Numeric.NumType.Neg n) a) => Numeric.NumType.Mul a (Numeric.NumType.Neg n) c
