-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Interface for JavaScript that works with GHCJS and GHC -- -- This package provides an EDSL for calling JavaScript that can be used -- both from GHCJS and GHC. When using GHC the application is run using -- Warp and WebSockets to drive a small JavaScipt helper. @package jsaddle @version 0.5.2.0 module Language.Javascript.JSaddle.WebSockets.Files mkEmbedded :: IO [EmbeddableEntry] module Paths_jsaddle version :: Version getBinDir :: IO FilePath getLibDir :: IO FilePath getDataDir :: IO FilePath getLibexecDir :: IO FilePath getDataFileName :: FilePath -> IO FilePath getSysconfDir :: IO FilePath module Language.Javascript.JSaddle.Types -- | Identifies a JavaScript execution context. When using GHCJS this is -- just '()' since their is only one context. When using GHC it includes -- the functions JSaddle needs to communicate with the JavaScript -- context. data JSContextRef JSContextRef :: UTCTime -> (Command -> IO Result) -> (AsyncCommand -> IO ()) -> (Object -> JSCallAsFunction -> IO ()) -> (Object -> IO ()) -> TVar JSValueRef -> JSContextRef [startTime] :: JSContextRef -> UTCTime [doSendCommand] :: JSContextRef -> Command -> IO Result [doSendAsyncCommand] :: JSContextRef -> AsyncCommand -> IO () [addCallback] :: JSContextRef -> Object -> JSCallAsFunction -> IO () [freeCallback] :: JSContextRef -> Object -> IO () [nextRef] :: JSContextRef -> TVar JSValueRef -- | The JSM monad keeps track of the JavaScript execution context. -- -- When using GHCJS it is IO. -- -- Given a JSM function and a JSContextRef you can run the -- function like this... -- --
-- runJSM jsmFunction javaScriptContext --newtype JSM a JSM :: ReaderT JSContextRef IO a -> JSM a [unJSM] :: JSM a -> ReaderT JSContextRef IO a -- | The MonadJSM is to JSM what MonadIO is to -- IO. When using GHCJS it is MonadIO. class (Applicative m, MonadIO m) => MonadJSM m liftJSM' :: MonadJSM m => JSM a -> m a -- | The liftJSM is to JSM what liftIO is to -- IO. When using GHCJS it is liftIO. liftJSM :: MonadJSM m => JSM a -> m a -- | See JSVal newtype JSVal JSVal :: JSValueRef -> JSVal -- | See MutableJSArray newtype MutableJSArray MutableJSArray :: JSValueRef -> MutableJSArray -- | See Object newtype Object Object :: JSVal -> Object -- | See Type newtype JSString JSString :: Text -> JSString -- | See Nullable newtype Nullable a Nullable :: a -> Nullable a -- | Type used for Haskell functions called from JavaScript. type JSCallAsFunction = JSVal Function object -> JSVal this -> [JSVal] Function arguments -> JSM () Only () (aka 'JSUndefined') can be returned because the function may need to be executed in a different thread. If you need to get a value out pass in a continuation function as an argument and invoke it from haskell. -- | Wrapper used when receiving a JSVal from the JavaScript context newtype JSValueReceived JSValueReceived :: JSValueRef -> JSValueReceived -- | Wrapper used when sending a JSVal to the JavaScript context newtype JSValueForSend JSValueForSend :: JSValueRef -> JSValueForSend -- | Wrapper used when receiving a JSString from the JavaScript -- context newtype JSStringReceived JSStringReceived :: Text -> JSStringReceived -- | Wrapper used when sending a JString to the JavaScript context newtype JSStringForSend JSStringForSend :: Text -> JSStringForSend -- | Wrapper used when sending a Object to the JavaScript context newtype JSObjectForSend JSObjectForSend :: JSValueForSend -> JSObjectForSend -- | Command sent to a JavaScript context for execution asynchronously data AsyncCommand FreeRef :: JSValueForSend -> AsyncCommand SetPropertyByName :: JSObjectForSend -> JSStringForSend -> JSValueForSend -> AsyncCommand SetPropertyAtIndex :: JSObjectForSend -> Int -> JSValueForSend -> AsyncCommand StringToValue :: JSStringForSend -> JSValueForSend -> AsyncCommand NumberToValue :: Double -> JSValueForSend -> AsyncCommand GetPropertyByName :: JSObjectForSend -> JSStringForSend -> JSValueForSend -> AsyncCommand GetPropertyAtIndex :: JSObjectForSend -> Int -> JSValueForSend -> AsyncCommand CallAsFunction :: JSObjectForSend -> JSObjectForSend -> [JSValueForSend] -> JSValueForSend -> AsyncCommand CallAsConstructor :: JSObjectForSend -> [JSValueForSend] -> JSValueForSend -> AsyncCommand NewEmptyObject :: JSValueForSend -> AsyncCommand NewCallback :: JSValueForSend -> AsyncCommand NewArray :: [JSValueForSend] -> JSValueForSend -> AsyncCommand EvaluateScript :: JSStringForSend -> JSValueForSend -> AsyncCommand SyncWithAnimationFrame :: JSValueForSend -> AsyncCommand -- | Command sent to a JavaScript context for execution synchronously data Command DeRefVal :: JSValueForSend -> Command ValueToBool :: JSValueForSend -> Command ValueToNumber :: JSValueForSend -> Command ValueToString :: JSValueForSend -> Command ValueToJSON :: JSValueForSend -> Command IsNull :: JSValueForSend -> Command IsUndefined :: JSValueForSend -> Command StrictEqual :: JSValueForSend -> JSValueForSend -> Command InstanceOf :: JSValueForSend -> JSObjectForSend -> Command PropertyNames :: JSObjectForSend -> Command Sync :: Command -- | Batch of commands that can be sent together to the JavaScript context data Batch Batch :: [AsyncCommand] -> Command -> Bool -> Batch -- | Result of a Command returned from the JavaScript context data Result DeRefValResult :: JSValueRef -> Text -> Result ValueToBoolResult :: Bool -> Result ValueToNumberResult :: Double -> Result ValueToStringResult :: JSStringReceived -> Result ValueToJSONResult :: JSStringReceived -> Result IsNullResult :: Bool -> Result IsUndefinedResult :: Bool -> Result StrictEqualResult :: Bool -> Result InstanceOfResult :: Bool -> Result Callback :: JSValueReceived -> JSValueReceived -> [JSValueReceived] -> Result PropertyNamesResult :: [JSStringReceived] -> Result ThrowJSValue :: JSValueReceived -> Result ProtocolError :: Text -> Result SyncResult :: Result instance Control.Monad.Fix.MonadFix Language.Javascript.JSaddle.Types.JSM instance Control.Monad.IO.Class.MonadIO Language.Javascript.JSaddle.Types.JSM instance GHC.Base.Monad Language.Javascript.JSaddle.Types.JSM instance GHC.Base.Applicative Language.Javascript.JSaddle.Types.JSM instance GHC.Base.Functor Language.Javascript.JSaddle.Types.JSM instance GHC.Generics.Generic Language.Javascript.JSaddle.Types.Result instance GHC.Show.Show Language.Javascript.JSaddle.Types.Result instance GHC.Generics.Generic Language.Javascript.JSaddle.Types.Batch instance GHC.Show.Show Language.Javascript.JSaddle.Types.Batch instance GHC.Generics.Generic Language.Javascript.JSaddle.Types.Command instance GHC.Show.Show Language.Javascript.JSaddle.Types.Command instance GHC.Generics.Generic Language.Javascript.JSaddle.Types.AsyncCommand instance GHC.Show.Show Language.Javascript.JSaddle.Types.AsyncCommand instance Data.Aeson.Types.FromJSON.FromJSON Language.Javascript.JSaddle.Types.JSStringForSend instance Data.Aeson.Types.ToJSON.ToJSON Language.Javascript.JSaddle.Types.JSStringForSend instance GHC.Show.Show Language.Javascript.JSaddle.Types.JSStringForSend instance Data.Aeson.Types.FromJSON.FromJSON Language.Javascript.JSaddle.Types.JSStringReceived instance Data.Aeson.Types.ToJSON.ToJSON Language.Javascript.JSaddle.Types.JSStringReceived instance GHC.Show.Show Language.Javascript.JSaddle.Types.JSStringReceived instance Data.Aeson.Types.FromJSON.FromJSON Language.Javascript.JSaddle.Types.JSObjectForSend instance Data.Aeson.Types.ToJSON.ToJSON Language.Javascript.JSaddle.Types.JSObjectForSend instance GHC.Show.Show Language.Javascript.JSaddle.Types.JSObjectForSend instance Data.Aeson.Types.FromJSON.FromJSON Language.Javascript.JSaddle.Types.JSValueForSend instance Data.Aeson.Types.ToJSON.ToJSON Language.Javascript.JSaddle.Types.JSValueForSend instance GHC.Show.Show Language.Javascript.JSaddle.Types.JSValueForSend instance Data.Aeson.Types.FromJSON.FromJSON Language.Javascript.JSaddle.Types.JSValueReceived instance Data.Aeson.Types.ToJSON.ToJSON Language.Javascript.JSaddle.Types.JSValueReceived instance GHC.Show.Show Language.Javascript.JSaddle.Types.JSValueReceived instance Data.Aeson.Types.FromJSON.FromJSON Language.Javascript.JSaddle.Types.JSString instance Data.Aeson.Types.ToJSON.ToJSON Language.Javascript.JSaddle.Types.JSString instance GHC.Show.Show Language.Javascript.JSaddle.Types.JSString instance Data.Aeson.Types.FromJSON.FromJSON Language.Javascript.JSaddle.Types.Object instance Data.Aeson.Types.ToJSON.ToJSON Language.Javascript.JSaddle.Types.Object instance GHC.Show.Show Language.Javascript.JSaddle.Types.Object instance Data.Aeson.Types.FromJSON.FromJSON Language.Javascript.JSaddle.Types.MutableJSArray instance Data.Aeson.Types.ToJSON.ToJSON Language.Javascript.JSaddle.Types.MutableJSArray instance GHC.Show.Show Language.Javascript.JSaddle.Types.MutableJSArray instance Data.Aeson.Types.FromJSON.FromJSON Language.Javascript.JSaddle.Types.JSVal instance Data.Aeson.Types.ToJSON.ToJSON Language.Javascript.JSaddle.Types.JSVal instance GHC.Show.Show Language.Javascript.JSaddle.Types.JSVal instance Language.Javascript.JSaddle.Types.MonadJSM Language.Javascript.JSaddle.Types.JSM instance Language.Javascript.JSaddle.Types.MonadJSM m => Language.Javascript.JSaddle.Types.MonadJSM (Control.Monad.Trans.Reader.ReaderT e m) instance Language.Javascript.JSaddle.Types.MonadJSM m => Language.Javascript.JSaddle.Types.MonadJSM (Control.Monad.Trans.State.Lazy.StateT r m) instance Language.Javascript.JSaddle.Types.MonadJSM m => Language.Javascript.JSaddle.Types.MonadJSM (Control.Monad.Trans.State.Strict.StateT r m) instance Control.Monad.Ref.MonadRef Language.Javascript.JSaddle.Types.JSM instance Control.Monad.Ref.MonadAtomicRef Language.Javascript.JSaddle.Types.JSM instance Data.Aeson.Types.ToJSON.ToJSON Language.Javascript.JSaddle.Types.AsyncCommand instance Data.Aeson.Types.FromJSON.FromJSON Language.Javascript.JSaddle.Types.AsyncCommand instance Data.Aeson.Types.ToJSON.ToJSON Language.Javascript.JSaddle.Types.Command instance Data.Aeson.Types.FromJSON.FromJSON Language.Javascript.JSaddle.Types.Command instance Data.Aeson.Types.ToJSON.ToJSON Language.Javascript.JSaddle.Types.Batch instance Data.Aeson.Types.FromJSON.FromJSON Language.Javascript.JSaddle.Types.Batch instance Data.Aeson.Types.ToJSON.ToJSON Language.Javascript.JSaddle.Types.Result instance Data.Aeson.Types.FromJSON.FromJSON Language.Javascript.JSaddle.Types.Result -- | These classes are used to make various JavaScript types out of -- whatever we have. Functions in jsaddle take these as inputs. This -- alows implicit casting and eager evaluation. module Language.Javascript.JSaddle.Classes -- | Anything that can be used to make a JavaScript value reference class ToJSVal a toJSVal :: ToJSVal a => a -> JSM JSVal -- | Anything that can be used to make a JavaScript string reference class ToJSVal a => ToJSString a toJSString :: ToJSString a => a -> JSString -- | Anything that can be used to make a JavaScript object reference class MakeObject this makeObject :: MakeObject this => this -> JSM Object instance Language.Javascript.JSaddle.Classes.ToJSVal Language.Javascript.JSaddle.Types.Object instance Language.Javascript.JSaddle.Classes.MakeObject Language.Javascript.JSaddle.Types.Object module Language.Javascript.JSaddle.Exception newtype JSException JSException :: JSVal -> JSException instance GHC.Show.Show Language.Javascript.JSaddle.Exception.JSException instance GHC.Exception.Exception Language.Javascript.JSaddle.Exception.JSException -- | JavaScript string conversion functions module Language.Javascript.JSaddle.String -- | See Type data JSString -- | Anything that can be used to make a JavaScript string reference class ToJSVal a => ToJSString a toJSString :: ToJSString a => a -> JSString -- | Convert a JavaScript string to a Haskell Text strToText :: JSString -> Text -- | Convert a Haskell Text to a JavaScript string textToStr :: Text -> JSString module Language.Javascript.JSaddle.Native wrapJSVal :: JSValueReceived -> JSM JSVal wrapJSString :: MonadIO m => JSStringReceived -> m JSString withJSVal :: MonadIO m => JSVal -> (JSValueForSend -> m a) -> m a withJSVals :: MonadIO m => [JSVal] -> ([JSValueForSend] -> m a) -> m a withObject :: MonadIO m => Object -> (JSObjectForSend -> m a) -> m a withJSString :: MonadIO m => JSString -> (JSStringForSend -> m a) -> m a withToJSVal :: ToJSVal val => val -> (JSValueForSend -> JSM a) -> JSM a module Language.Javascript.JSaddle.WebSockets -- | Run the given JSM action as the main entry point. Either -- directly in GHCJS or as a Warp server on the given port on GHC. run :: Int -> JSM () -> IO () -- | Forces execution of pending asyncronous code syncPoint :: JSM () -- | Forces execution of pending asyncronous code after performing -- f syncAfter :: JSM a -> JSM a -- | On GHCJS this is waitForAnimationFrame. On GHC it will delay -- the execution of the current batch of asynchronous command when they -- are sent to JavaScript. It will not delay the Haskell code execution. -- The time returned will be based on the Haskell clock (not the -- JavaScript clock). waitForAnimationFrame :: JSM Double -- | Tries to executes the given code in the next animation frame callback. -- Avoid synchronous opperations where possible. nextAnimationFrame :: (Double -> JSM a) -> JSM a jsaddleOr :: ConnectionOptions -> JSM () -> Application -> Application -- | Command sent to a JavaScript context for execution asynchronously data AsyncCommand FreeRef :: JSValueForSend -> AsyncCommand SetPropertyByName :: JSObjectForSend -> JSStringForSend -> JSValueForSend -> AsyncCommand SetPropertyAtIndex :: JSObjectForSend -> Int -> JSValueForSend -> AsyncCommand StringToValue :: JSStringForSend -> JSValueForSend -> AsyncCommand NumberToValue :: Double -> JSValueForSend -> AsyncCommand GetPropertyByName :: JSObjectForSend -> JSStringForSend -> JSValueForSend -> AsyncCommand GetPropertyAtIndex :: JSObjectForSend -> Int -> JSValueForSend -> AsyncCommand CallAsFunction :: JSObjectForSend -> JSObjectForSend -> [JSValueForSend] -> JSValueForSend -> AsyncCommand CallAsConstructor :: JSObjectForSend -> [JSValueForSend] -> JSValueForSend -> AsyncCommand NewEmptyObject :: JSValueForSend -> AsyncCommand NewCallback :: JSValueForSend -> AsyncCommand NewArray :: [JSValueForSend] -> JSValueForSend -> AsyncCommand EvaluateScript :: JSStringForSend -> JSValueForSend -> AsyncCommand SyncWithAnimationFrame :: JSValueForSend -> AsyncCommand -- | Command sent to a JavaScript context for execution synchronously data Command DeRefVal :: JSValueForSend -> Command ValueToBool :: JSValueForSend -> Command ValueToNumber :: JSValueForSend -> Command ValueToString :: JSValueForSend -> Command ValueToJSON :: JSValueForSend -> Command IsNull :: JSValueForSend -> Command IsUndefined :: JSValueForSend -> Command StrictEqual :: JSValueForSend -> JSValueForSend -> Command InstanceOf :: JSValueForSend -> JSObjectForSend -> Command PropertyNames :: JSObjectForSend -> Command Sync :: Command -- | Result of a Command returned from the JavaScript context data Result DeRefValResult :: JSValueRef -> Text -> Result ValueToBoolResult :: Bool -> Result ValueToNumberResult :: Double -> Result ValueToStringResult :: JSStringReceived -> Result ValueToJSONResult :: JSStringReceived -> Result IsNullResult :: Bool -> Result IsUndefinedResult :: Bool -> Result StrictEqualResult :: Bool -> Result InstanceOfResult :: Bool -> Result Callback :: JSValueReceived -> JSValueReceived -> [JSValueReceived] -> Result PropertyNamesResult :: [JSStringReceived] -> Result ThrowJSValue :: JSValueReceived -> Result ProtocolError :: Text -> Result SyncResult :: Result sendCommand :: Command -> JSM Result sendLazyCommand :: (JSValueForSend -> AsyncCommand) -> JSM JSVal sendAsyncCommand :: AsyncCommand -> JSM () -- | JSM monad keeps track of the JavaScript context module Language.Javascript.JSaddle.Monad -- | The JSM monad keeps track of the JavaScript execution context. -- -- When using GHCJS it is IO. -- -- Given a JSM function and a JSContextRef you can run the -- function like this... -- --
-- runJSM jsmFunction javaScriptContext --newtype JSM a JSM :: ReaderT JSContextRef IO a -> JSM a [unJSM] :: JSM a -> ReaderT JSContextRef IO a -- | Identifies a JavaScript execution context. When using GHCJS this is -- just '()' since their is only one context. When using GHC it includes -- the functions JSaddle needs to communicate with the JavaScript -- context. data JSContextRef -- | The MonadJSM is to JSM what MonadIO is to -- IO. When using GHCJS it is MonadIO. class (Applicative m, MonadIO m) => MonadJSM m -- | The liftJSM is to JSM what liftIO is to -- IO. When using GHCJS it is liftIO. liftJSM :: MonadJSM m => JSM a -> m a -- | Gets the JavaScript context from the monad askJSM :: MonadJSM m => m JSContextRef -- | Run the given JSM action as the main entry point. Either -- directly in GHCJS or as a Warp server on the given port on GHC. run :: Int -> JSM () -> IO () -- | Runs a JSM JavaScript function in a given JavaScript context. runJSM :: MonadIO m => JSM a -> JSContextRef -> m a -- | Alternative version of runJSM runJSaddle :: MonadIO m => JSContextRef -> JSM a -> m a -- | Forces execution of pending asyncronous code syncPoint :: JSM () -- | Forces execution of pending asyncronous code after performing -- f syncAfter :: JSM a -> JSM a -- | On GHCJS this is waitForAnimationFrame. On GHC it will delay -- the execution of the current batch of asynchronous command when they -- are sent to JavaScript. It will not delay the Haskell code execution. -- The time returned will be based on the Haskell clock (not the -- JavaScript clock). waitForAnimationFrame :: JSM Double -- | Tries to executes the given code in the next animation frame callback. -- Avoid synchronous opperations where possible. nextAnimationFrame :: (Double -> JSM a) -> JSM a -- | Wrapped version of catch that runs in a MonadIO that works a -- bit better with JSM catch :: Exception e => JSM b -> (e -> JSM b) -> JSM b -- | Wrapped version of bracket that runs in a MonadIO that works a -- bit better with JSM bracket :: JSM a -> (a -> JSM b) -> (a -> JSM c) -> JSM c module Language.Javascript.JSaddle.Arguments -- | Anything that can be used to make a list of JavaScript value -- references for use as function arguments class MakeArgs this makeArgs :: MakeArgs this => this -> JSM [JSVal] instance Language.Javascript.JSaddle.Arguments.MakeArgs arg => Language.Javascript.JSaddle.Arguments.MakeArgs (Language.Javascript.JSaddle.Types.JSM arg) instance Language.Javascript.JSaddle.Classes.ToJSVal arg => Language.Javascript.JSaddle.Arguments.MakeArgs [arg] instance (Language.Javascript.JSaddle.Classes.ToJSVal arg1, Language.Javascript.JSaddle.Classes.ToJSVal arg2) => Language.Javascript.JSaddle.Arguments.MakeArgs (arg1, arg2) instance (Language.Javascript.JSaddle.Classes.ToJSVal arg1, Language.Javascript.JSaddle.Classes.ToJSVal arg2, Language.Javascript.JSaddle.Classes.ToJSVal arg3) => Language.Javascript.JSaddle.Arguments.MakeArgs (arg1, arg2, arg3) instance (Language.Javascript.JSaddle.Classes.ToJSVal arg1, Language.Javascript.JSaddle.Classes.ToJSVal arg2, Language.Javascript.JSaddle.Classes.ToJSVal arg3, Language.Javascript.JSaddle.Classes.ToJSVal arg4) => Language.Javascript.JSaddle.Arguments.MakeArgs (arg1, arg2, arg3, arg4) instance (Language.Javascript.JSaddle.Classes.ToJSVal arg1, Language.Javascript.JSaddle.Classes.ToJSVal arg2, Language.Javascript.JSaddle.Classes.ToJSVal arg3, Language.Javascript.JSaddle.Classes.ToJSVal arg4, Language.Javascript.JSaddle.Classes.ToJSVal arg5) => Language.Javascript.JSaddle.Arguments.MakeArgs (arg1, arg2, arg3, arg4, arg5) instance (Language.Javascript.JSaddle.Classes.ToJSVal arg1, Language.Javascript.JSaddle.Classes.ToJSVal arg2, Language.Javascript.JSaddle.Classes.ToJSVal arg3, Language.Javascript.JSaddle.Classes.ToJSVal arg4, Language.Javascript.JSaddle.Classes.ToJSVal arg5, Language.Javascript.JSaddle.Classes.ToJSVal arg6) => Language.Javascript.JSaddle.Arguments.MakeArgs (arg1, arg2, arg3, arg4, arg5, arg6) -- | Deals with JavaScript values. These can be -- --
-- >>> testJSaddle $ valToBool JSNull -- false -- -- >>> testJSaddle $ valToBool () -- false -- -- >>> testJSaddle $ valToBool True -- true -- -- >>> testJSaddle $ valToBool False -- false -- -- >>> testJSaddle $ valToBool (1.0 :: Double) -- true -- -- >>> testJSaddle $ valToBool (0.0 :: Double) -- false -- -- >>> testJSaddle $ valToBool "" -- false -- -- >>> testJSaddle $ valToBool "1" -- true --valToBool :: ToJSVal value => value -> JSM Bool -- | Given a JavaScript value get its numeric value. May throw JSException. -- --
-- >>> testJSaddle $ show <$> valToNumber JSNull -- 0.0 -- -- >>> testJSaddle $ show <$> valToNumber () -- NaN -- -- >>> testJSaddle $ show <$> valToNumber True -- 1.0 -- -- >>> testJSaddle $ show <$> valToNumber False -- 0.0 -- -- >>> testJSaddle $ show <$> valToNumber (1.0 :: Double) -- 1.0 -- -- >>> testJSaddle $ show <$> valToNumber (0.0 :: Double) -- 0.0 -- -- >>> testJSaddle $ show <$> valToNumber "" -- 0.0 -- -- >>> testJSaddle $ show <$> valToNumber "1" -- 1.0 --valToNumber :: ToJSVal value => value -> JSM Double -- | Given a JavaScript value get its string value (as a JavaScript -- string). May throw JSException. -- --
-- >>> testJSaddle $ strToText <$> valToStr JSNull -- null -- -- >>> testJSaddle $ strToText <$> valToStr () -- undefined -- -- >>> testJSaddle $ strToText <$> valToStr True -- true -- -- >>> testJSaddle $ strToText <$> valToStr False -- false -- -- >>> testJSaddle $ strToText <$> valToStr (1.0 :: Double) -- 1 -- -- >>> testJSaddle $ strToText <$> valToStr (0.0 :: Double) -- 0 -- -- >>> testJSaddle $ strToText <$> valToStr "" -- -- -- >>> testJSaddle $ strToText <$> valToStr "1" -- 1 --valToStr :: ToJSVal value => value -> JSM JSString -- | Given a JavaScript value get its object value. May throw JSException. -- --
-- >>> testJSaddle $ (valToObject JSNull >>= valToText) `catch` \ (JSException e) -> valToText e -- null -- -- >>> testJSaddle $ (valToObject () >>= valToText) `catch` \ (JSException e) -> valToText e -- undefined -- -- >>> testJSaddle $ valToObject True -- true -- -- >>> testJSaddle $ valToObject False -- false -- -- >>> testJSaddle $ valToObject (1.0 :: Double) -- 1 -- -- >>> testJSaddle $ valToObject (0.0 :: Double) -- 0 -- -- >>> testJSaddle $ valToObject "" -- -- -- >>> testJSaddle $ valToObject "1" -- 1 --valToObject :: ToJSVal value => value -> JSM Object -- | Given a JavaScript value get its string value (as a Haskell -- Text). May throw JSException. -- --
-- >>> testJSaddle $ show <$> valToText JSNull -- "null" -- -- >>> testJSaddle $ show <$> valToText () -- "undefined" -- -- >>> testJSaddle $ show <$> valToText True -- "true" -- -- >>> testJSaddle $ show <$> valToText False -- "false" -- -- >>> testJSaddle $ show <$> valToText (1.0 :: Double) -- "1" -- -- >>> testJSaddle $ show <$> valToText (0.0 :: Double) -- "0" -- -- >>> testJSaddle $ show <$> valToText "" -- "" -- -- >>> testJSaddle $ show <$> valToText "1" -- "1" --valToText :: ToJSVal value => value -> JSM Text -- | Given a JavaScript value get a JSON string value. May throw -- JSException. -- --
-- >>> testJSaddle $ strToText <$> valToJSON JSNull
-- null
--
-- >>> testJSaddle $ strToText <$> valToJSON ()
--
--
-- >>> testJSaddle $ strToText <$> valToJSON True
-- true
--
-- >>> testJSaddle $ strToText <$> valToJSON False
-- false
--
-- >>> testJSaddle $ strToText <$> valToJSON (1.0 :: Double)
-- 1
--
-- >>> testJSaddle $ strToText <$> valToJSON (0.0 :: Double)
-- 0
--
-- >>> testJSaddle $ strToText <$> valToJSON ""
-- ""
--
-- >>> testJSaddle $ strToText <$> valToJSON "1"
-- "1"
--
-- >>> testJSaddle $ strToText <$> (obj >>= valToJSON)
-- {}
--
valToJSON :: ToJSVal value => value -> JSM JSString
-- | Convert to a JavaScript value (just an alias for toJSVal)
val :: ToJSVal value => value -> JSM JSVal
-- | A null JavaScript value
valNull :: JSVal
-- | Test a JavaScript value to see if it is null
valIsNull :: ToJSVal value => value -> JSM Bool
-- | An undefined JavaScript value
valUndefined :: JSVal
-- | Test a JavaScript value to see if it is undefined
valIsUndefined :: ToJSVal value => value -> JSM Bool
-- | Convert a JSVal to a Maybe JSVal (converting null and undefined to
-- Nothing)
maybeNullOrUndefined :: ToJSVal value => value -> JSM (Maybe JSVal)
maybeNullOrUndefined' :: ToJSVal value => (JSVal -> JSM a) -> value -> JSM (Maybe a)
-- | A JavaScript boolean value
valBool :: Bool -> JSVal
-- | Make a JavaScript number
valMakeNumber :: Double -> JSM JSVal
-- | Make a JavaScript string from JSString
valMakeString :: JSString -> JSM JSVal
-- | Derefernce a value reference.
--
-- -- >>> testJSaddle $ showJSValue <$> deRefVal JSNull -- null -- -- >>> testJSaddle $ showJSValue <$> deRefVal () -- undefined -- -- >>> testJSaddle $ showJSValue <$> deRefVal True -- true -- -- >>> testJSaddle $ showJSValue <$> deRefVal False -- false -- -- >>> testJSaddle $ showJSValue <$> deRefVal (1.0 :: Double) -- 1.0 -- -- >>> testJSaddle $ showJSValue <$> deRefVal (0.0 :: Double) -- 0.0 -- -- >>> testJSaddle $ showJSValue <$> deRefVal "" -- "" -- -- >>> testJSaddle $ showJSValue <$> deRefVal "1" -- "1" -- -- >>> testJSaddle $ showJSValue <$> (valToObject True >>= deRefVal) -- true -- -- >>> testJSaddle $ showJSValue <$> (obj >>= deRefVal) -- object --deRefVal :: ToJSVal value => value -> JSM JSValue -- | Make a JavaScript value out of a JSValue ADT. -- --
-- >>> testJSaddle $ valMakeRef ValNull -- null -- -- >>> testJSaddle $ valMakeRef ValUndefined -- undefined -- -- >>> testJSaddle $ valMakeRef (ValBool True) -- true -- -- >>> testJSaddle $ valMakeRef (ValNumber 1) -- 1 -- -- >>> testJSaddle $ valMakeRef (ValString $ T.pack "Hello") -- Hello --valMakeRef :: JSValue -> JSM JSVal -- | Determine if two values are equal (JavaScripts ===) >>> -- testJSaddle $ strictEqual True False false >>> testJSaddle $ -- strictEqual True True true >>> testJSaddle $ strictEqual -- Hello () false >>> testJSaddle $ strictEqual -- Hello Hello true strictEqual :: (ToJSVal a, ToJSVal b) => a -> b -> JSM Bool -- | Determine if two values are equal (JavaScripts ===) >>> -- testJSaddle $ instanceOf obj (Object $ jsg Object) true instanceOf :: (ToJSVal value, MakeObject constructor) => value -> constructor -> JSM Bool instance Language.Javascript.JSaddle.Classes.MakeObject Language.Javascript.JSaddle.Types.JSVal instance Language.Javascript.JSaddle.Classes.ToJSVal Language.Javascript.JSaddle.Types.JSVal instance Language.Javascript.JSaddle.Arguments.MakeArgs Language.Javascript.JSaddle.Types.JSVal instance Language.Javascript.JSaddle.Classes.ToJSVal v => Language.Javascript.JSaddle.Classes.ToJSVal (Language.Javascript.JSaddle.Types.JSM v) instance Language.Javascript.JSaddle.Classes.ToJSVal Language.Javascript.JSaddle.Value.JSNull instance Language.Javascript.JSaddle.Arguments.MakeArgs Language.Javascript.JSaddle.Value.JSNull instance Language.Javascript.JSaddle.Classes.ToJSVal a => Language.Javascript.JSaddle.Classes.ToJSVal (GHC.Base.Maybe a) instance Language.Javascript.JSaddle.Classes.ToJSVal Language.Javascript.JSaddle.Value.JSUndefined instance Language.Javascript.JSaddle.Arguments.MakeArgs () instance Language.Javascript.JSaddle.Classes.ToJSVal GHC.Types.Bool instance Language.Javascript.JSaddle.Arguments.MakeArgs GHC.Types.Bool instance Language.Javascript.JSaddle.Classes.ToJSVal GHC.Types.Double instance Language.Javascript.JSaddle.Classes.ToJSVal GHC.Types.Float instance Language.Javascript.JSaddle.Classes.ToJSVal GHC.Types.Word instance Language.Javascript.JSaddle.Classes.ToJSVal GHC.Word.Word32 instance Language.Javascript.JSaddle.Classes.ToJSVal GHC.Word.Word64 instance Language.Javascript.JSaddle.Classes.ToJSVal GHC.Types.Int instance Language.Javascript.JSaddle.Classes.ToJSVal GHC.Int.Int32 instance Language.Javascript.JSaddle.Classes.ToJSVal GHC.Int.Int64 instance Language.Javascript.JSaddle.Arguments.MakeArgs GHC.Types.Double instance Language.Javascript.JSaddle.Classes.ToJSVal Data.Text.Internal.Text instance Language.Javascript.JSaddle.Arguments.MakeArgs Data.Text.Internal.Text instance Language.Javascript.JSaddle.Classes.ToJSVal GHC.Base.String instance Language.Javascript.JSaddle.Classes.ToJSVal Language.Javascript.JSaddle.Types.JSString instance Language.Javascript.JSaddle.Classes.ToJSString Language.Javascript.JSaddle.Types.JSString instance Language.Javascript.JSaddle.Classes.ToJSString Data.Text.Internal.Text instance Language.Javascript.JSaddle.Classes.ToJSString GHC.Base.String instance Language.Javascript.JSaddle.Classes.ToJSVal Language.Javascript.JSaddle.Value.JSValue instance Language.Javascript.JSaddle.Arguments.MakeArgs Language.Javascript.JSaddle.Value.JSValue -- | Low level JavaScript object property access. In most cases you should -- use Language.Javascript.JSaddle.Object instead. -- -- This module is mostly here to implement functions needed to use -- JSPropRef. module Language.Javascript.JSaddle.Properties -- | Get a property value given the object and the name of the property. objGetPropertyByName :: ToJSString name => Object -> name -> JSM JSVal -- | Get a property value given the object and the index of the property. objGetPropertyAtIndex :: Object -> Int -> JSM JSVal -- | Set a property value given the object and the name of the property. objSetPropertyByName :: (ToJSString name, ToJSVal val) => Object -> name -> val -> JSM () -- | Set a property value given the object and the index of the property. objSetPropertyAtIndex :: (ToJSVal val) => Object -> Int -> val -> JSM () -- | Interface to JavaScript object module Language.Javascript.JSaddle.Object -- | See Object data Object -- | Anything that can be used to make a JavaScript object reference class MakeObject this makeObject :: MakeObject this => this -> JSM Object -- | Lookup a property based on its name. -- --
-- >>> testJSaddle $ eval "'Hello World'.length" -- 11 -- -- >>> testJSaddle $ val "Hello World" ! "length" -- 11 --(!) :: (MakeObject this, ToJSString name) => this -> name -> JSM JSVal -- | Lookup a property based on its index. -- --
-- >>> testJSaddle $ eval "'Hello World'[6]" -- W -- -- >>> testJSaddle $ val "Hello World" !! 6 -- W --(!!) :: (MakeObject this) => this -> Int -> JSM JSVal -- | Makes a getter for a particular property name. -- --
-- js name = to (!name) ---- --
-- >>> testJSaddle $ eval "'Hello World'.length" -- 11 -- -- >>> testJSaddle $ val "Hello World" ^. js "length" -- 11 --js :: (MakeObject s, ToJSString name) => name -> IndexPreservingGetter s (JSM JSVal) -- | Makes a setter for a particular property name. -- --
-- jss name = to (<#name) ---- --
-- >>> testJSaddle $ eval "'Hello World'.length = 12" -- 12 -- -- >>> testJSaddle $ val "Hello World" ^. jss "length" 12 -- undefined --jss :: (ToJSString name, ToJSVal val) => name -> val -> forall o. MakeObject o => IndexPreservingGetter o (JSM ()) -- | Java script function applications have this type type JSF = forall o. MakeObject o => IndexPreservingGetter o (JSM JSVal) -- | Handy way to call a function -- --
-- jsf name = to (\o -> o # name $ args) ---- --
-- >>> testJSaddle $ val "Hello World" ^. jsf "indexOf" ["World"] -- 6 --jsf :: (ToJSString name, MakeArgs args) => name -> args -> JSF -- | Handy way to call a function that expects no arguments -- --
-- js0 name = jsf name () ---- --
-- >>> testJSaddle $ val "Hello World" ^. js0 "toLowerCase" -- hello world --js0 :: (ToJSString name) => name -> JSF -- | Handy way to call a function that expects one argument -- --
-- js1 name a0 = jsf name [a0] ---- --
-- >>> testJSaddle $ val "Hello World" ^. js1 "indexOf" "World" -- 6 --js1 :: (ToJSString name, ToJSVal a0) => name -> a0 -> JSF -- | Handy way to call a function that expects two arguments js2 :: (ToJSString name, ToJSVal a0, ToJSVal a1) => name -> a0 -> a1 -> JSF -- | Handy way to call a function that expects three arguments js3 :: (ToJSString name, ToJSVal a0, ToJSVal a1, ToJSVal a2) => name -> a0 -> a1 -> a2 -> JSF -- | Handy way to call a function that expects four arguments js4 :: (ToJSString name, ToJSVal a0, ToJSVal a1, ToJSVal a2, ToJSVal a3) => name -> a0 -> a1 -> a2 -> a3 -> JSF -- | Handy way to call a function that expects five arguments js5 :: (ToJSString name, ToJSVal a0, ToJSVal a1, ToJSVal a2, ToJSVal a3, ToJSVal a4) => name -> a0 -> a1 -> a2 -> a3 -> a4 -> JSF -- | Handy way to get and hold onto a reference top level javascript -- --
-- >>> testJSaddle $ eval "w = console; w.log('Hello World')"
-- undefined
--
-- >>> testJSaddle $ do w <- jsg "console"; w ^. js1 "log" "Hello World"
-- undefined
--
jsg :: ToJSString a => a -> JSM JSVal
-- | Handy way to call a function
--
-- -- jsgf name = jsg name . to (# args) ---- --
-- >>> testJSaddle $ eval "globalFunc = function (x) {return x.length;}"
-- function (x) {return x.length;}
--
-- >>> testJSaddle $ jsgf "globalFunc" ["World"]
-- 5
--
jsgf :: (ToJSString name, MakeArgs args) => name -> args -> JSM JSVal
-- | Handy way to call a function that expects no arguments
--
-- -- jsg0 name = jsgf name () ---- --
-- >>> testJSaddle $ jsg0 "globalFunc" >>= valToText -- TypeError:...undefine... --jsg0 :: (ToJSString name) => name -> JSM JSVal -- | Handy way to call a function that expects one argument -- --
-- jsg1 name a0 = jsgf name [a0] ---- --
-- >>> testJSaddle $ jsg1 "globalFunc" "World" -- 5 --jsg1 :: (ToJSString name, ToJSVal a0) => name -> a0 -> JSM JSVal -- | Handy way to call a function that expects two arguments jsg2 :: (ToJSString name, ToJSVal a0, ToJSVal a1) => name -> a0 -> a1 -> JSM JSVal -- | Handy way to call a function that expects three arguments jsg3 :: (ToJSString name, ToJSVal a0, ToJSVal a1, ToJSVal a2) => name -> a0 -> a1 -> a2 -> JSM JSVal -- | Handy way to call a function that expects four arguments jsg4 :: (ToJSString name, ToJSVal a0, ToJSVal a1, ToJSVal a2, ToJSVal a3) => name -> a0 -> a1 -> a2 -> a3 -> JSM JSVal -- | Handy way to call a function that expects five arguments jsg5 :: (ToJSString name, ToJSVal a0, ToJSVal a1, ToJSVal a2, ToJSVal a3, ToJSVal a4) => name -> a0 -> a1 -> a2 -> a3 -> a4 -> JSM JSVal -- | Set a JavaScript property -- --
-- >>> testJSaddle $ eval "var j = {}; j.x = 1; j.x"
-- 1
--
-- >>> testJSaddle $ do {j <- obj; (j <# "x") 1; j!"x"}
-- 1
--
(<#) :: (MakeObject this, ToJSString name, ToJSVal val) => this -> name -> val -> JSM ()
infixr 1 <#
-- | Set a JavaScript property
--
--
-- >>> testJSaddle $ eval "var j = {}; j[6] = 1; j[6]"
-- 1
--
-- >>> testJSaddle $ do {j <- obj; (j <## 6) 1; j!!6}
-- 1
--
(<##) :: (MakeObject this, ToJSVal val) => this -> Int -> val -> JSM ()
infixr 1 <##
-- | Call a JavaScript function
--
--
-- >>> testJSaddle $ eval "'Hello World'.indexOf('World')"
-- 6
--
-- >>> testJSaddle $ val "Hello World" # "indexOf" $ ["World"]
-- 6
--
(#) :: (MakeObject this, ToJSString name, MakeArgs args) => this -> name -> args -> JSM JSVal
infixr 2 #
-- | Call a JavaScript function
--
--
-- >>> testJSaddle $ eval "something = {}; something[6]=function (x) {return x.length;}; something[6]('World')"
-- 5
--
-- >>> testJSaddle $ jsg "something" ## 6 $ ["World"]
-- 5
--
(##) :: (MakeObject this, MakeArgs args) => this -> Int -> args -> JSM JSVal
infixr 2 ##
-- | Use this to create a new JavaScript object
--
-- If you pass more than 7 arguments to a constructor for a built in
-- JavaScript type (like Date) then this function will fail.
--
-- -- >>> testJSaddle $ new (jsg "Date") (2013, 1, 1) -- Fri Feb 01 2013 00:00:00 GMT+... (...) --new :: (MakeObject constructor, MakeArgs args) => constructor -> args -> JSM JSVal -- | Call function with a given this. In most cases you should use -- #. -- --
-- >>> testJSaddle $ eval "(function(){return this;}).apply('Hello', [])"
-- Hello
--
-- >>> testJSaddle $ do { test <- eval "(function(){return this;})"; call test (val "Hello") () }
-- Hello
--
call :: (MakeObject f, MakeObject this, MakeArgs args) => f -> this -> args -> JSM JSVal
-- | Make an empty object using the default constuctor
--
--
-- >>> testJSaddle $ eval "var a = {}; a.x = 'Hello'; a.x"
-- Hello
--
-- >>> testJSaddle $ do { a <- obj; (a <# "x") "Hello"; a ^. js "x" }
-- Hello
--
obj :: JSM Object
-- | Make a JavaScript function object that wraps a Haskell function.
newtype Function
Function :: Object -> Function
[functionObject] :: Function -> Object
function :: JSCallAsFunction -> JSM Function
freeFunction :: Function -> JSM ()
-- | Short hand ::JSCallAsFunction so a haskell function can be
-- passed to a to a JavaScipt one.
--
--
-- >>> testJSaddle $ eval "(function(f) {f('Hello');})(function (a) {console.log(a)})"
-- undefined
--
-- >>> :{
-- testJSaddle $ do
-- result <- liftIO newEmptyMVar
-- deRefVal $ call (eval "(function(f) {f('Hello');})") global [fun $ \ _ _ [arg1] -> do
-- valToText arg1 >>= (liftIO . putMVar result)
-- ]
-- liftIO $ takeMVar result
-- :}
-- Hello
--
fun :: JSCallAsFunction -> JSCallAsFunction
-- | Type used for Haskell functions called from JavaScript.
type JSCallAsFunction = JSVal Function object -> JSVal this -> [JSVal] Function arguments -> JSM () Only () (aka 'JSUndefined') can be returned because the function may need to be executed in a different thread. If you need to get a value out pass in a continuation function as an argument and invoke it from haskell.
-- | Make an JavaScript array from a list of values
--
--
-- >>> testJSaddle $ eval "['Hello', 'World'][1]"
-- World
--
-- >>> testJSaddle $ array ["Hello", "World"] !! 1
-- World
--
-- >>> testJSaddle $ eval "['Hello', null, undefined, true, 1]"
-- Hello,,,true,1
--
-- >>> testJSaddle $ array ("Hello", JSNull, (), True, 1.0::Double)
-- Hello,,,true,1
--
array :: MakeArgs args => args -> JSM Object
-- | JavaScript's global object
global :: Object
-- | Get a list containing the property names present on a given object
-- >>> testJSaddle $ show . map strToText $ propertyNames
-- obj [] >>> testJSaddle $ show . map strToText $
-- propertyNames (eval "({x:1, y:2})") ["x","y"]
propertyNames :: MakeObject this => this -> JSM [JSString]
-- | Get a list containing references to all the properties present on a
-- given object
properties :: MakeObject this => this -> JSM [JSVal]
-- | Call a JavaScript object as function. Consider using #.
objCallAsFunction :: MakeArgs args => Object -> Object -> args -> JSM JSVal
-- | Call a JavaScript object as a constructor. Consider using new.
--
-- If you pass more than 7 arguments to a constructor for a built in
-- JavaScript type (like Date) then this function will fail.
objCallAsConstructor :: MakeArgs args => Object -> args -> JSM JSVal
nullObject :: Object
instance Language.Javascript.JSaddle.Classes.MakeObject v => Language.Javascript.JSaddle.Classes.MakeObject (Language.Javascript.JSaddle.Types.JSM v)
instance Language.Javascript.JSaddle.Classes.ToJSVal Language.Javascript.JSaddle.Object.Function
instance Language.Javascript.JSaddle.Classes.ToJSVal Language.Javascript.JSaddle.Types.JSCallAsFunction
instance Language.Javascript.JSaddle.Arguments.MakeArgs Language.Javascript.JSaddle.Types.JSCallAsFunction
instance Language.Javascript.JSaddle.Classes.ToJSVal [Language.Javascript.JSaddle.Types.JSVal]
instance Language.Javascript.JSaddle.Classes.ToJSVal [Language.Javascript.JSaddle.Types.JSM Language.Javascript.JSaddle.Types.JSVal]
instance Language.Javascript.JSaddle.Classes.ToJSVal [GHC.Types.Double]
instance Language.Javascript.JSaddle.Classes.ToJSVal [GHC.Types.Float]
instance Language.Javascript.JSaddle.Classes.ToJSVal [GHC.Types.Int]
instance Language.Javascript.JSaddle.Classes.ToJSVal [Language.Javascript.JSaddle.Types.JSString]
instance Language.Javascript.JSaddle.Classes.ToJSVal [GHC.Base.String]
instance Language.Javascript.JSaddle.Classes.ToJSVal [Data.Text.Internal.Text]
instance Language.Javascript.JSaddle.Classes.ToJSVal [GHC.Types.Bool]
-- | If you just want to run some JavaScript that you have as a string this
-- is you can use eval or evaluateScript.
module Language.Javascript.JSaddle.Evaluate
-- | Evaluates a script (like eval in java script)
--
-- -- >>> testJSaddle $ eval "1+1" -- 2 --eval :: (ToJSString script) => script -> JSM JSVal -- | This package provides an EDSL for calling JavaScript that can be used -- both from GHCJS and GHC. When using GHC the application is run using -- Warp and WebSockets to drive a small JavaScipt helper. module Language.Javascript.JSaddle module Language.Javascript.JSaddle.Test testJSaddle :: ToJSVal val => JSM val -> IO () listWindowProperties :: IO ()