{-# LANGUAGE CPP #-}
{-# LANGUAGE DeriveGeneric #-}
module JavaScript.Extras.JSRep where
import Control.DeepSeq
import Control.Newtype.Generics
import Data.Coerce
import Data.JSString as JS
import Data.String
import GHC.Generics
import qualified GHCJS.Marshal.Pure as J
import qualified GHCJS.Types as J
import JavaScript.Extras.Cast as JE
newtype JSRep = JSRep J.JSVal deriving (Generic)
instance Newtype JSRep
instance Show JSRep where
show = JS.unpack . js_stringify
instance J.IsJSVal JSRep
instance J.PToJSVal JSRep where
pToJSVal = J.jsval
instance JE.ToJS JSRep
instance JE.FromJS JSRep where
fromJS v = coerce (fromJS v :: Maybe J.JSVal)
instance IsString JSRep where
fromString = JSRep . J.jsval . JS.pack
instance NFData JSRep where
rnf (JSRep v) = rnf v
toJSR :: JE.ToJS a => a -> JSRep
toJSR = JSRep . toJS
fromJSR :: JE.FromJS a => JSRep -> Maybe a
fromJSR (JSRep v) = fromJS v
#ifdef __GHCJS__
foreign import javascript unsafe
"$r = hje$stringify($1);"
js_stringify :: JSRep -> J.JSString
#else
js_stringify :: JSRep -> J.JSString
js_stringify _ = JS.empty
#endif