{-# OPTIONS_GHC -Wno-redundant-constraints #-}
{-# LANGUAGE ScopedTypeVariables, ForeignFunctionInterface, JavaScriptFFI #-}

module JavaScript.Cast ( Cast(..)
                       , cast
                       , unsafeCast
                       ) where

import GHCJS.Prim

import Unsafe.Coerce

cast :: forall a. Cast a => JSVal -> Maybe a
cast _ = Nothing
{-# INLINE cast #-}

-- | Don't ever run this in GHC - guaranteed segfault
unsafeCast :: Cast a => JSVal -> a
unsafeCast = unsafeCoerce
{-# INLINE unsafeCast #-}

class Cast a where
  unsafeWrap  :: JSVal -> a
  instanceRef :: a -> JSVal