{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE ForeignFunctionInterface #-}
{-# LANGUAGE JavaScriptFFI #-}
{-# LANGUAGE UnboxedTuples #-}
{-# LANGUAGE GHCForeignImportPrim #-}
{-# LANGUAGE EmptyDataDecls #-}
{-# LANGUAGE UnliftedFFITypes #-}
module JavaScript.Object.Internal
( Object(..)
, create
, allProps
, listProps
, getProp
, unsafeGetProp
, setProp
, unsafeSetProp
, isInstanceOf
) where
import Data.JSString
import Data.Typeable
import qualified GHCJS.Prim as Prim
import GHCJS.Types
import qualified JavaScript.Array as JA
import JavaScript.Array.Internal (JSArray, SomeJSArray(..))
import Unsafe.Coerce
import qualified GHC.Exts as Exts
newtype Object = Object JSVal deriving (Typeable)
instance IsJSVal Object
create :: IO Object
create = js_create
{-# INLINE create #-}
allProps :: Object -> IO JSArray
allProps o = js_allProps o
{-# INLINE allProps #-}
listProps :: Object -> IO [JSString]
listProps o = unsafeCoerce (js_listProps o)
{-# INLINE listProps #-}
getProp :: JSString -> Object -> IO JSVal
getProp p o = js_getProp p o
{-# INLINE getProp #-}
unsafeGetProp :: JSString -> Object -> IO JSVal
unsafeGetProp p o = js_unsafeGetProp p o
{-# INLINE unsafeGetProp #-}
setProp :: JSString -> JSVal -> Object -> IO ()
setProp p v o = js_setProp p v o
{-# INLINE setProp #-}
unsafeSetProp :: JSString -> JSVal -> Object -> IO ()
unsafeSetProp p v o = js_unsafeSetProp p v o
{-# INLINE unsafeSetProp #-}
isInstanceOf :: Object -> JSVal -> Bool
isInstanceOf o s = js_isInstanceOf o s
{-# INLINE isInstanceOf #-}
foreign import javascript unsafe "$r = {};"
js_create :: IO Object
foreign import javascript safe "$2[$1]"
js_getProp :: JSString -> Object -> IO JSVal
foreign import javascript unsafe "$2[$1]"
js_unsafeGetProp :: JSString -> Object -> IO JSVal
foreign import javascript safe "$3[$1] = $2"
js_setProp :: JSString -> JSVal -> Object -> IO ()
foreign import javascript unsafe "$3[$1] = $2"
js_unsafeSetProp :: JSString -> JSVal -> Object -> IO ()
foreign import javascript unsafe "$1 instanceof $2"
js_isInstanceOf :: Object -> JSVal -> Bool
foreign import javascript unsafe "h$allProps"
js_allProps :: Object -> IO JSArray
foreign import javascript unsafe "h$listProps"
js_listProps :: Object -> IO Exts.Any