{-# LANGUAGE CPP #-}
-----------------------------------------------------------------------------
--
-- Module      :  Language.Javascript.JSaddle.Value
-- Copyright   :  (c) Hamish Mackenzie
-- License     :  MIT
--
-- Maintainer  :  Hamish Mackenzie <Hamish.K.Mackenzie@googlemail.com>
--
-- |
--
-----------------------------------------------------------------------------
module GHCJS.Foreign (
    jsTrue
  , jsFalse
  , jsNull
  , toJSBool
--  , fromJSBool
  , jsUndefined
  , isTruthy
  , isNull
  , isUndefined
  , isObject
  , isFunction
  , isString
  , isBoolean
  , isSymbol
  , isNumber
  , JSType(..)
  , jsTypeOf
) where

import GHCJS.Foreign.Internal
import Language.Javascript.JSaddle.Types (JSVal(..), GHCJSPure(..))
import Language.Javascript.JSaddle.Object (jsg1)
import GHCJS.Marshal (FromJSVal(..))

isObject :: JSVal -> GHCJSPure Bool
isObject :: JSVal -> GHCJSPure Bool
isObject JSVal
v = JSM Bool -> GHCJSPure Bool
forall a. JSM a -> GHCJSPure a
GHCJSPure (JSM Bool -> GHCJSPure Bool) -> JSM Bool -> GHCJSPure Bool
forall a b. (a -> b) -> a -> b
$ String -> JSVal -> JSM JSVal
forall name a0.
(ToJSString name, ToJSVal a0) =>
name -> a0 -> JSM JSVal
jsg1 String
"h$isObject" JSVal
v JSM JSVal -> (JSVal -> JSM Bool) -> JSM Bool
forall a b. JSM a -> (a -> JSM b) -> JSM b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= JSVal -> JSM Bool
forall a. FromJSVal a => JSVal -> JSM a
fromJSValUnchecked
{-# INLINE isObject #-}

isFunction :: JSVal -> GHCJSPure Bool
isFunction :: JSVal -> GHCJSPure Bool
isFunction JSVal
v = JSM Bool -> GHCJSPure Bool
forall a. JSM a -> GHCJSPure a
GHCJSPure (JSM Bool -> GHCJSPure Bool) -> JSM Bool -> GHCJSPure Bool
forall a b. (a -> b) -> a -> b
$ String -> JSVal -> JSM JSVal
forall name a0.
(ToJSString name, ToJSVal a0) =>
name -> a0 -> JSM JSVal
jsg1 String
"h$isFunction" JSVal
v JSM JSVal -> (JSVal -> JSM Bool) -> JSM Bool
forall a b. JSM a -> (a -> JSM b) -> JSM b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= JSVal -> JSM Bool
forall a. FromJSVal a => JSVal -> JSM a
fromJSValUnchecked
{-# INLINE isFunction #-}

isString :: JSVal -> GHCJSPure Bool
isString :: JSVal -> GHCJSPure Bool
isString JSVal
v = JSM Bool -> GHCJSPure Bool
forall a. JSM a -> GHCJSPure a
GHCJSPure (JSM Bool -> GHCJSPure Bool) -> JSM Bool -> GHCJSPure Bool
forall a b. (a -> b) -> a -> b
$ String -> JSVal -> JSM JSVal
forall name a0.
(ToJSString name, ToJSVal a0) =>
name -> a0 -> JSM JSVal
jsg1 String
"h$isString" JSVal
v JSM JSVal -> (JSVal -> JSM Bool) -> JSM Bool
forall a b. JSM a -> (a -> JSM b) -> JSM b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= JSVal -> JSM Bool
forall a. FromJSVal a => JSVal -> JSM a
fromJSValUnchecked
{-# INLINE isString #-}

isBoolean :: JSVal -> GHCJSPure Bool
isBoolean :: JSVal -> GHCJSPure Bool
isBoolean JSVal
v = JSM Bool -> GHCJSPure Bool
forall a. JSM a -> GHCJSPure a
GHCJSPure (JSM Bool -> GHCJSPure Bool) -> JSM Bool -> GHCJSPure Bool
forall a b. (a -> b) -> a -> b
$ String -> JSVal -> JSM JSVal
forall name a0.
(ToJSString name, ToJSVal a0) =>
name -> a0 -> JSM JSVal
jsg1 String
"h$isBoolean" JSVal
v JSM JSVal -> (JSVal -> JSM Bool) -> JSM Bool
forall a b. JSM a -> (a -> JSM b) -> JSM b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= JSVal -> JSM Bool
forall a. FromJSVal a => JSVal -> JSM a
fromJSValUnchecked
{-# INLINE isBoolean #-}

isSymbol :: JSVal -> GHCJSPure Bool
isSymbol :: JSVal -> GHCJSPure Bool
isSymbol JSVal
v = JSM Bool -> GHCJSPure Bool
forall a. JSM a -> GHCJSPure a
GHCJSPure (JSM Bool -> GHCJSPure Bool) -> JSM Bool -> GHCJSPure Bool
forall a b. (a -> b) -> a -> b
$ String -> JSVal -> JSM JSVal
forall name a0.
(ToJSString name, ToJSVal a0) =>
name -> a0 -> JSM JSVal
jsg1 String
"h$isSymbol" JSVal
v JSM JSVal -> (JSVal -> JSM Bool) -> JSM Bool
forall a b. JSM a -> (a -> JSM b) -> JSM b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= JSVal -> JSM Bool
forall a. FromJSVal a => JSVal -> JSM a
fromJSValUnchecked
{-# INLINE isSymbol #-}

isNumber :: JSVal -> GHCJSPure Bool
isNumber :: JSVal -> GHCJSPure Bool
isNumber JSVal
v = JSM Bool -> GHCJSPure Bool
forall a. JSM a -> GHCJSPure a
GHCJSPure (JSM Bool -> GHCJSPure Bool) -> JSM Bool -> GHCJSPure Bool
forall a b. (a -> b) -> a -> b
$ String -> JSVal -> JSM JSVal
forall name a0.
(ToJSString name, ToJSVal a0) =>
name -> a0 -> JSM JSVal
jsg1 String
"h$isNumber" JSVal
v JSM JSVal -> (JSVal -> JSM Bool) -> JSM Bool
forall a b. JSM a -> (a -> JSM b) -> JSM b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= JSVal -> JSM Bool
forall a. FromJSVal a => JSVal -> JSM a
fromJSValUnchecked
{-# INLINE isNumber #-}

jsTypeOf :: JSVal -> GHCJSPure JSType
jsTypeOf :: JSVal -> GHCJSPure JSType
jsTypeOf JSVal
v = JSM JSType -> GHCJSPure JSType
forall a. JSM a -> GHCJSPure a
GHCJSPure (JSM JSType -> GHCJSPure JSType) -> JSM JSType -> GHCJSPure JSType
forall a b. (a -> b) -> a -> b
$ Int -> JSType
forall a. Enum a => Int -> a
toEnum (Int -> JSType) -> JSM Int -> JSM JSType
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (String -> JSVal -> JSM JSVal
forall name a0.
(ToJSString name, ToJSVal a0) =>
name -> a0 -> JSM JSVal
jsg1 String
"h$jsonTypeOf" JSVal
v JSM JSVal -> (JSVal -> JSM Int) -> JSM Int
forall a b. JSM a -> (a -> JSM b) -> JSM b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= JSVal -> JSM Int
forall a. FromJSVal a => JSVal -> JSM a
fromJSValUnchecked)
{-# INLINE jsTypeOf #-}