{-# LANGUAGE Haskell2010
    , GADTs
 #-}
{-# OPTIONS -Wall #-}

module Foreign.Java.JNI.Types where

import Data.Int
import Data.Word

import Foreign (ForeignPtr)

data JVM
data JObjectRef
data JClassRef
data JThrowableRef
data JMethodID
data JStaticMethodID
data JFieldID
data JStaticFieldID
data JConstructorID
data JValues
data JChars
data JBytes

data JArg where
    BooleanA :: Bool -> JArg
    CharA    :: Word16 -> JArg
    ByteA    :: Int8 -> JArg
    ShortA   :: Int16 -> JArg
    IntA     :: Int32 -> JArg
    LongA    :: Int64 -> JArg
    FloatA   :: Float -> JArg
    DoubleA  :: Double -> JArg
    StringA  :: String -> JArg
    ObjectA  :: (Maybe JObject) -> JArg
    ArrayA   :: (Maybe (JArray e)) -> JArg

-- | A reference to an arbitrary Object.
newtype JObject = JObject { jobjectPtr :: ForeignPtr JObjectRef }
    deriving Show

-- | A reference to a Class object.
newtype JClass = JClass { jclassPtr :: ForeignPtr JClassRef }
    deriving Show

-- | A reference to an Exception.
newtype JThrowable = JThrowable { jthrowablePtr :: ForeignPtr JThrowableRef }
    deriving Show

-- | A reference to an Array in the JVM.
data JArray e = JArray {
    jarrayLength :: Int32,
    jarrayPtr :: ForeignPtr JObjectRef
  } deriving Show