{-# LANGUAGE UnboxedTuples #-}

module JavaScript.Object ( Object
                         , create
                         , getProp, unsafeGetProp
                         , setProp, unsafeSetProp
                         , allProps, listProps
                         , isInstanceOf
                         ) where



import           Data.JSString

import qualified JavaScript.Array as A

import qualified JavaScript.Array.Internal as AI
import           JavaScript.Object.Internal (Object(..))

import           JavaScript.Object.Internal -- as I

import           GHCJS.Types

{-
-- | create an empty object
create :: IO Object
create = fmap Object I.create
{-# INLINE create #-}

allProps :: Object -> IO (JSArray JSString)
allProps (Object o) = fmap AI.JSArray (I.allProps o)
{-# INLINE allProps #-}

listProps :: Object -> IO [JSString]
listProps (Object o) = I.listProps o
{-# INLINE listProps #-}

{- | get a property from an object. If accessing the property results in
     an exception, the exception is converted to a JSException. Since exception
     handling code prevents some optimizations in some JS engines, you may want
     to use unsafeGetProp instead
 -}
getProp :: JSString -> Object -> IO (JSVal a)
getProp p (Object o) = I.getProp p o
{-# INLINE getProp #-}

unsafeGetProp :: JSString -> Object -> IO (JSVal a)
unsafeGetProp p (Object o) = I.unsafeGetProp p o
{-# INLINE unsafeGetProp #-}

setProp :: JSString -> JSVal a -> Object -> IO ()
setProp p v (Object o) = I.setProp p v o
{-# INLINE setProp #-}

unsafeSetProp :: JSString -> JSVal a -> Object -> IO ()
unsafeSetProp p v (Object o) = I.unsafeSetProp p v o
{-# INLINE unsafeSetProp #-}

isInstanceOf :: Object -> JSVal a -> Bool
isInstanceOf (Object o) s = I.isInstanceOf o s
{-# INLINE isInstanceOf #-}
-}

-- -----------------------------------------------------------------------------
{-
foreign import javascript safe   "$2[$1]"
  js_getProp       :: JSString -> JSVal a -> IO (JSVal b)
foreign import javascript unsafe "$2[$1]"
  js_unsafeGetProp :: JSString -> JSVal a -> IO (JSVal b)
foreign import javascript safe   "$3[$1] = $2"
  js_setProp       :: JSString -> JSVal a -> JSVal b -> IO ()
foreign import javascript unsafe "$3[$1] = $2"
  js_unsafeSetProp :: JSString -> JSVal a -> JSVal b -> IO ()
foreign import javascript unsafe "$1 instanceof $2"
  js_isInstanceOf  :: Object -> JSVal a -> Bool
foreign import javascript unsafe  "h$allProps"
  js_allProps      :: Object -> IO (JSArray JSString)
foreign import javascript unsafe  "h$listProps"
  js_listProps     :: Object -> (# [JSString] #)
-}