{-# LANGUAGE CPP #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeSynonymInstances #-}
{-# LANGUAGE LambdaCase #-}
#ifdef ghcjs_HOST_OS
{-# LANGUAGE ForeignFunctionInterface, JavaScriptFFI #-}
{-# OPTIONS_GHC -Wno-dodgy-exports -Wno-dodgy-imports #-}
#endif
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Language.Javascript.JSaddle.Value (
JSVal
, ToJSVal(..)
, JSNull(..)
, JSUndefined
, JSString
, JSValue(..)
, showJSValue
, isTruthy
, valToBool
, valToNumber
, valToStr
, valToObject
, valToText
, valToJSON
, val
, jsNull
, valNull
, isNull
, valIsNull
, jsUndefined
, valUndefined
, isUndefined
, valIsUndefined
, maybeNullOrUndefined
, maybeNullOrUndefined'
, toJSBool
, jsTrue
, jsFalse
, valBool
, valMakeNumber
, valMakeString
, valMakeText
, valMakeJSON
, deRefVal
, valMakeRef
, strictEqual
, instanceOf
) where
import Data.Text (Text)
import qualified Data.Text as T (pack, unpack)
import Data.Aeson (Value)
import Data.JSString.Text (textToJSString)
#ifdef ghcjs_HOST_OS
import Language.Javascript.JSaddle.Types
(Object(..), JSString(..), JSVal(..), ghcjsPure)
import GHCJS.Marshal (ToJSVal(..))
#else
import Data.Char (chr, ord)
import Data.Word (Word, Word8, Word16, Word32)
import Data.Int (Int8, Int16, Int32)
import GHCJS.Marshal.Internal (ToJSVal(..), FromJSVal(..))
import Language.Javascript.JSaddle.Types
(Object(..), JSString(..), JSVal(..), ghcjsPure)
import Language.Javascript.JSaddle.Native
(valueToNumber, valueToString, valueToJSON, numberToValue, stringToValue, jsonValueToValue)
import qualified Language.Javascript.JSaddle.Native as N
(deRefVal, strictEqual, instanceOf)
import Language.Javascript.JSaddle.Run (Result(..))
#endif
import Language.Javascript.JSaddle.Monad (JSM)
import Language.Javascript.JSaddle.Classes
(MakeObject(..), MakeArgs(..))
import Language.Javascript.JSaddle.Marshal.String (ToJSString(..), FromJSString(..))
import Language.Javascript.JSaddle.String (strToText, textToStr)
import GHCJS.Foreign.Internal (jsTrue, jsFalse, jsNull, toJSBool, jsUndefined, isTruthy, isNull, isUndefined)
data JSNull = JSNull
type JSUndefined = ()
data JSValue = ValNull
| ValUndefined
| ValBool Bool
| ValNumber Double
| ValString Text
| ValObject Object
showJSValue :: JSValue -> String
showJSValue :: JSValue -> String
showJSValue JSValue
ValNull = String
"null"
showJSValue JSValue
ValUndefined = String
"undefined"
showJSValue (ValBool Bool
True) = String
"true"
showJSValue (ValBool Bool
False) = String
"false"
showJSValue (ValNumber Double
x) = forall a. Show a => a -> String
show Double
x
showJSValue (ValString Text
s) = forall a. Show a => a -> String
show Text
s
showJSValue (ValObject Object
_) = String
"object"
valToBool :: ToJSVal value => value -> JSM Bool
valToBool :: forall value. ToJSVal value => value -> JSM Bool
valToBool value
value = forall a. ToJSVal a => a -> JSM JSVal
toJSVal value
value forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall a. GHCJSPure a -> JSM a
ghcjsPure forall b c a. (b -> c) -> (a -> b) -> a -> c
. JSVal -> GHCJSPure Bool
isTruthy
valToNumber :: ToJSVal value => value -> JSM Double
#ifdef ghcjs_HOST_OS
valToNumber value = jsrefToNumber <$> toJSVal value
foreign import javascript unsafe "$r = Number($1);" jsrefToNumber :: JSVal -> Double
#else
valToNumber :: forall value. ToJSVal value => value -> JSM Double
valToNumber value
value = forall a. ToJSVal a => a -> JSM JSVal
toJSVal value
value forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= JSVal -> JSM Double
valueToNumber
#endif
valToStr :: ToJSVal value => value -> JSM JSString
#ifdef ghcjs_HOST_OS
valToStr value = jsrefToString <$> toJSVal value
foreign import javascript unsafe "$r = $1.toString();" jsrefToString :: JSVal -> JSString
#else
valToStr :: forall value. ToJSVal value => value -> JSM JSString
valToStr value
value = forall a. ToJSVal a => a -> JSM JSVal
toJSVal value
value forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= JSVal -> JSM JSString
valueToString
#endif
valToText :: ToJSVal value => value -> JSM Text
valToText :: forall value. ToJSVal value => value -> JSM Text
valToText value
jsvar = JSString -> Text
strToText forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall value. ToJSVal value => value -> JSM JSString
valToStr value
jsvar
valToJSON :: ToJSVal value => value -> JSM JSString
#ifdef ghcjs_HOST_OS
valToJSON value = jsrefToJSON <$> toJSVal value
foreign import javascript unsafe "$r = $1 === undefined ? \"\" : JSON.stringify($1);" jsrefToJSON :: JSVal -> JSString
#else
valToJSON :: forall value. ToJSVal value => value -> JSM JSString
valToJSON value
value = forall a. ToJSVal a => a -> JSM JSVal
toJSVal value
value forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= JSVal -> JSM JSString
valueToJSON
#endif
valToObject :: ToJSVal value => value -> JSM Object
valToObject :: forall value. ToJSVal value => value -> JSM Object
valToObject value
value = JSVal -> Object
Object forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. ToJSVal a => a -> JSM JSVal
toJSVal value
value
instance MakeObject JSVal where
makeObject :: JSVal -> JSM Object
makeObject = forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. JSVal -> Object
Object
instance ToJSVal Object where
toJSVal :: Object -> JSM JSVal
toJSVal (Object JSVal
r) = forall (m :: * -> *) a. Monad m => a -> m a
return JSVal
r
val :: ToJSVal value
=> value
-> JSM JSVal
val :: forall a. ToJSVal a => a -> JSM JSVal
val = forall a. ToJSVal a => a -> JSM JSVal
toJSVal
#ifndef ghcjs_HOST_OS
instance ToJSVal JSVal where
toJSVal :: JSVal -> JSM JSVal
toJSVal = forall (m :: * -> *) a. Monad m => a -> m a
return
{-# INLINE toJSVal #-}
#endif
instance MakeArgs JSVal where
makeArgs :: JSVal -> JSM [JSVal]
makeArgs JSVal
arg = forall (m :: * -> *) a. Monad m => a -> m a
return [JSVal
arg]
instance ToJSVal v => ToJSVal (JSM v) where
toJSVal :: JSM v -> JSM JSVal
toJSVal JSM v
v = JSM v
v forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall a. ToJSVal a => a -> JSM JSVal
toJSVal
{-# INLINE toJSVal #-}
valNull :: JSVal
valNull :: JSVal
valNull = JSVal
jsNull
{-# INLINE valNull #-}
instance ToJSVal JSNull where
toJSVal :: JSNull -> JSM JSVal
toJSVal = forall a b. a -> b -> a
const (forall (m :: * -> *) a. Monad m => a -> m a
return JSVal
jsNull)
{-# INLINE toJSVal #-}
instance MakeArgs JSNull where
makeArgs :: JSNull -> JSM [JSVal]
makeArgs JSNull
_ = forall (m :: * -> *) a. Monad m => a -> m a
return [JSVal
jsNull]
#ifndef ghcjs_HOST_OS
instance ToJSVal a => ToJSVal (Maybe a) where
toJSVal :: Maybe a -> JSM JSVal
toJSVal Maybe a
Nothing = forall (m :: * -> *) a. Monad m => a -> m a
return JSVal
jsNull
toJSVal (Just a
a) = forall a. ToJSVal a => a -> JSM JSVal
toJSVal a
a
{-# INLINE toJSVal #-}
instance FromJSVal a => FromJSVal (Maybe a) where
fromJSValUnchecked :: JSVal -> JSM (Maybe a)
fromJSValUnchecked JSVal
x =
forall a. GHCJSPure a -> JSM a
ghcjsPure (JSVal -> GHCJSPure Bool
isUndefined JSVal
x) forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
Bool
True -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing
Bool
False -> forall a. GHCJSPure a -> JSM a
ghcjsPure (JSVal -> GHCJSPure Bool
isNull JSVal
x) forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
Bool
True -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing
Bool
False -> forall a. FromJSVal a => JSVal -> JSM (Maybe a)
fromJSVal JSVal
x
{-# INLINE fromJSValUnchecked #-}
fromJSVal :: JSVal -> JSM (Maybe (Maybe a))
fromJSVal JSVal
x =
forall a. GHCJSPure a -> JSM a
ghcjsPure (JSVal -> GHCJSPure Bool
isUndefined JSVal
x) forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
Bool
True -> forall (m :: * -> *) a. Monad m => a -> m a
return (forall a. a -> Maybe a
Just forall a. Maybe a
Nothing)
Bool
False -> forall a. GHCJSPure a -> JSM a
ghcjsPure (JSVal -> GHCJSPure Bool
isNull JSVal
x) forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
Bool
True -> forall (m :: * -> *) a. Monad m => a -> m a
return (forall a. a -> Maybe a
Just forall a. Maybe a
Nothing)
Bool
False -> forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. a -> Maybe a
Just) forall a. FromJSVal a => JSVal -> JSM (Maybe a)
fromJSVal JSVal
x
{-# INLINE fromJSVal #-}
instance ToJSVal a => ToJSVal [a] where
toJSVal :: [a] -> JSM JSVal
toJSVal = forall a. ToJSVal a => [a] -> JSM JSVal
toJSValListOf
{-# INLINE toJSVal #-}
instance FromJSVal a => FromJSVal [a] where
fromJSVal :: JSVal -> JSM (Maybe [a])
fromJSVal = forall a. FromJSVal a => JSVal -> JSM (Maybe [a])
fromJSValListOf
{-# INLINE fromJSVal #-}
#endif
valIsNull :: ToJSVal value => value -> JSM Bool
valIsNull :: forall value. ToJSVal value => value -> JSM Bool
valIsNull value
value = forall a. ToJSVal a => a -> JSM JSVal
toJSVal value
value forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall a. GHCJSPure a -> JSM a
ghcjsPure forall b c a. (b -> c) -> (a -> b) -> a -> c
. JSVal -> GHCJSPure Bool
isNull
valUndefined :: JSVal
valUndefined :: JSVal
valUndefined = JSVal
jsUndefined
{-# INLINE valUndefined #-}
instance ToJSVal JSUndefined where
toJSVal :: JSUndefined -> JSM JSVal
toJSVal = forall a b. a -> b -> a
const (forall (m :: * -> *) a. Monad m => a -> m a
return JSVal
jsUndefined)
instance MakeArgs () where
makeArgs :: JSUndefined -> JSM [JSVal]
makeArgs JSUndefined
_ = forall (m :: * -> *) a. Monad m => a -> m a
return []
valIsUndefined :: ToJSVal value => value -> JSM Bool
valIsUndefined :: forall value. ToJSVal value => value -> JSM Bool
valIsUndefined value
value = forall a. ToJSVal a => a -> JSM JSVal
toJSVal value
value forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall a. GHCJSPure a -> JSM a
ghcjsPure forall b c a. (b -> c) -> (a -> b) -> a -> c
. JSVal -> GHCJSPure Bool
isUndefined
maybeNullOrUndefined :: ToJSVal value => value -> JSM (Maybe JSVal)
maybeNullOrUndefined :: forall value. ToJSVal value => value -> JSM (Maybe JSVal)
maybeNullOrUndefined value
value = do
JSVal
rval <- forall a. ToJSVal a => a -> JSM JSVal
toJSVal value
value
forall a. GHCJSPure a -> JSM a
ghcjsPure (JSVal -> GHCJSPure Bool
isNull JSVal
rval) forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
Bool
True -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing
Bool
_ ->
forall a. GHCJSPure a -> JSM a
ghcjsPure (JSVal -> GHCJSPure Bool
isUndefined JSVal
rval) forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
Bool
True -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing
Bool
_ -> forall (m :: * -> *) a. Monad m => a -> m a
return (forall a. a -> Maybe a
Just JSVal
rval)
maybeNullOrUndefined' :: ToJSVal value => (JSVal -> JSM a) -> value -> JSM (Maybe a)
maybeNullOrUndefined' :: forall value a.
ToJSVal value =>
(JSVal -> JSM a) -> value -> JSM (Maybe a)
maybeNullOrUndefined' JSVal -> JSM a
f value
value = do
JSVal
rval <- forall a. ToJSVal a => a -> JSM JSVal
toJSVal value
value
forall a. GHCJSPure a -> JSM a
ghcjsPure (JSVal -> GHCJSPure Bool
isNull JSVal
rval) forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
Bool
True -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing
Bool
_ ->
forall a. GHCJSPure a -> JSM a
ghcjsPure (JSVal -> GHCJSPure Bool
isUndefined JSVal
rval) forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
Bool
True -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing
Bool
_ -> forall a. a -> Maybe a
Just forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> JSVal -> JSM a
f JSVal
rval
valBool :: Bool -> JSVal
valBool :: Bool -> JSVal
valBool = Bool -> JSVal
toJSBool
{-# INLINE valBool #-}
#ifndef ghcjs_HOST_OS
instance ToJSVal Bool where
toJSVal :: Bool -> JSM JSVal
toJSVal = forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bool -> JSVal
valBool
{-# INLINE toJSVal #-}
#endif
instance MakeArgs Bool where
makeArgs :: Bool -> JSM [JSVal]
makeArgs Bool
b = forall (m :: * -> *) a. Monad m => a -> m a
return [Bool -> JSVal
valBool Bool
b]
valMakeNumber :: Double -> JSM JSVal
valMakeNumber :: Double -> JSM JSVal
valMakeNumber = forall a. ToJSVal a => a -> JSM JSVal
toJSVal
{-# INLINE valMakeNumber #-}
#ifndef ghcjs_HOST_OS
instance ToJSVal Double where
toJSVal :: Double -> JSM JSVal
toJSVal = Double -> JSM JSVal
numberToValue
{-# INLINE toJSVal #-}
instance ToJSVal Float where
toJSVal :: Float -> JSM JSVal
toJSVal = Double -> JSM JSVal
numberToValue forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (Real a, Fractional b) => a -> b
realToFrac
{-# INLINE toJSVal #-}
instance ToJSVal Word where
toJSVal :: Word -> JSM JSVal
toJSVal = Double -> JSM JSVal
numberToValue forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (Integral a, Num b) => a -> b
fromIntegral
{-# INLINE toJSVal #-}
instance ToJSVal Word8 where
toJSVal :: Word8 -> JSM JSVal
toJSVal = Double -> JSM JSVal
numberToValue forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (Integral a, Num b) => a -> b
fromIntegral
{-# INLINE toJSVal #-}
instance ToJSVal Word16 where
toJSVal :: Word16 -> JSM JSVal
toJSVal = Double -> JSM JSVal
numberToValue forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (Integral a, Num b) => a -> b
fromIntegral
{-# INLINE toJSVal #-}
instance ToJSVal Word32 where
toJSVal :: Word32 -> JSM JSVal
toJSVal = Double -> JSM JSVal
numberToValue forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (Integral a, Num b) => a -> b
fromIntegral
{-# INLINE toJSVal #-}
instance ToJSVal Int where
toJSVal :: Int -> JSM JSVal
toJSVal = Double -> JSM JSVal
numberToValue forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (Integral a, Num b) => a -> b
fromIntegral
{-# INLINE toJSVal #-}
instance ToJSVal Int8 where
toJSVal :: Int8 -> JSM JSVal
toJSVal = Double -> JSM JSVal
numberToValue forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (Integral a, Num b) => a -> b
fromIntegral
{-# INLINE toJSVal #-}
instance ToJSVal Int16 where
toJSVal :: Int16 -> JSM JSVal
toJSVal = Double -> JSM JSVal
numberToValue forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (Integral a, Num b) => a -> b
fromIntegral
{-# INLINE toJSVal #-}
instance ToJSVal Int32 where
toJSVal :: Int32 -> JSM JSVal
toJSVal = Double -> JSM JSVal
numberToValue forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (Integral a, Num b) => a -> b
fromIntegral
{-# INLINE toJSVal #-}
#endif
instance MakeArgs Double where
makeArgs :: Double -> JSM [JSVal]
makeArgs Double
n = Double -> JSM JSVal
valMakeNumber Double
n forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (\JSVal
ref -> forall (m :: * -> *) a. Monad m => a -> m a
return [JSVal
ref])
valMakeText :: Text -> JSM JSVal
valMakeText :: Text -> JSM JSVal
valMakeText = forall a. ToJSVal a => a -> JSM JSVal
toJSVal forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> JSString
textToJSString
{-# INLINE valMakeText #-}
valMakeString :: JSString -> JSM JSVal
valMakeString :: JSString -> JSM JSVal
valMakeString = forall a. ToJSVal a => a -> JSM JSVal
toJSVal
{-# INLINE valMakeString #-}
#ifndef ghcjs_HOST_OS
instance ToJSVal Text where
toJSVal :: Text -> JSM JSVal
toJSVal = JSString -> JSM JSVal
stringToValue forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> JSString
JSString
{-# INLINE toJSVal #-}
instance FromJSVal Text where
fromJSValUnchecked :: JSVal -> JSM Text
fromJSValUnchecked = forall value. ToJSVal value => value -> JSM Text
valToText
{-# INLINE fromJSValUnchecked #-}
fromJSVal :: JSVal -> JSM (Maybe Text)
fromJSVal = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. a -> Maybe a
Just forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall value. ToJSVal value => value -> JSM Text
valToText
{-# INLINE fromJSVal #-}
#endif
instance MakeArgs Text where
makeArgs :: Text -> JSM [JSVal]
makeArgs Text
t = Text -> JSM JSVal
valMakeText Text
t forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (\JSVal
ref -> forall (m :: * -> *) a. Monad m => a -> m a
return [JSVal
ref])
#ifndef ghcjs_HOST_OS
instance ToJSVal JSString where
toJSVal :: JSString -> JSM JSVal
toJSVal = JSString -> JSM JSVal
stringToValue
{-# INLINE toJSVal #-}
instance FromJSVal JSString where
fromJSValUnchecked :: JSVal -> JSM JSString
fromJSValUnchecked = forall value. ToJSVal value => value -> JSM JSString
valToStr
{-# INLINE fromJSValUnchecked #-}
fromJSVal :: JSVal -> JSM (Maybe JSString)
fromJSVal = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. a -> Maybe a
Just forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall value. ToJSVal value => value -> JSM JSString
valToStr
{-# INLINE fromJSVal #-}
#endif
instance ToJSString JSString where
toJSString :: JSString -> JSString
toJSString = forall a. a -> a
id
instance ToJSString Text where
toJSString :: Text -> JSString
toJSString = Text -> JSString
textToStr
instance ToJSString String where
toJSString :: String -> JSString
toJSString = Text -> JSString
textToStr forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
T.pack
instance FromJSString Text where
fromJSString :: JSString -> Text
fromJSString = JSString -> Text
strToText
instance FromJSString String where
fromJSString :: JSString -> String
fromJSString JSString
v = Text -> String
T.unpack forall a b. (a -> b) -> a -> b
$ JSString -> Text
strToText JSString
v
instance FromJSString JSString where
fromJSString :: JSString -> JSString
fromJSString = forall a. a -> a
id
#ifndef ghcjs_HOST_OS
instance ToJSVal Char where
toJSVal :: Char -> JSM JSVal
toJSVal = Double -> JSM JSVal
valMakeNumber forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (Integral a, Num b) => a -> b
fromIntegral forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> Int
ord
{-# INLINE toJSVal #-}
toJSValListOf :: String -> JSM JSVal
toJSValListOf = Text -> JSM JSVal
valMakeText forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
T.pack
{-# INLINE toJSValListOf #-}
instance FromJSVal Char where
fromJSValUnchecked :: JSVal -> JSM Char
fromJSValUnchecked = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Int -> Char
chr forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (RealFrac a, Integral b) => a -> b
round) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall value. ToJSVal value => value -> JSM Double
valToNumber
{-# INLINE fromJSValUnchecked #-}
fromJSVal :: JSVal -> JSM (Maybe Char)
fromJSVal = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a. a -> Maybe a
Just forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Char
chr forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (RealFrac a, Integral b) => a -> b
round) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall value. ToJSVal value => value -> JSM Double
valToNumber
{-# INLINE fromJSVal #-}
fromJSValUncheckedListOf :: JSVal -> JSM String
fromJSValUncheckedListOf = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Text -> String
T.unpack forall b c a. (b -> c) -> (a -> b) -> a -> c
. JSString -> Text
strToText) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall value. ToJSVal value => value -> JSM JSString
valToStr
{-# INLINE fromJSValListOf #-}
fromJSValListOf :: JSVal -> JSM (Maybe String)
fromJSValListOf = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a. a -> Maybe a
Just forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
T.unpack forall b c a. (b -> c) -> (a -> b) -> a -> c
. JSString -> Text
strToText) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall value. ToJSVal value => value -> JSM JSString
valToStr
{-# INLINE fromJSValUncheckedListOf #-}
#endif
valMakeJSON :: Value -> JSM JSVal
valMakeJSON :: Value -> JSM JSVal
valMakeJSON = forall a. ToJSVal a => a -> JSM JSVal
toJSVal
#ifndef ghcjs_HOST_OS
instance ToJSVal Value where
toJSVal :: Value -> JSM JSVal
toJSVal = Value -> JSM JSVal
jsonValueToValue
{-# INLINE toJSVal #-}
#endif
instance MakeArgs Value where
makeArgs :: Value -> JSM [JSVal]
makeArgs Value
t = Value -> JSM JSVal
valMakeJSON Value
t forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (\JSVal
ref -> forall (m :: * -> *) a. Monad m => a -> m a
return [JSVal
ref])
deRefVal :: ToJSVal value => value -> JSM JSValue
#ifdef ghcjs_HOST_OS
deRefVal value = do
valref <- toJSVal value
case (jsrefGetType valref :: Int) of
0 -> return ValUndefined
1 -> return ValNull
2 -> ValBool <$> valToBool valref
3 -> ValNumber <$> valToNumber valref
4 -> ValString <$> valToText valref
5 -> ValObject <$> valToObject valref
_ -> error "Unexpected result dereferencing JSaddle value"
foreign import javascript unsafe "$r = ($1 === undefined)?0:\
($1===null)?1:\
(typeof $1===\"boolean\")?2:\
(typeof $1===\"number\")?3:\
(typeof $1===\"string\")?4:\
(typeof $1===\"object\")?5:-1;" jsrefGetType :: JSVal -> Int
#else
deRefVal :: forall value. ToJSVal value => value -> JSM JSValue
deRefVal value
value = do
JSVal
v <- forall a. ToJSVal a => a -> JSM JSVal
toJSVal value
value
Result
result <- JSVal -> JSM Result
N.deRefVal JSVal
v
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Result
result of
DeRefValResult JSValueRef
0 Text
_ -> JSValue
ValNull
DeRefValResult JSValueRef
1 Text
_ -> JSValue
ValUndefined
DeRefValResult JSValueRef
2 Text
_ -> Bool -> JSValue
ValBool Bool
False
DeRefValResult JSValueRef
3 Text
_ -> Bool -> JSValue
ValBool Bool
True
DeRefValResult (-1) Text
s -> Double -> JSValue
ValNumber (forall a. Read a => String -> a
read (Text -> String
T.unpack Text
s))
DeRefValResult (-2) Text
s -> Text -> JSValue
ValString Text
s
DeRefValResult (-3) Text
_ -> Object -> JSValue
ValObject (JSVal -> Object
Object JSVal
v)
Result
_ -> forall a. HasCallStack => String -> a
error String
"Unexpected result dereferencing JSaddle value"
#endif
valMakeRef :: JSValue -> JSM JSVal
valMakeRef :: JSValue -> JSM JSVal
valMakeRef JSValue
value =
case JSValue
value of
JSValue
ValNull -> forall (m :: * -> *) a. Monad m => a -> m a
return JSVal
valNull
JSValue
ValUndefined -> forall (m :: * -> *) a. Monad m => a -> m a
return JSVal
valUndefined
ValBool Bool
b -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ Bool -> JSVal
valBool Bool
b
ValNumber Double
n -> Double -> JSM JSVal
valMakeNumber Double
n
ValString Text
s -> Text -> JSM JSVal
valMakeText Text
s
ValObject (Object JSVal
o) -> forall (m :: * -> *) a. Monad m => a -> m a
return JSVal
o
instance ToJSVal JSValue where
toJSVal :: JSValue -> JSM JSVal
toJSVal = JSValue -> JSM JSVal
valMakeRef
{-# INLINE toJSVal #-}
instance MakeArgs JSValue where
makeArgs :: JSValue -> JSM [JSVal]
makeArgs JSValue
v = JSValue -> JSM JSVal
valMakeRef JSValue
v forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (\JSVal
ref -> forall (m :: * -> *) a. Monad m => a -> m a
return [JSVal
ref])
#ifdef ghcjs_HOST_OS
foreign import javascript unsafe
"$1===$2" jsvalueisstrictequal :: JSVal -> JSVal -> Bool
#endif
strictEqual :: (ToJSVal a, ToJSVal b) => a -> b -> JSM Bool
strictEqual :: forall a b. (ToJSVal a, ToJSVal b) => a -> b -> JSM Bool
strictEqual a
a b
b = do
JSVal
aval <- forall a. ToJSVal a => a -> JSM JSVal
toJSVal a
a
JSVal
bval <- forall a. ToJSVal a => a -> JSM JSVal
toJSVal b
b
#ifdef ghcjs_HOST_OS
return $ jsvalueisstrictequal aval bval
#else
JSVal -> JSVal -> JSM Bool
N.strictEqual JSVal
aval JSVal
bval
#endif
#ifdef ghcjs_HOST_OS
foreign import javascript unsafe "$1 instanceof $2"
js_isInstanceOf :: JSVal -> Object -> Bool
#endif
instanceOf :: (ToJSVal value, MakeObject constructor) => value -> constructor -> JSM Bool
instanceOf :: forall value constructor.
(ToJSVal value, MakeObject constructor) =>
value -> constructor -> JSM Bool
instanceOf value
value constructor
constructor = do
JSVal
v <- forall a. ToJSVal a => a -> JSM JSVal
toJSVal value
value
Object
c <- forall this. MakeObject this => this -> JSM Object
makeObject constructor
constructor
#ifdef ghcjs_HOST_OS
return $ js_isInstanceOf v c
#else
JSVal -> Object -> JSM Bool
N.instanceOf JSVal
v Object
c
#endif