{-|
  Description:
    Platform-independent JSON-to-JSVal and JSVal-to-JSON functions
-}
{-# Language CPP #-}
{-# Language OverloadedStrings #-}
module JSDOM.Extras.JSON where

import Control.Lens
import Data.Aeson
import Language.Javascript.JSaddle
#ifndef ghcjs_HOST_OS
import Language.Javascript.JSaddle.Native.Internal (jsonValueToValue, valueToJSONValue)
#endif

-- | Convert a JSON 'Value' to 'JSVal'
jsValFromJSON :: Value -> JSM JSVal
#ifdef ghcjs_HOST_OS
jsValFromJSON = toJSVal
#else
jsValFromJSON :: Value -> JSM JSVal
jsValFromJSON = Value -> JSM JSVal
jsonValueToValue
#endif

-- | Try to convert a 'JSVal' to a JSON 'Value'
jsValToJSON :: JSVal -> JSM (Maybe Value)
#ifdef ghcjs_HOST_OS
jsValToJSON = fromJSVal
#else
jsValToJSON :: JSVal -> JSM (Maybe Value)
jsValToJSON = (Value -> Maybe Value) -> JSM Value -> JSM (Maybe Value)
forall a b. (a -> b) -> JSM a -> JSM b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Value -> Maybe Value
forall a. a -> Maybe a
Just (JSM Value -> JSM (Maybe Value))
-> (JSVal -> JSM Value) -> JSVal -> JSM (Maybe Value)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. JSVal -> JSM Value
valueToJSONValue
#endif

-- | <https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify JSON.stringify>
stringify :: (MonadJSM m) => JSVal -> m JSString
stringify :: forall (m :: * -> *). MonadJSM m => JSVal -> m JSString
stringify JSVal
arg = JSM JSString -> m JSString
forall (m :: * -> *) a. MonadJSM m => JSM a -> m a
liftJSM (JSM JSString -> m JSString) -> JSM JSString -> m JSString
forall a b. (a -> b) -> a -> b
$ JSVal -> JSM JSString
forall a. FromJSVal a => JSVal -> JSM a
fromJSValUnchecked (JSVal -> JSM JSString) -> JSM JSVal -> JSM JSString
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< JSString -> JSM JSVal
forall a. ToJSString a => a -> JSM JSVal
jsg (JSString
"JSON"::JSString) JSM JSVal
-> Getting (JSM JSVal) (JSM JSVal) (JSM JSVal) -> JSM JSVal
forall s a. s -> Getting a s a -> a
^. JSString -> JSVal -> JSF
forall name a0. (ToJSString name, ToJSVal a0) => name -> a0 -> JSF
js1 (JSString
"stringify"::JSString) JSVal
arg

-- | <https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse JSON.parse>
parse :: (MonadJSM m) => JSVal -> m JSVal
parse :: forall (m :: * -> *). MonadJSM m => JSVal -> m JSVal
parse JSVal
arg = JSM JSVal -> m JSVal
forall (m :: * -> *) a. MonadJSM m => JSM a -> m a
liftJSM (JSM JSVal -> m JSVal) -> JSM JSVal -> m JSVal
forall a b. (a -> b) -> a -> b
$ JSString -> JSM JSVal
forall a. ToJSString a => a -> JSM JSVal
jsg (JSString
"JSON"::JSString) JSM JSVal
-> Getting (JSM JSVal) (JSM JSVal) (JSM JSVal) -> JSM JSVal
forall s a. s -> Getting a s a -> a
^. JSString -> JSVal -> JSF
forall name a0. (ToJSString name, ToJSVal a0) => name -> a0 -> JSF
js1 (JSString
"parse"::JSString) JSVal
arg