jsaddle-0.9.3.0: src/Language/Javascript/JSaddle/Null.hs
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
-----------------------------------------------------------------------------
--
-- Module : Language.Javascript.JSaddle.WebSockets
-- Copyright : (c) Hamish Mackenzie
-- License : MIT
--
-- Maintainer : Hamish Mackenzie <Hamish.K.Mackenzie@googlemail.com>
--
-- |
--
-----------------------------------------------------------------------------
module Language.Javascript.JSaddle.Null (
run
) where
import Language.Javascript.JSaddle.Types
(BatchResults(..), JSM, JSStringReceived(..), Batch(..),
Results(..), Result(..), Command(..))
import Control.Concurrent.Chan (readChan, writeChan, newChan)
import Language.Javascript.JSaddle.Run (runJavaScript)
import Control.Concurrent (forkIO)
import Control.Monad (forever)
import Data.Aeson (Value(..))
import Data.Maybe (mapMaybe)
-- | This is for performance testing JSaddle code that does not need to
-- to read anything back from the JavaScript context.
-- Anthing that does try to read will get JS null, 0 or "" back (depending
-- on how the value is read).
run :: JSM () -> IO ()
run f = do
batches <- newChan
(processResult, _processSyncResult, start) <- runJavaScript (writeChan batches) f
_ <- forkIO $ forever $
readChan batches >>= \case
Batch commands _ batchNumber ->
processResult $ BatchResults batchNumber . Success [] $ mapMaybe (\case
Left _ -> Nothing
Right command -> Just $
case command of
DeRefVal _ -> DeRefValResult 0 ""
ValueToBool _ -> ValueToBoolResult False
ValueToNumber _ -> ValueToNumberResult 0
ValueToString _ -> ValueToStringResult (JSStringReceived "")
ValueToJSON _ -> ValueToJSONResult (JSStringReceived "null")
ValueToJSONValue _ -> ValueToJSONValueResult Null
IsNull _ -> IsNullResult True
IsUndefined _ -> IsUndefinedResult False
StrictEqual _ _ -> StrictEqualResult False
InstanceOf _ _ -> InstanceOfResult False
PropertyNames _ -> PropertyNamesResult []
Sync -> SyncResult) commands
start