{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
module What4.FloatMode
( type FloatMode
, FloatModeRepr(..)
, FloatIEEE
, FloatUninterpreted
, FloatReal
) where
import Data.Kind (Type)
import Data.Parameterized.Classes
data FloatMode where
FloatIEEE :: FloatMode
FloatUninterpreted :: FloatMode
FloatReal :: FloatMode
type FloatIEEE = 'FloatIEEE
type FloatUninterpreted = 'FloatUninterpreted
type FloatReal = 'FloatReal
data FloatModeRepr :: FloatMode -> Type where
FloatIEEERepr :: FloatModeRepr FloatIEEE
FloatUninterpretedRepr :: FloatModeRepr FloatUninterpreted
FloatRealRepr :: FloatModeRepr FloatReal
instance Show (FloatModeRepr fm) where
showsPrec :: Int -> FloatModeRepr fm -> ShowS
showsPrec Int
_ FloatModeRepr fm
FloatIEEERepr = String -> ShowS
showString String
"FloatIEEE"
showsPrec Int
_ FloatModeRepr fm
FloatUninterpretedRepr = String -> ShowS
showString String
"FloatUninterpreted"
showsPrec Int
_ FloatModeRepr fm
FloatRealRepr = String -> ShowS
showString String
"FloatReal"
instance ShowF FloatModeRepr
instance KnownRepr FloatModeRepr FloatIEEE where knownRepr :: FloatModeRepr 'FloatIEEE
knownRepr = FloatModeRepr 'FloatIEEE
FloatIEEERepr
instance KnownRepr FloatModeRepr FloatUninterpreted where knownRepr :: FloatModeRepr 'FloatUninterpreted
knownRepr = FloatModeRepr 'FloatUninterpreted
FloatUninterpretedRepr
instance KnownRepr FloatModeRepr FloatReal where knownRepr :: FloatModeRepr 'FloatReal
knownRepr = FloatModeRepr 'FloatReal
FloatRealRepr
instance TestEquality FloatModeRepr where
testEquality :: forall (a :: FloatMode) (b :: FloatMode).
FloatModeRepr a -> FloatModeRepr b -> Maybe (a :~: b)
testEquality FloatModeRepr a
FloatIEEERepr FloatModeRepr b
FloatIEEERepr = (a :~: b) -> Maybe (a :~: b)
forall a. a -> Maybe a
forall (m :: Type -> Type) a. Monad m => a -> m a
return a :~: a
a :~: b
forall {k} (a :: k). a :~: a
Refl
testEquality FloatModeRepr a
FloatUninterpretedRepr FloatModeRepr b
FloatUninterpretedRepr = (a :~: b) -> Maybe (a :~: b)
forall a. a -> Maybe a
forall (m :: Type -> Type) a. Monad m => a -> m a
return a :~: a
a :~: b
forall {k} (a :: k). a :~: a
Refl
testEquality FloatModeRepr a
FloatRealRepr FloatModeRepr b
FloatRealRepr = (a :~: b) -> Maybe (a :~: b)
forall a. a -> Maybe a
forall (m :: Type -> Type) a. Monad m => a -> m a
return a :~: a
a :~: b
forall {k} (a :: k). a :~: a
Refl
testEquality FloatModeRepr a
_ FloatModeRepr b
_ = Maybe (a :~: b)
forall a. Maybe a
Nothing