jsaddle 0.9.5.0 → 0.9.6.0
raw patch · 4 files changed
+21/−51 lines, 4 filesdep ~aesondep ~containersdep ~exceptionsPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: aeson, containers, exceptions, lens, stm
API changes (from Hackage documentation)
- GHCJS.Prim.Internal: instance GHC.Exception.Exception GHCJS.Prim.Internal.JSException
- GHCJS.Prim.Internal: instance GHC.Exception.Exception GHCJS.Prim.Internal.WouldBlockException
- Language.Javascript.JSaddle.Exception: instance GHC.Exception.Exception Language.Javascript.JSaddle.Exception.JSException
- Language.Javascript.JSaddle.Run.Files: jsaddleJs :: ByteString
- Language.Javascript.JSaddle.Value: instance GHCJS.Marshal.Internal.FromJSVal a => GHCJS.Marshal.Internal.FromJSVal (GHC.Base.Maybe a)
- Language.Javascript.JSaddle.Value: instance GHCJS.Marshal.Internal.ToJSVal a => GHCJS.Marshal.Internal.ToJSVal (GHC.Base.Maybe a)
+ Data.JSString.Internal.Fusion.Types: infixl 2 :*:
+ GHCJS.Internal.Types: type family Mutability (a :: MutabilityType s) :: IsItMutable
+ GHCJS.Prim.Internal: instance GHC.Exception.Type.Exception GHCJS.Prim.Internal.JSException
+ GHCJS.Prim.Internal: instance GHC.Exception.Type.Exception GHCJS.Prim.Internal.WouldBlockException
+ JavaScript.TypedArray.Internal.Types: type family Elem x
+ Language.Javascript.JSaddle: type family Mutability (a :: MutabilityType s) :: IsItMutable
+ Language.Javascript.JSaddle.Exception: instance GHC.Exception.Type.Exception Language.Javascript.JSaddle.Exception.JSException
+ Language.Javascript.JSaddle.Types: instance Control.Monad.Fail.MonadFail Language.Javascript.JSaddle.Types.JSM
+ Language.Javascript.JSaddle.Types: type family Mutability (a :: MutabilityType s) :: IsItMutable
+ Language.Javascript.JSaddle.Value: instance GHCJS.Marshal.Internal.FromJSVal a => GHCJS.Marshal.Internal.FromJSVal (GHC.Maybe.Maybe a)
+ Language.Javascript.JSaddle.Value: instance GHCJS.Marshal.Internal.ToJSVal a => GHCJS.Marshal.Internal.ToJSVal (GHC.Maybe.Maybe a)
- Data.JSString.Internal.Fusion: [Stream] :: Stream a
+ Data.JSString.Internal.Fusion: [Stream] :: forall a s. () => (s -> Step s a) -> !s -> !Size -> Stream a
- Data.JSString.Internal.Fusion.Common: all :: Char -> Bool -> Stream Char -> Bool
+ Data.JSString.Internal.Fusion.Common: all :: (Char -> Bool) -> Stream Char -> Bool
- Data.JSString.Internal.Fusion.Common: any :: Char -> Bool -> Stream Char -> Bool
+ Data.JSString.Internal.Fusion.Common: any :: (Char -> Bool) -> Stream Char -> Bool
- Data.JSString.Internal.Fusion.Common: concatMap :: Char -> Stream Char -> Stream Char -> Stream Char
+ Data.JSString.Internal.Fusion.Common: concatMap :: (Char -> Stream Char) -> Stream Char -> Stream Char
- Data.JSString.Internal.Fusion.Common: dropWhile :: Char -> Bool -> Stream Char -> Stream Char
+ Data.JSString.Internal.Fusion.Common: dropWhile :: (Char -> Bool) -> Stream Char -> Stream Char
- Data.JSString.Internal.Fusion.Common: filter :: Char -> Bool -> Stream Char -> Stream Char
+ Data.JSString.Internal.Fusion.Common: filter :: (Char -> Bool) -> Stream Char -> Stream Char
- Data.JSString.Internal.Fusion.Common: findBy :: Char -> Bool -> Stream Char -> Maybe Char
+ Data.JSString.Internal.Fusion.Common: findBy :: (Char -> Bool) -> Stream Char -> Maybe Char
- Data.JSString.Internal.Fusion.Common: findIndexI :: Integral a => Char -> Bool -> Stream Char -> Maybe a
+ Data.JSString.Internal.Fusion.Common: findIndexI :: Integral a => (Char -> Bool) -> Stream Char -> Maybe a
- Data.JSString.Internal.Fusion.Common: foldl :: () => b -> Char -> b -> b -> Stream Char -> b
+ Data.JSString.Internal.Fusion.Common: foldl :: () => (b -> Char -> b) -> b -> Stream Char -> b
- Data.JSString.Internal.Fusion.Common: foldl' :: () => b -> Char -> b -> b -> Stream Char -> b
+ Data.JSString.Internal.Fusion.Common: foldl' :: () => (b -> Char -> b) -> b -> Stream Char -> b
- Data.JSString.Internal.Fusion.Common: foldl1 :: Char -> Char -> Char -> Stream Char -> Char
+ Data.JSString.Internal.Fusion.Common: foldl1 :: (Char -> Char -> Char) -> Stream Char -> Char
- Data.JSString.Internal.Fusion.Common: foldl1' :: Char -> Char -> Char -> Stream Char -> Char
+ Data.JSString.Internal.Fusion.Common: foldl1' :: (Char -> Char -> Char) -> Stream Char -> Char
- Data.JSString.Internal.Fusion.Common: foldr :: () => Char -> b -> b -> b -> Stream Char -> b
+ Data.JSString.Internal.Fusion.Common: foldr :: () => (Char -> b -> b) -> b -> Stream Char -> b
- Data.JSString.Internal.Fusion.Common: foldr1 :: Char -> Char -> Char -> Stream Char -> Char
+ Data.JSString.Internal.Fusion.Common: foldr1 :: (Char -> Char -> Char) -> Stream Char -> Char
- Data.JSString.Internal.Fusion.Common: map :: Char -> Char -> Stream Char -> Stream Char
+ Data.JSString.Internal.Fusion.Common: map :: (Char -> Char) -> Stream Char -> Stream Char
- Data.JSString.Internal.Fusion.Common: scanl :: Char -> Char -> Char -> Char -> Stream Char -> Stream Char
+ Data.JSString.Internal.Fusion.Common: scanl :: (Char -> Char -> Char) -> Char -> Stream Char -> Stream Char
- Data.JSString.Internal.Fusion.Common: takeWhile :: Char -> Bool -> Stream Char -> Stream Char
+ Data.JSString.Internal.Fusion.Common: takeWhile :: (Char -> Bool) -> Stream Char -> Stream Char
- Data.JSString.Internal.Fusion.Common: unfoldr :: () => a -> Maybe (Char, a) -> a -> Stream Char
+ Data.JSString.Internal.Fusion.Common: unfoldr :: () => (a -> Maybe (Char, a)) -> a -> Stream Char
- Data.JSString.Internal.Fusion.Common: unfoldrNI :: Integral a => a -> b -> Maybe (Char, b) -> b -> Stream Char
+ Data.JSString.Internal.Fusion.Common: unfoldrNI :: Integral a => a -> (b -> Maybe (Char, b)) -> b -> Stream Char
- Data.JSString.Internal.Fusion.Common: zipWith :: () => a -> a -> b -> Stream a -> Stream a -> Stream b
+ Data.JSString.Internal.Fusion.Common: zipWith :: () => (a -> a -> b) -> Stream a -> Stream a -> Stream b
- Data.JSString.Internal.Fusion.Types: [Stream] :: Stream a
+ Data.JSString.Internal.Fusion.Types: [Stream] :: forall a s. () => (s -> Step s a) -> !s -> !Size -> Stream a
- GHCJS.Prim.Internal: JSVal :: (IORef JSValueRef) -> JSVal
+ GHCJS.Prim.Internal: JSVal :: IORef JSValueRef -> JSVal
- Language.Javascript.JSaddle: (!!) :: (MakeObject this) => this -> Int -> JSM JSVal
+ Language.Javascript.JSaddle: (!!) :: MakeObject this => this -> Int -> JSM JSVal
- Language.Javascript.JSaddle: GHCJSPure :: (JSM a) -> GHCJSPure a
+ Language.Javascript.JSaddle: GHCJSPure :: JSM a -> GHCJSPure a
- Language.Javascript.JSaddle: JSContextRef :: Int64 -> UTCTime -> Command -> IO Result -> AsyncCommand -> IO () -> Object -> JSCallAsFunction -> IO () -> TVar JSValueRef -> Bool -> IO () -> MVar (Set Text) -> MVar [Double -> JSM ()] -> MVar (Set Int64) -> JSContextRef
+ Language.Javascript.JSaddle: JSContextRef :: Int64 -> UTCTime -> (Command -> IO Result) -> (AsyncCommand -> IO ()) -> (Object -> JSCallAsFunction -> IO ()) -> TVar JSValueRef -> (Bool -> IO ()) -> MVar (Set Text) -> MVar [Double -> JSM ()] -> MVar (Set Int64) -> JSContextRef
- Language.Javascript.JSaddle: JSVal :: (IORef JSValueRef) -> JSVal
+ Language.Javascript.JSaddle: JSVal :: IORef JSValueRef -> JSVal
- Language.Javascript.JSaddle: bracket :: MonadMask m => m a -> a -> m b -> a -> m c -> m c
+ Language.Javascript.JSaddle: bracket :: MonadMask m => m a -> (a -> m c) -> (a -> m b) -> m b
- Language.Javascript.JSaddle: catch :: (MonadCatch m, Exception e) => m a -> e -> m a -> m a
+ Language.Javascript.JSaddle: catch :: (MonadCatch m, Exception e) => m a -> (e -> m a) -> m a
- Language.Javascript.JSaddle: eval :: (ToJSString script) => script -> JSM JSVal
+ Language.Javascript.JSaddle: eval :: ToJSString script => script -> JSM JSVal
- Language.Javascript.JSaddle: js0 :: (ToJSString name) => name -> JSF
+ Language.Javascript.JSaddle: js0 :: ToJSString name => name -> JSF
- Language.Javascript.JSaddle: jsg0 :: (ToJSString name) => name -> JSM JSVal
+ Language.Javascript.JSaddle: jsg0 :: ToJSString name => name -> JSM JSVal
- Language.Javascript.JSaddle: objSetPropertyAtIndex :: (ToJSVal val) => Object -> Int -> val -> JSM ()
+ Language.Javascript.JSaddle: objSetPropertyAtIndex :: ToJSVal val => Object -> Int -> val -> JSM ()
- Language.Javascript.JSaddle: 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.
+ Language.Javascript.JSaddle: 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."
- Language.Javascript.JSaddle: 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.
+ Language.Javascript.JSaddle: 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."
- Language.Javascript.JSaddle.Evaluate: eval :: (ToJSString script) => script -> JSM JSVal
+ Language.Javascript.JSaddle.Evaluate: eval :: ToJSString script => script -> JSM JSVal
- Language.Javascript.JSaddle.Monad: bracket :: MonadMask m => m a -> a -> m b -> a -> m c -> m c
+ Language.Javascript.JSaddle.Monad: bracket :: MonadMask m => m a -> (a -> m c) -> (a -> m b) -> m b
- Language.Javascript.JSaddle.Monad: catch :: (MonadCatch m, Exception e) => m a -> e -> m a -> m a
+ Language.Javascript.JSaddle.Monad: catch :: (MonadCatch m, Exception e) => m a -> (e -> m a) -> m a
- Language.Javascript.JSaddle.Object: (!!) :: (MakeObject this) => this -> Int -> JSM JSVal
+ Language.Javascript.JSaddle.Object: (!!) :: MakeObject this => this -> Int -> JSM JSVal
- Language.Javascript.JSaddle.Object: js0 :: (ToJSString name) => name -> JSF
+ Language.Javascript.JSaddle.Object: js0 :: ToJSString name => name -> JSF
- Language.Javascript.JSaddle.Object: jsg0 :: (ToJSString name) => name -> JSM JSVal
+ Language.Javascript.JSaddle.Object: jsg0 :: ToJSString name => name -> JSM JSVal
- Language.Javascript.JSaddle.Object: 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.
+ Language.Javascript.JSaddle.Object: 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."
- Language.Javascript.JSaddle.Properties: objSetPropertyAtIndex :: (ToJSVal val) => Object -> Int -> val -> JSM ()
+ Language.Javascript.JSaddle.Properties: objSetPropertyAtIndex :: ToJSVal val => Object -> Int -> val -> JSM ()
- Language.Javascript.JSaddle.Types: GHCJSPure :: (JSM a) -> GHCJSPure a
+ Language.Javascript.JSaddle.Types: GHCJSPure :: JSM a -> GHCJSPure a
- Language.Javascript.JSaddle.Types: JSContextRef :: Int64 -> UTCTime -> Command -> IO Result -> AsyncCommand -> IO () -> Object -> JSCallAsFunction -> IO () -> TVar JSValueRef -> Bool -> IO () -> MVar (Set Text) -> MVar [Double -> JSM ()] -> MVar (Set Int64) -> JSContextRef
+ Language.Javascript.JSaddle.Types: JSContextRef :: Int64 -> UTCTime -> (Command -> IO Result) -> (AsyncCommand -> IO ()) -> (Object -> JSCallAsFunction -> IO ()) -> TVar JSValueRef -> (Bool -> IO ()) -> MVar (Set Text) -> MVar [Double -> JSM ()] -> MVar (Set Int64) -> JSContextRef
- Language.Javascript.JSaddle.Types: JSVal :: (IORef JSValueRef) -> JSVal
+ Language.Javascript.JSaddle.Types: JSVal :: IORef JSValueRef -> JSVal
- Language.Javascript.JSaddle.Types: 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.
+ Language.Javascript.JSaddle.Types: 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."
- Language.Javascript.JSaddle.Value: 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.
+ Language.Javascript.JSaddle.Value: 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."
Files
- jsaddle.cabal +7/−9
- src/Language/Javascript/JSaddle.hs +5/−5
- src/Language/Javascript/JSaddle/Run/Files.hs +0/−36
- src/Language/Javascript/JSaddle/Types.hs +9/−1
jsaddle.cabal view
@@ -1,5 +1,5 @@ name: jsaddle-version: 0.9.5.0+version: 0.9.6.0 cabal-version: >=1.10 build-type: Simple license: MIT@@ -36,7 +36,7 @@ else build-depends: attoparsec >=0.11 && <0.14,- containers >=0.5.6.2 && <0.6,+ containers >=0.5.6.2 && <0.7, deepseq >=1.3 && < 1.5, filepath >=1.4.0.0 && <1.5, ghc-prim,@@ -45,7 +45,7 @@ random >= 1.1 && < 1.2, ref-tf >=0.4.0.1 && <0.5, scientific >=0.3 && <0.4,- stm >=2.4.4 && <2.5,+ stm >=2.4.4 && <2.6, time >=1.5.0.1 && <1.9, unordered-containers >=0.2 && <0.3, vector >=0.10 && <0.13,@@ -107,12 +107,12 @@ Language.Javascript.JSaddle.Value Language.Javascript.JSaddle.Types build-depends:- aeson >=0.8.0.2 && <1.3,- base <5,+ aeson >=0.8.0.2 && <1.5,+ base >=4.9 && <5, base64-bytestring >=1.0.0.1 && <1.1, bytestring >=0.10.6.0 && <0.11,- exceptions >=0.8 && <0.9,- lens >=3.8.5 && <4.17,+ exceptions >=0.8 && <0.11,+ lens >=3.8.5 && <4.18, primitive >=0.6.1.0 && <0.7, text >=1.2.1.3 && <1.3, transformers >=0.4.2.0 && <0.6@@ -123,5 +123,3 @@ cpp-options: -DCHECK_UNCHECKED if flag(call-stacks) || flag(check-unchecked) cpp-options: -DJSADDLE_HAS_CALL_STACK--
src/Language/Javascript/JSaddle.hs view
@@ -9,7 +9,7 @@ -- | 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.+-- drive a small JavaScript helper. ----------------------------------------------------------------------------- module Language.Javascript.JSaddle (@@ -35,10 +35,10 @@ -- -- Where it makes sense code examples are given in two forms. One -- that uses 'eval' to run a purely JavaScript version and one that- -- uses more of the JSaddle EDSL feature being demonstated.+ -- uses more of the JSaddle EDSL feature being demonstrated. -- * Calling Haskell from JavaScript- -- | You can call back into haskell from JavaScript using 'fun' to+ -- | You can call back into Haskell from JavaScript using 'fun' to -- convert a Haskell function in the JSM monad into a javascript -- value. @@ -52,8 +52,8 @@ -- and the server will run the Haskell code. The JSaddle parts will -- be executed by sending commands back to the browser. - -- Although the code JavaScript code is executed in the the strict order- -- set out by the EDSL it done asynchonously to the Haskell code.+ -- Although the JavaScript code is executed in the strict order+ -- set out by the EDSL it is done asynchronously to the Haskell code. -- This improves the performance by reducing the number of round trips -- needed between the Haskell and JavaScript code.
src/Language/Javascript/JSaddle/Run/Files.hs view
@@ -13,7 +13,6 @@ module Language.Javascript.JSaddle.Run.Files ( indexHtml- , jsaddleJs , initState , runBatch , ghcjsHelpers@@ -335,41 +334,6 @@ \ }\n\ \ };\n\ \ runBatch(batch);\n\- \"---- Use this to generate this string for embedding--- sed -e 's|\\|\\\\|g' -e 's|^| \\|' -e 's|$|\\n\\|' -e 's|"|\\"|g' data/jsaddle.js | pbcopy-jsaddleJs :: ByteString-jsaddleJs = "\- \if(typeof global !== \"undefined\") {\n\- \ global.window = global;\n\- \ global.WebSocket = require('ws');\n\- \}\n\- \\n\- \var connect = function() {\n\- \ var wsaddress =\n\- \ typeof window.location === \"undefined\"\n\- \ ? \"ws://localhost:3709/\"\n\- \ : window.location.protocol.replace('http', 'ws')+\"//\"+window.location.hostname+(window.location.port?(\":\"+window.location.port):\"\");\n\- \\n\- \ var ws = new WebSocket(wsaddress);\n\- \\n\- \ ws.onopen = function(e) {\n\- \ " <> initState <> "\- \\n\- \ ws.onmessage = function(e) {\n\- \ var batch = JSON.parse(e.data);\n\- \\n\- \ " <> runBatch (\a -> "ws.send(JSON.stringify(" <> a <> "));") Nothing <> "\- \ };\n\- \ };\n\- \ ws.onerror = function() {\n\- \ setTimeout(connect, 1000);\n\- \ };\n\- \}\n\- \\n\- \ " <> ghcjsHelpers <> "\- \connect();\n\ \" ghcjsHelpers :: ByteString
src/Language/Javascript/JSaddle/Types.hs view
@@ -124,6 +124,7 @@ (defaultOptions, genericToEncoding, ToJSON(..), FromJSON(..), Value) import GHC.Generics (Generic) import Control.Monad.IO.Unlift (MonadUnliftIO)+import qualified Control.Monad.Fail as Fail #endif #if MIN_VERSION_base(4,9,0) && defined(CHECK_UNCHECKED)@@ -165,7 +166,7 @@ type JSM = IO #else newtype JSM a = JSM { unJSM :: ReaderT JSContextRef IO a }- deriving (Functor, Applicative, Monad, MonadIO, MonadFix, MonadThrow, MonadUnliftIO)+ deriving (Functor, Applicative, Monad, MonadIO, MonadFix, MonadThrow, MonadUnliftIO, Fail.MonadFail) instance MonadCatch JSM where t `catch` c = JSM (unJSM (syncAfter t) `catch` \e -> unJSM (c e))@@ -178,6 +179,13 @@ JSM $ uninterruptibleMask $ \unmask -> unJSM (a $ q unmask) where q :: (ReaderT JSContextRef IO a -> ReaderT JSContextRef IO a) -> JSM a -> JSM a q unmask (JSM b) = syncAfter . JSM $ unmask b+#if MIN_VERSION_exceptions(0,9,0)+ generalBracket acquire release use =+ JSM $ generalBracket+ (unJSM acquire)+ (\resource exitCase -> unJSM $ release resource exitCase)+ (unJSM . syncAfter . use)+#endif #endif