{-# LANGUAGE EmptyDataDecls #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
module TypeLevel.Number.Classes (
Compare
, compareN
, IsLesser
, IsEqual
, IsGreater
, Lesser
, LesserEq
, Greater
, GreaterEq
, Positive
, NonZero
, Next
, nextN
, Prev
, prevN
, Negate
, negateN
, Add
, addN
, Sub
, subN
, Mul
, mulN
, Div
, divN
, Normalized
) where
type family Compare n m :: *
compareN :: n -> m -> Compare n m
compareN :: forall n m. n -> m -> Compare n m
compareN n
_ m
_ = Compare n m
forall a. HasCallStack => a
undefined
data IsLesser
data IsEqual
data IsGreater
instance Show IsLesser where show :: IsLesser -> String
show IsLesser
_ = String
"IsLesser"
instance Show IsEqual where show :: IsEqual -> String
show IsEqual
_ = String
"IsEqual"
instance Show IsGreater where show :: IsGreater -> String
show IsGreater
_ = String
"IsGreater"
class Lesser n m
class Greater n m
class LesserEq n m
class GreaterEq n m
class OneOfTwo a b c
instance OneOfTwo a a b
instance OneOfTwo a b a
instance OneOfTwo a a a
instance (Compare n m ~ IsLesser ) => Lesser n m
instance (Compare n m ~ IsGreater) => Greater n m
instance (OneOfTwo (Compare n m) IsLesser IsEqual) => LesserEq n m
instance (OneOfTwo (Compare n m) IsGreater IsEqual) => GreaterEq n m
class NonZero n
class Positive n
type family Next n :: *
nextN :: n -> Next n
nextN :: forall n. n -> Next n
nextN n
_ = Next n
forall a. HasCallStack => a
undefined
type family Prev n :: *
prevN :: n -> Prev n
prevN :: forall n. n -> Prev n
prevN n
_ = Prev n
forall a. HasCallStack => a
undefined
type family Negate n :: *
negateN :: n -> Negate n
negateN :: forall n. n -> Negate n
negateN n
_ = Negate n
forall a. HasCallStack => a
undefined
type family Add n m :: *
addN :: n -> m -> Add n m
addN :: forall n m. n -> m -> Add n m
addN n
_ m
_ = Add n m
forall a. HasCallStack => a
undefined
type family Sub n m :: *
subN :: n -> m -> Sub n m
subN :: forall n m. n -> m -> Sub n m
subN n
_ m
_ = Sub n m
forall a. HasCallStack => a
undefined
type family Mul n m :: *
mulN :: n -> m -> Mul n m
mulN :: forall n m. n -> m -> Mul n m
mulN n
_ m
_ = Mul n m
forall a. HasCallStack => a
undefined
type family Div n m :: *
divN :: n -> m -> Div n m
divN :: forall n m. n -> m -> Div n m
divN n
_ m
_ = Div n m
forall a. HasCallStack => a
undefined
type family Normalized n :: *