module RTP where
import RTS
import qualified RTN
import qualified Prelude


-- import qualified RTS

undefined = Prelude.undefined
data Bool = False | True

type Float = Prelude.Double
-- newtype Float = FloatT { unboxFloat :: Prelude.Float}
newtype Char = CharT { unboxChar :: Prelude.Char }

_Int = ()
_Float = ()
_String =  ()
_Char = ()

_primShowBool :: Bool -> Prelude.String
_primShowBool False = "False"
_primShowBool True = "True"

_primShowInt :: Prelude.Int -> Prelude.String
_primShowInt = Prelude.show

_primIntZero :: Prelude.Int
_primIntZero = (0::Prelude.Int)

_primIntOne :: Prelude.Int
_primIntOne = (1::Prelude.Int)

_primIntAdd :: Prelude.Int -> Prelude.Int -> Prelude.Int
_primIntAdd = (Prelude.+)

_primIntSub :: Prelude.Int -> Prelude.Int -> Prelude.Int
_primIntSub = (Prelude.-)


_primIntMul :: Prelude.Int -> Prelude.Int -> Prelude.Int
_primIntMul = (Prelude.*)

_primIntDiv :: Prelude.Int -> Prelude.Int -> Prelude.Int
_primIntDiv = (Prelude.div)

_primIntMod :: Prelude.Int -> Prelude.Int -> Prelude.Int
_primIntMod = (Prelude.mod)

_primIntEquals :: Prelude.Int -> Prelude.Int -> Prelude.Bool
_primIntEquals = (Prelude.==)

_primIntLess :: Prelude.Int -> Prelude.Int -> Prelude.Bool
_primIntLess = (Prelude.<)

_int = _primNatToInt
_primNatToInt RTN.C2 = (0::Prelude.Int)
_primNatToInt (RTN.C3 n) = ( _primIntAdd (1::Prelude.Int)  ( (_primNatToInt(cast n))))

_primIntToNat 0 = zero
_primIntToNat n | (Prelude.>) n (0 :: Prelude.Int) = suc (cast (_primIntToNat (  _primIntSub n (1::Prelude.Int))))
        | Prelude.otherwise = _primIntToNat (_primIntSub 0 n)
_abs = _primIntToNat

_primShowFloat :: Float -> Prelude.String
_primShowFloat f = Prelude.show f
-- _primShowFloat (FloatT f) = Prelude.show f

_primShowChar c = [ unboxChar c]

_primStringAppend :: Prelude.String -> Prelude.String -> Prelude.String
_primStringAppend = (Prelude.++)

_primStringReverse = Prelude.reverse
_primStringToList s = Prelude.map CharT s
_primStringFromList s = Prelude.map unboxChar s

_primNatPlus m n = _abs (_primIntAdd (_int m) (_int n))
_primNatMinus m n = _abs (_primIntSub (_int m) (_int n))
_primNatTimes m n = _abs (_primIntMul (_int m) (_int n))
_primNatDivSuc m n= _abs (_primIntDiv (_int m) (_int n))
_primNatModSuc m n = _abs (_primIntMod (_int m) (_int n))
_primNatLess m n = _primIntLess (_int m) (_int n)
_primNatEquals m n = _primIntEquals (_int m) (_int n)

-- For tests
zero = RTN.C2
suc = RTN.C3
one = suc zero
two = suc one

