{-# LANGUAGE ScopedTypeVariables, ForeignFunctionInterface, JavaScriptFFI #-}
module JavaScript.Cast ( Cast(..)
, cast
, unsafeCast
) where
import GHCJS.Prim
cast :: forall a. Cast a => JSVal -> Maybe a
cast x | js_checkCast x (instanceRef (undefined :: a)) = Just (unsafeWrap x)
| otherwise = Nothing
{-# INLINE cast #-}
unsafeCast :: Cast a => JSVal -> a
unsafeCast x = unsafeWrap x
{-# INLINE unsafeCast #-}
class Cast a where
unsafeWrap :: JSVal -> a
instanceRef :: a -> JSVal
foreign import javascript unsafe
"$1 instanceof $2" js_checkCast :: JSVal -> JSVal -> Bool