-- 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.7.0.0 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 newtype SomeJSArray (m :: MutabilityType s) SomeJSArray :: JSVal -> SomeJSArray -- | See JSArray type JSArray = SomeJSArray Immutable -- | See MutableJSArray type MutableJSArray = SomeJSArray Mutable -- | 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 JSONValueToValue :: Value -> 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 ValueToJSONValue :: 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 ValueToJSONValueResult :: Value -> 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.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 Control.DeepSeq.NFData Language.Javascript.JSaddle.Types.JSVal 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 -- | JavaScript string conversion functions module Language.Javascript.JSaddle.String -- | See Type data JSString textFromJSString :: JSString -> Text textToJSString :: Text -> 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.Run.Files indexHtml :: ByteString jsaddleJs :: ByteString initState :: ByteString runBatch :: (ByteString -> ByteString) -> ByteString ghcjsHelpers :: ByteString module Language.Javascript.JSaddle.Native.Internal 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 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 module Language.Javascript.JSaddle.Run -- | 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 runJavaScript :: (Batch -> IO ()) -> JSM () -> IO (Result -> IO (), IO ()) -- | 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 JSONValueToValue :: Value -> 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 ValueToJSONValue :: 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 ValueToJSONValueResult :: Value -> 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 () -- | This module is like Foreign but some functions are in module Language.Javascript.JSaddle.Foreign jsTrue :: JSVal jsFalse :: JSVal jsNull :: JSVal toJSBool :: Bool -> JSVal jsUndefined :: JSVal isTruthyIO :: JSVal -> JSM Bool isNullIO :: JSVal -> JSM Bool isUndefinedIO :: JSVal -> JSM Bool -- | 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 -- | 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 -- | 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.Internal -- | Anything that can be used to make a JavaScript object reference class MakeObject this makeObject :: MakeObject this => this -> JSM Object -- | 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.Classes.Internal.MakeObject Language.Javascript.JSaddle.Types.Object instance Language.Javascript.JSaddle.Classes.Internal.MakeArgs arg => Language.Javascript.JSaddle.Classes.Internal.MakeArgs (Language.Javascript.JSaddle.Types.JSM arg) module JavaScript.Object.Internal -- | See Object newtype Object Object :: JSVal -> Object create :: JSM Object listProps :: Object -> JSM [JSString] getProp :: JSString -> Object -> JSM JSVal unsafeGetProp :: JSString -> Object -> JSM JSVal setProp :: JSString -> JSVal -> Object -> JSM () unsafeSetProp :: JSString -> JSVal -> Object -> JSM () module JavaScript.Array.Internal create :: JSM MutableJSArray fromListIO :: [JSVal] -> JSM (SomeJSArray m) toListIO :: SomeJSArray m -> JSM [JSVal] read :: Int -> SomeJSArray m -> JSM JSVal push :: JSVal -> MutableJSArray -> JSM () module GHCJS.Marshal.Internal class FromJSVal a where fromJSValUnchecked = fmap fromJust . fromJSVal fromJSValListOf = fmap sequence . (mapM fromJSVal <=< toListIO . coerce) fromJSValUncheckedListOf = mapM fromJSValUnchecked <=< toListIO . coerce fromJSVal = fromJSVal_generic id fromJSVal :: FromJSVal a => JSVal -> JSM (Maybe a) fromJSValUnchecked :: FromJSVal a => JSVal -> JSM a fromJSValListOf :: FromJSVal a => JSVal -> JSM (Maybe [a]) fromJSValUncheckedListOf :: FromJSVal a => JSVal -> JSM [a] fromJSVal :: (FromJSVal a, Generic a, GFromJSVal (Rep a ())) => JSVal -> JSM (Maybe a) class ToJSVal a where toJSValListOf = fmap coerce . fromListIO <=< mapM toJSVal toJSVal = toJSVal_generic id toJSVal :: ToJSVal a => a -> JSM JSVal toJSValListOf :: ToJSVal a => [a] -> JSM JSVal toJSVal :: (ToJSVal a, Generic a, GToJSVal (Rep a ())) => a -> JSM JSVal class PToJSVal a pToJSVal :: PToJSVal a => a -> JSVal class PFromJSVal a pFromJSVal :: PFromJSVal a => JSVal -> a data Purity -- | conversion is pure even if the original value is shared PureShared :: Purity -- | conversion is pure if the we only convert once PureExclusive :: Purity toJSVal_generic :: forall a. (Generic a, GToJSVal (Rep a ())) => (String -> String) -> a -> JSM JSVal fromJSVal_generic :: forall a. (Generic a, GFromJSVal (Rep a ())) => (String -> String) -> JSVal -> JSM (Maybe a) toJSVal_pure :: PToJSVal a => a -> JSM JSVal fromJSVal_pure :: PFromJSVal a => JSVal -> JSM (Maybe a) fromJSValUnchecked_pure :: PFromJSVal a => JSVal -> JSM a instance Data.Data.Data GHCJS.Marshal.Internal.Purity instance GHC.Classes.Ord GHCJS.Marshal.Internal.Purity instance GHC.Classes.Eq GHCJS.Marshal.Internal.Purity instance GHCJS.Marshal.Internal.ToJSVal b => GHCJS.Marshal.Internal.GToJSVal (GHC.Generics.K1 a b c) instance GHCJS.Marshal.Internal.GToJSVal p => GHCJS.Marshal.Internal.GToJSVal (GHC.Generics.Par1 p) instance GHCJS.Marshal.Internal.GToJSVal (f p) => GHCJS.Marshal.Internal.GToJSVal (GHC.Generics.Rec1 f p) instance (GHCJS.Marshal.Internal.GToJSVal (a p), GHCJS.Marshal.Internal.GToJSVal (b p)) => GHCJS.Marshal.Internal.GToJSVal ((GHC.Generics.:+:) a b p) instance GHCJS.Marshal.Internal.GToJSVal (a p) => GHCJS.Marshal.Internal.GToJSVal (GHC.Generics.M1 GHC.Generics.D c a p) instance (GHC.Generics.Constructor c, GHCJS.Marshal.Internal.GToJSVal (a p)) => GHCJS.Marshal.Internal.GToJSVal (GHC.Generics.M1 GHC.Generics.C c a p) instance (GHCJS.Marshal.Internal.GToJSArr (a p), GHCJS.Marshal.Internal.GToJSArr (b p), GHCJS.Marshal.Internal.GToJSProp (a p), GHCJS.Marshal.Internal.GToJSProp (b p)) => GHCJS.Marshal.Internal.GToJSVal ((GHC.Generics.:*:) a b p) instance GHCJS.Marshal.Internal.GToJSVal (a p) => GHCJS.Marshal.Internal.GToJSVal (GHC.Generics.M1 GHC.Generics.S c a p) instance (GHCJS.Marshal.Internal.GToJSProp (a p), GHCJS.Marshal.Internal.GToJSProp (b p)) => GHCJS.Marshal.Internal.GToJSProp ((GHC.Generics.:*:) a b p) instance (GHC.Generics.Selector c, GHCJS.Marshal.Internal.GToJSVal (a p)) => GHCJS.Marshal.Internal.GToJSProp (GHC.Generics.M1 GHC.Generics.S c a p) instance (GHCJS.Marshal.Internal.GToJSArr (a p), GHCJS.Marshal.Internal.GToJSArr (b p)) => GHCJS.Marshal.Internal.GToJSArr ((GHC.Generics.:*:) a b p) instance GHCJS.Marshal.Internal.GToJSVal (a p) => GHCJS.Marshal.Internal.GToJSArr (GHC.Generics.M1 GHC.Generics.S c a p) instance GHCJS.Marshal.Internal.GToJSVal (GHC.Generics.V1 p) instance GHCJS.Marshal.Internal.GToJSVal (GHC.Generics.U1 p) instance GHCJS.Marshal.Internal.FromJSVal b => GHCJS.Marshal.Internal.GFromJSVal (GHC.Generics.K1 a b c) instance GHCJS.Marshal.Internal.GFromJSVal p => GHCJS.Marshal.Internal.GFromJSVal (GHC.Generics.Par1 p) instance GHCJS.Marshal.Internal.GFromJSVal (f p) => GHCJS.Marshal.Internal.GFromJSVal (GHC.Generics.Rec1 f p) instance (GHCJS.Marshal.Internal.GFromJSVal (a p), GHCJS.Marshal.Internal.GFromJSVal (b p)) => GHCJS.Marshal.Internal.GFromJSVal ((GHC.Generics.:+:) a b p) instance GHCJS.Marshal.Internal.GFromJSVal (a p) => GHCJS.Marshal.Internal.GFromJSVal (GHC.Generics.M1 GHC.Generics.D c a p) instance (GHC.Generics.Constructor c, GHCJS.Marshal.Internal.GFromJSVal (a p)) => GHCJS.Marshal.Internal.GFromJSVal (GHC.Generics.M1 GHC.Generics.C c a p) instance (GHCJS.Marshal.Internal.GFromJSArr (a p), GHCJS.Marshal.Internal.GFromJSArr (b p), GHCJS.Marshal.Internal.GFromJSProp (a p), GHCJS.Marshal.Internal.GFromJSProp (b p)) => GHCJS.Marshal.Internal.GFromJSVal ((GHC.Generics.:*:) a b p) instance GHCJS.Marshal.Internal.GFromJSVal (a p) => GHCJS.Marshal.Internal.GFromJSVal (GHC.Generics.M1 GHC.Generics.S c a p) instance (GHCJS.Marshal.Internal.GFromJSProp (a p), GHCJS.Marshal.Internal.GFromJSProp (b p)) => GHCJS.Marshal.Internal.GFromJSProp ((GHC.Generics.:*:) a b p) instance (GHC.Generics.Selector c, GHCJS.Marshal.Internal.GFromJSVal (a p)) => GHCJS.Marshal.Internal.GFromJSProp (GHC.Generics.M1 GHC.Generics.S c a p) instance (GHCJS.Marshal.Internal.GFromJSArr (a p), GHCJS.Marshal.Internal.GFromJSArr (b p)) => GHCJS.Marshal.Internal.GFromJSArr ((GHC.Generics.:*:) a b p) instance GHCJS.Marshal.Internal.GFromJSVal (a p) => GHCJS.Marshal.Internal.GFromJSArr (GHC.Generics.M1 GHC.Generics.S c a p) instance GHCJS.Marshal.Internal.GFromJSVal (GHC.Generics.V1 p) instance GHCJS.Marshal.Internal.GFromJSVal (GHC.Generics.U1 p) module GHCJS.Marshal.Pure class PFromJSVal a pFromJSVal :: PFromJSVal a => JSVal -> a class PToJSVal a pToJSVal :: PToJSVal a => a -> JSVal instance GHCJS.Marshal.Internal.PFromJSVal Language.Javascript.JSaddle.Types.JSVal instance GHCJS.Marshal.Internal.PFromJSVal () instance GHCJS.Marshal.Internal.PToJSVal Language.Javascript.JSaddle.Types.JSVal instance GHCJS.Marshal.Internal.PToJSVal GHC.Types.Bool -- | JSStrings in JSaddle (when compiled with GHC) is not a -- JSVal instead it is implemented with a Text. module Language.Javascript.JSaddle.Marshal.String -- | Anything that can be used to make a JavaScript string class ToJSVal a => ToJSString a toJSString :: ToJSString a => a -> JSString -- | Anything that can be constructed from a JavaScript string class FromJSVal a => FromJSString a fromJSString :: FromJSString a => JSString -> a -- | 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 class PToJSVal a pToJSVal :: PToJSVal a => a -> JSVal class PFromJSVal a pFromJSVal :: PFromJSVal a => JSVal -> a class ToJSVal a where toJSValListOf = fmap coerce . fromListIO <=< mapM toJSVal toJSVal = toJSVal_generic id toJSVal :: ToJSVal a => a -> JSM JSVal toJSValListOf :: ToJSVal a => [a] -> JSM JSVal toJSVal :: (ToJSVal a, Generic a, GToJSVal (Rep a ())) => a -> JSM JSVal class FromJSVal a where fromJSValUnchecked = fmap fromJust . fromJSVal fromJSValListOf = fmap sequence . (mapM fromJSVal <=< toListIO . coerce) fromJSValUncheckedListOf = mapM fromJSValUnchecked <=< toListIO . coerce fromJSVal = fromJSVal_generic id fromJSVal :: FromJSVal a => JSVal -> JSM (Maybe a) fromJSValUnchecked :: FromJSVal a => JSVal -> JSM a fromJSValListOf :: FromJSVal a => JSVal -> JSM (Maybe [a]) fromJSValUncheckedListOf :: FromJSVal a => JSVal -> JSM [a] fromJSVal :: (FromJSVal a, Generic a, GFromJSVal (Rep a ())) => JSVal -> JSM (Maybe a) -- | Anything that can be used to make a JavaScript string class ToJSVal a => ToJSString a toJSString :: ToJSString a => a -> JSString -- | Anything that can be constructed from a JavaScript string class FromJSVal a => FromJSString a fromJSString :: FromJSString a => JSString -> a -- | Anything that can be used to make a JavaScript object reference class MakeObject this makeObject :: MakeObject this => this -> JSM Object -- | 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] 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 GHCJS.Marshal.Internal.ToJSVal arg => Language.Javascript.JSaddle.Classes.Internal.MakeArgs [arg] instance (GHCJS.Marshal.Internal.ToJSVal arg1, GHCJS.Marshal.Internal.ToJSVal arg2) => Language.Javascript.JSaddle.Classes.Internal.MakeArgs (arg1, arg2) instance (GHCJS.Marshal.Internal.ToJSVal arg1, GHCJS.Marshal.Internal.ToJSVal arg2, GHCJS.Marshal.Internal.ToJSVal arg3) => Language.Javascript.JSaddle.Classes.Internal.MakeArgs (arg1, arg2, arg3) instance (GHCJS.Marshal.Internal.ToJSVal arg1, GHCJS.Marshal.Internal.ToJSVal arg2, GHCJS.Marshal.Internal.ToJSVal arg3, GHCJS.Marshal.Internal.ToJSVal arg4) => Language.Javascript.JSaddle.Classes.Internal.MakeArgs (arg1, arg2, arg3, arg4) instance (GHCJS.Marshal.Internal.ToJSVal arg1, GHCJS.Marshal.Internal.ToJSVal arg2, GHCJS.Marshal.Internal.ToJSVal arg3, GHCJS.Marshal.Internal.ToJSVal arg4, GHCJS.Marshal.Internal.ToJSVal arg5) => Language.Javascript.JSaddle.Classes.Internal.MakeArgs (arg1, arg2, arg3, arg4, arg5) instance (GHCJS.Marshal.Internal.ToJSVal arg1, GHCJS.Marshal.Internal.ToJSVal arg2, GHCJS.Marshal.Internal.ToJSVal arg3, GHCJS.Marshal.Internal.ToJSVal arg4, GHCJS.Marshal.Internal.ToJSVal arg5, GHCJS.Marshal.Internal.ToJSVal arg6) => Language.Javascript.JSaddle.Classes.Internal.MakeArgs (arg1, arg2, arg3, arg4, arg5, arg6) -- | 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 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 -- | 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 getProp :: JSString -> Object -> JSM JSVal unsafeGetProp :: JSString -> Object -> JSM JSVal -- | 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 setProp :: JSString -> JSVal -> Object -> JSM () unsafeSetProp :: JSString -> JSVal -> Object -> JSM () -- | 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 () -- | Deals with JavaScript values. These can be -- -- module Language.Javascript.JSaddle.Value -- | See JSVal data JSVal class ToJSVal a where toJSValListOf = fmap coerce . fromListIO <=< mapM toJSVal toJSVal = toJSVal_generic id toJSVal :: ToJSVal a => a -> JSM JSVal toJSValListOf :: ToJSVal a => [a] -> JSM JSVal toJSVal :: (ToJSVal a, Generic a, GToJSVal (Rep a ())) => a -> JSM JSVal data JSNull -- | Type that represents a value that can only be null. Haskell of course -- has no null so we are adding this type. JSNull :: JSNull type JSUndefined = () A type that can only be undefined in JavaScript. Using () because functions in JavaScript that have no return, impicitly return undefined. type JSBool = Bool -- ^ JavaScript boolean values map the 'Bool' haskell type. type JSNumber = Double -- ^ A number in JavaScript maps nicely to 'Double'. type JSString = Text -- ^ JavaScript strings can be represented with the Haskell 'Text' type. -- | See Type data JSString -- | An algebraic data type that can represent a JavaScript value. Any -- JavaScriptCore JSVal can be converted into this type. data JSValue -- | null ValNull :: JSValue -- | undefined ValUndefined :: JSValue -- | true or false ValBool :: Bool -> JSValue -- | a number ValNumber :: Double -> JSValue -- | a string ValString :: Text -> JSValue -- | an object ValObject :: Object -> JSValue -- | Show a JSValue but just say "object" if the value is a JavaScript -- object. showJSValue :: JSValue -> String isTruthyIO :: JSVal -> JSM Bool -- | Given a JavaScript value get its boolean value. All values in -- JavaScript convert to bool. -- --
--   >>> 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 jsNull :: JSVal -- | A null JavaScript value valNull :: JSVal isNullIO :: JSVal -> JSM Bool -- | Test a JavaScript value to see if it is null valIsNull :: ToJSVal value => value -> JSM Bool jsUndefined :: JSVal -- | An undefined JavaScript value valUndefined :: JSVal isUndefinedIO :: JSVal -> JSM Bool -- | 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) toJSBool :: Bool -> JSVal jsTrue :: JSVal jsFalse :: JSVal -- | 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 -- | Make a JavaScript string from Text valMakeText :: Text -> JSM JSVal -- | Make a JavaScript string from AESON Value valMakeJSON :: Value -> 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.Internal.MakeObject Language.Javascript.JSaddle.Types.JSVal instance GHCJS.Marshal.Internal.ToJSVal Language.Javascript.JSaddle.Types.Object instance GHCJS.Marshal.Internal.ToJSVal Language.Javascript.JSaddle.Types.JSVal instance Language.Javascript.JSaddle.Classes.Internal.MakeArgs Language.Javascript.JSaddle.Types.JSVal instance GHCJS.Marshal.Internal.ToJSVal v => GHCJS.Marshal.Internal.ToJSVal (Language.Javascript.JSaddle.Types.JSM v) instance GHCJS.Marshal.Internal.ToJSVal Language.Javascript.JSaddle.Value.JSNull instance Language.Javascript.JSaddle.Classes.Internal.MakeArgs Language.Javascript.JSaddle.Value.JSNull instance GHCJS.Marshal.Internal.ToJSVal a => GHCJS.Marshal.Internal.ToJSVal (GHC.Base.Maybe a) instance GHCJS.Marshal.Internal.FromJSVal a => GHCJS.Marshal.Internal.FromJSVal (GHC.Base.Maybe a) instance GHCJS.Marshal.Internal.ToJSVal a => GHCJS.Marshal.Internal.ToJSVal [a] instance GHCJS.Marshal.Internal.FromJSVal a => GHCJS.Marshal.Internal.FromJSVal [a] instance GHCJS.Marshal.Internal.ToJSVal Language.Javascript.JSaddle.Value.JSUndefined instance Language.Javascript.JSaddle.Classes.Internal.MakeArgs () instance GHCJS.Marshal.Internal.ToJSVal GHC.Types.Bool instance Language.Javascript.JSaddle.Classes.Internal.MakeArgs GHC.Types.Bool instance GHCJS.Marshal.Internal.ToJSVal GHC.Types.Double instance GHCJS.Marshal.Internal.ToJSVal GHC.Types.Float instance GHCJS.Marshal.Internal.ToJSVal GHC.Types.Word instance GHCJS.Marshal.Internal.ToJSVal GHC.Word.Word8 instance GHCJS.Marshal.Internal.ToJSVal GHC.Word.Word16 instance GHCJS.Marshal.Internal.ToJSVal GHC.Word.Word32 instance GHCJS.Marshal.Internal.ToJSVal GHC.Types.Int instance GHCJS.Marshal.Internal.ToJSVal GHC.Int.Int8 instance GHCJS.Marshal.Internal.ToJSVal GHC.Int.Int16 instance GHCJS.Marshal.Internal.ToJSVal GHC.Int.Int32 instance Language.Javascript.JSaddle.Classes.Internal.MakeArgs GHC.Types.Double instance GHCJS.Marshal.Internal.ToJSVal Data.Text.Internal.Text instance GHCJS.Marshal.Internal.FromJSVal Data.Text.Internal.Text instance Language.Javascript.JSaddle.Classes.Internal.MakeArgs Data.Text.Internal.Text instance GHCJS.Marshal.Internal.ToJSVal Language.Javascript.JSaddle.Types.JSString instance GHCJS.Marshal.Internal.FromJSVal Language.Javascript.JSaddle.Types.JSString instance Language.Javascript.JSaddle.Marshal.String.ToJSString Language.Javascript.JSaddle.Types.JSString instance Language.Javascript.JSaddle.Marshal.String.ToJSString Data.Text.Internal.Text instance Language.Javascript.JSaddle.Marshal.String.ToJSString GHC.Base.String instance Language.Javascript.JSaddle.Marshal.String.FromJSString Data.Text.Internal.Text instance Language.Javascript.JSaddle.Marshal.String.FromJSString GHC.Base.String instance Language.Javascript.JSaddle.Marshal.String.FromJSString Language.Javascript.JSaddle.Types.JSString instance GHCJS.Marshal.Internal.ToJSVal GHC.Types.Char instance GHCJS.Marshal.Internal.FromJSVal GHC.Types.Char instance GHCJS.Marshal.Internal.ToJSVal Data.Aeson.Types.Internal.Value instance Language.Javascript.JSaddle.Classes.Internal.MakeArgs Data.Aeson.Types.Internal.Value instance GHCJS.Marshal.Internal.ToJSVal Language.Javascript.JSaddle.Value.JSValue instance Language.Javascript.JSaddle.Classes.Internal.MakeArgs Language.Javascript.JSaddle.Value.JSValue -- | Interface to JavaScript object module Language.Javascript.JSaddle.Object -- | See Object newtype Object Object :: JSVal -> 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 create :: JSM Object getProp :: JSString -> Object -> JSM JSVal unsafeGetProp :: JSString -> Object -> JSM JSVal setProp :: JSString -> JSVal -> Object -> JSM () unsafeSetProp :: JSString -> JSVal -> Object -> JSM () -- | 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. fromListIO :: [JSVal] -> JSM (SomeJSArray m) -- | 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 listProps :: Object -> JSM [JSString] -- | 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.Internal.MakeObject v => Language.Javascript.JSaddle.Classes.Internal.MakeObject (Language.Javascript.JSaddle.Types.JSM v) instance GHCJS.Marshal.Internal.ToJSVal Language.Javascript.JSaddle.Object.Function instance GHCJS.Marshal.Internal.ToJSVal Language.Javascript.JSaddle.Types.JSCallAsFunction instance Language.Javascript.JSaddle.Classes.Internal.MakeArgs Language.Javascript.JSaddle.Types.JSCallAsFunction -- | Interface to JavaScript array module Language.Javascript.JSaddle.Array newtype SomeJSArray (m :: MutabilityType s) SomeJSArray :: JSVal -> SomeJSArray -- | See JSArray type JSArray = SomeJSArray Immutable -- | See MutableJSArray type MutableJSArray = SomeJSArray Mutable create :: JSM MutableJSArray -- | Returns the size/length of a finite structure as an Int. The -- default implementation is optimized for structures that are similar to -- cons-lists, because there is no general way to do better. length :: Foldable t => forall a. t a -> Int lengthIO :: SomeJSArray m -> JSM Int nullIO :: SomeJSArray m -> JSM Bool fromListIO :: [JSVal] -> JSM (SomeJSArray m) toListIO :: SomeJSArray m -> JSM [JSVal] read :: Int -> SomeJSArray m -> JSM JSVal write :: Int -> JSVal -> MutableJSArray -> JSM () append :: SomeJSArray m -> SomeJSArray m -> JSM (SomeJSArray m1) push :: JSVal -> MutableJSArray -> JSM () pop :: MutableJSArray -> JSM JSVal unshift :: JSVal -> MutableJSArray -> JSM () shift :: MutableJSArray -> JSM JSVal reverse :: MutableJSArray -> JSM () takeIO :: Int -> SomeJSArray m -> JSM (SomeJSArray m1) dropIO :: Int -> SomeJSArray m -> JSM (SomeJSArray m1) sliceIO :: Int -> Int -> JSArray -> JSM (SomeJSArray m1) freeze :: MutableJSArray -> JSM JSArray unsafeFreeze :: MutableJSArray -> JSM JSArray thaw :: JSArray -> JSM MutableJSArray unsafeThaw :: JSArray -> JSM MutableJSArray module GHCJS.Marshal class FromJSVal a where fromJSValUnchecked = fmap fromJust . fromJSVal fromJSValListOf = fmap sequence . (mapM fromJSVal <=< toListIO . coerce) fromJSValUncheckedListOf = mapM fromJSValUnchecked <=< toListIO . coerce fromJSVal = fromJSVal_generic id fromJSVal :: FromJSVal a => JSVal -> JSM (Maybe a) fromJSValUnchecked :: FromJSVal a => JSVal -> JSM a fromJSValListOf :: FromJSVal a => JSVal -> JSM (Maybe [a]) fromJSValUncheckedListOf :: FromJSVal a => JSVal -> JSM [a] fromJSVal :: (FromJSVal a, Generic a, GFromJSVal (Rep a ())) => JSVal -> JSM (Maybe a) class ToJSVal a where toJSValListOf = fmap coerce . fromListIO <=< mapM toJSVal toJSVal = toJSVal_generic id toJSVal :: ToJSVal a => a -> JSM JSVal toJSValListOf :: ToJSVal a => [a] -> JSM JSVal toJSVal :: (ToJSVal a, Generic a, GToJSVal (Rep a ())) => a -> JSM JSVal toJSVal_aeson :: ToJSON a => a -> JSM JSVal toJSVal_pure :: PToJSVal a => a -> JSM JSVal instance GHCJS.Marshal.Internal.FromJSVal Language.Javascript.JSaddle.Types.JSVal instance GHCJS.Marshal.Internal.FromJSVal () instance GHCJS.Marshal.Internal.FromJSVal GHC.Types.Bool instance GHCJS.Marshal.Internal.FromJSVal GHC.Types.Int instance GHCJS.Marshal.Internal.FromJSVal GHC.Int.Int8 instance GHCJS.Marshal.Internal.FromJSVal GHC.Int.Int16 instance GHCJS.Marshal.Internal.FromJSVal GHC.Int.Int32 instance GHCJS.Marshal.Internal.FromJSVal GHC.Types.Word instance GHCJS.Marshal.Internal.FromJSVal GHC.Word.Word8 instance GHCJS.Marshal.Internal.FromJSVal GHC.Word.Word16 instance GHCJS.Marshal.Internal.FromJSVal GHC.Word.Word32 instance GHCJS.Marshal.Internal.FromJSVal GHC.Types.Float instance GHCJS.Marshal.Internal.FromJSVal GHC.Types.Double instance GHCJS.Marshal.Internal.FromJSVal Data.Aeson.Types.Internal.Value instance (GHCJS.Marshal.Internal.FromJSVal a, GHCJS.Marshal.Internal.FromJSVal b) => GHCJS.Marshal.Internal.FromJSVal (a, b) instance (GHCJS.Marshal.Internal.FromJSVal a, GHCJS.Marshal.Internal.FromJSVal b, GHCJS.Marshal.Internal.FromJSVal c) => GHCJS.Marshal.Internal.FromJSVal (a, b, c) instance (GHCJS.Marshal.Internal.FromJSVal a, GHCJS.Marshal.Internal.FromJSVal b, GHCJS.Marshal.Internal.FromJSVal c, GHCJS.Marshal.Internal.FromJSVal d) => GHCJS.Marshal.Internal.FromJSVal (a, b, c, d) instance (GHCJS.Marshal.Internal.FromJSVal a, GHCJS.Marshal.Internal.FromJSVal b, GHCJS.Marshal.Internal.FromJSVal c, GHCJS.Marshal.Internal.FromJSVal d, GHCJS.Marshal.Internal.FromJSVal e) => GHCJS.Marshal.Internal.FromJSVal (a, b, c, d, e) instance (GHCJS.Marshal.Internal.FromJSVal a, GHCJS.Marshal.Internal.FromJSVal b, GHCJS.Marshal.Internal.FromJSVal c, GHCJS.Marshal.Internal.FromJSVal d, GHCJS.Marshal.Internal.FromJSVal e, GHCJS.Marshal.Internal.FromJSVal f) => GHCJS.Marshal.Internal.FromJSVal (a, b, c, d, e, f) instance (GHCJS.Marshal.Internal.FromJSVal a, GHCJS.Marshal.Internal.FromJSVal b, GHCJS.Marshal.Internal.FromJSVal c, GHCJS.Marshal.Internal.FromJSVal d, GHCJS.Marshal.Internal.FromJSVal e, GHCJS.Marshal.Internal.FromJSVal f, GHCJS.Marshal.Internal.FromJSVal g) => GHCJS.Marshal.Internal.FromJSVal (a, b, c, d, e, f, g) instance (GHCJS.Marshal.Internal.FromJSVal a, GHCJS.Marshal.Internal.FromJSVal b, GHCJS.Marshal.Internal.FromJSVal c, GHCJS.Marshal.Internal.FromJSVal d, GHCJS.Marshal.Internal.FromJSVal e, GHCJS.Marshal.Internal.FromJSVal f, GHCJS.Marshal.Internal.FromJSVal g, GHCJS.Marshal.Internal.FromJSVal h) => GHCJS.Marshal.Internal.FromJSVal (a, b, c, d, e, f, g, h) instance (GHCJS.Marshal.Internal.ToJSVal a, GHCJS.Marshal.Internal.ToJSVal b) => GHCJS.Marshal.Internal.ToJSVal (a, b) instance (GHCJS.Marshal.Internal.ToJSVal a, GHCJS.Marshal.Internal.ToJSVal b, GHCJS.Marshal.Internal.ToJSVal c) => GHCJS.Marshal.Internal.ToJSVal (a, b, c) instance (GHCJS.Marshal.Internal.ToJSVal a, GHCJS.Marshal.Internal.ToJSVal b, GHCJS.Marshal.Internal.ToJSVal c, GHCJS.Marshal.Internal.ToJSVal d) => GHCJS.Marshal.Internal.ToJSVal (a, b, c, d) instance (GHCJS.Marshal.Internal.ToJSVal a, GHCJS.Marshal.Internal.ToJSVal b, GHCJS.Marshal.Internal.ToJSVal c, GHCJS.Marshal.Internal.ToJSVal d, GHCJS.Marshal.Internal.ToJSVal e) => GHCJS.Marshal.Internal.ToJSVal (a, b, c, d, e) instance (GHCJS.Marshal.Internal.ToJSVal a, GHCJS.Marshal.Internal.ToJSVal b, GHCJS.Marshal.Internal.ToJSVal c, GHCJS.Marshal.Internal.ToJSVal d, GHCJS.Marshal.Internal.ToJSVal e, GHCJS.Marshal.Internal.ToJSVal f) => GHCJS.Marshal.Internal.ToJSVal (a, b, c, d, e, f) instance (GHCJS.Marshal.Internal.ToJSVal a, GHCJS.Marshal.Internal.ToJSVal b, GHCJS.Marshal.Internal.ToJSVal c, GHCJS.Marshal.Internal.ToJSVal d, GHCJS.Marshal.Internal.ToJSVal e, GHCJS.Marshal.Internal.ToJSVal f, GHCJS.Marshal.Internal.ToJSVal g) => GHCJS.Marshal.Internal.ToJSVal (a, b, c, d, e, f, g) -- | 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