on master help sign in
Use ghcjs-base types. Add maybeNullOrUndefined.
commit0dcf7e11ad6c5354302b7c30da3ffb1c61040972 authorHamish Mackenzie <Hamish.K.Mackenzie@googlemail.com> dateMon 16 Nov 2015, 02:41 (11 years ago) parent4c3bedd
11 files changed+357−317
src/Language/Javascript/JSaddle/Arguments.hs+43−43 src/Language/Javascript/JSaddle/Classes.hs+13−13 src/Language/Javascript/JSaddle/Evaluate.hs+12−12 src/Language/Javascript/JSaddle/Exception.hs+3−3 src/Language/Javascript/JSaddle/Monad.hs+3−3 src/Language/Javascript/JSaddle/Object.hs+83−83 src/Language/Javascript/JSaddle/Properties.hs+26−26 src/Language/Javascript/JSaddle/String.hs+15−15 src/Language/Javascript/JSaddle/Types.hs+9−8 src/Language/Javascript/JSaddle/Value.hs+147−108 tests/TestJSaddle.hs+3−3
src/Language/Javascript/JSaddle/Arguments.hs+43−43
@@ -13,64 +13,64 @@
1313-----------------------------------------------------------------------------
1414
1515module Language.Javascript.JSaddle.Arguments (
16− MakeArgRefs(..)
16+ MakeArgs(..)
1717) where
1818
1919import Language.Javascript.JSaddle.Classes
20− (MakeValueRef(..), MakeValueRef, MakeArgRefs(..), MakeArgRefs)
20+ (MakeVal(..), MakeArgs(..))
2121import Language.Javascript.JSaddle.Monad (JSM)
2222
23−instance MakeArgRefs arg => MakeArgRefs (JSM arg) where
24− makeArgRefs arg = arg >>= makeArgRefs
25− {-# INLINE makeArgRefs #-}
23+instance MakeArgs arg => MakeArgs (JSM arg) where
24+ makeArgs arg = arg >>= makeArgs
25+ {-# INLINE makeArgs #-}
2626
27−instance MakeValueRef arg => MakeArgRefs [arg] where
28− makeArgRefs = mapM makeValueRef
29− {-# INLINE makeArgRefs #-}
27+instance MakeVal arg => MakeArgs [arg] where
28+ makeArgs = mapM makeVal
29+ {-# INLINE makeArgs #-}
3030
31−instance (MakeValueRef arg1, MakeValueRef arg2) => MakeArgRefs (arg1, arg2) where
32− makeArgRefs (arg1, arg2) = do
33− rarg1 <- makeValueRef arg1
34− rarg2 <- makeValueRef arg2
31+instance (MakeVal arg1, MakeVal arg2) => MakeArgs (arg1, arg2) where
32+ makeArgs (arg1, arg2) = do
33+ rarg1 <- makeVal arg1
34+ rarg2 <- makeVal arg2
3535 return [rarg1, rarg2]
36− {-# INLINE makeArgRefs #-}
36+ {-# INLINE makeArgs #-}
3737
38−instance (MakeValueRef arg1, MakeValueRef arg2, MakeValueRef arg3) => MakeArgRefs (arg1, arg2, arg3) where
39− makeArgRefs (arg1, arg2, arg3) = do
40− rarg1 <- makeValueRef arg1
41− rarg2 <- makeValueRef arg2
42− rarg3 <- makeValueRef arg3
38+instance (MakeVal arg1, MakeVal arg2, MakeVal arg3) => MakeArgs (arg1, arg2, arg3) where
39+ makeArgs (arg1, arg2, arg3) = do
40+ rarg1 <- makeVal arg1
41+ rarg2 <- makeVal arg2
42+ rarg3 <- makeVal arg3
4343 return [rarg1, rarg2, rarg3]
44− {-# INLINE makeArgRefs #-}
44+ {-# INLINE makeArgs #-}
4545
46−instance (MakeValueRef arg1, MakeValueRef arg2, MakeValueRef arg3, MakeValueRef arg4) => MakeArgRefs (arg1, arg2, arg3, arg4) where
47− makeArgRefs (arg1, arg2, arg3, arg4) = do
48− rarg1 <- makeValueRef arg1
49− rarg2 <- makeValueRef arg2
50− rarg3 <- makeValueRef arg3
51− rarg4 <- makeValueRef arg4
46+instance (MakeVal arg1, MakeVal arg2, MakeVal arg3, MakeVal arg4) => MakeArgs (arg1, arg2, arg3, arg4) where
47+ makeArgs (arg1, arg2, arg3, arg4) = do
48+ rarg1 <- makeVal arg1
49+ rarg2 <- makeVal arg2
50+ rarg3 <- makeVal arg3
51+ rarg4 <- makeVal arg4
5252 return [rarg1, rarg2, rarg3, rarg4]
53− {-# INLINE makeArgRefs #-}
53+ {-# INLINE makeArgs #-}
5454
55−instance (MakeValueRef arg1, MakeValueRef arg2, MakeValueRef arg3, MakeValueRef arg4, MakeValueRef arg5) => MakeArgRefs (arg1, arg2, arg3, arg4, arg5) where
56− makeArgRefs (arg1, arg2, arg3, arg4, arg5) = do
57− rarg1 <- makeValueRef arg1
58− rarg2 <- makeValueRef arg2
59− rarg3 <- makeValueRef arg3
60− rarg4 <- makeValueRef arg4
61− rarg5 <- makeValueRef arg5
55+instance (MakeVal arg1, MakeVal arg2, MakeVal arg3, MakeVal arg4, MakeVal arg5) => MakeArgs (arg1, arg2, arg3, arg4, arg5) where
56+ makeArgs (arg1, arg2, arg3, arg4, arg5) = do
57+ rarg1 <- makeVal arg1
58+ rarg2 <- makeVal arg2
59+ rarg3 <- makeVal arg3
60+ rarg4 <- makeVal arg4
61+ rarg5 <- makeVal arg5
6262 return [rarg1, rarg2, rarg3, rarg4, rarg5]
63− {-# INLINE makeArgRefs #-}
63+ {-# INLINE makeArgs #-}
6464
6565
66−instance (MakeValueRef arg1, MakeValueRef arg2, MakeValueRef arg3, MakeValueRef arg4, MakeValueRef arg5, MakeValueRef arg6) => MakeArgRefs (arg1, arg2, arg3, arg4, arg5, arg6) where
67− makeArgRefs (arg1, arg2, arg3, arg4, arg5, arg6) = do
68− rarg1 <- makeValueRef arg1
69− rarg2 <- makeValueRef arg2
70− rarg3 <- makeValueRef arg3
71− rarg4 <- makeValueRef arg4
72− rarg5 <- makeValueRef arg5
73− rarg6 <- makeValueRef arg6
66+instance (MakeVal arg1, MakeVal arg2, MakeVal arg3, MakeVal arg4, MakeVal arg5, MakeVal arg6) => MakeArgs (arg1, arg2, arg3, arg4, arg5, arg6) where
67+ makeArgs (arg1, arg2, arg3, arg4, arg5, arg6) = do
68+ rarg1 <- makeVal arg1
69+ rarg2 <- makeVal arg2
70+ rarg3 <- makeVal arg3
71+ rarg4 <- makeVal arg4
72+ rarg5 <- makeVal arg5
73+ rarg6 <- makeVal arg6
7474 return [rarg1, rarg2, rarg3, rarg4, rarg5, rarg6]
75− {-# INLINE makeArgRefs #-}
75+ {-# INLINE makeArgs #-}
7676
src/Language/Javascript/JSaddle/Classes.hs+13−13
@@ -14,34 +14,34 @@
1414
1515module Language.Javascript.JSaddle.Classes (
1616 -- * Type classes to convert Haskell data to JavaScript
17− MakeValueRef(..)
18− , MakeStringRef(..)
19− , MakeArgRefs(..)
17+ MakeVal(..)
18+ , MakeString(..)
19+ , MakeArgs(..)
2020 , MakeObject(..)
2121) where
2222
2323import Control.Monad.IO.Class (MonadIO)
2424import Language.Javascript.JSaddle.Types
25− (Object(..), JSStringRef, JSValueRef)
25+ (Object(..), JSString, JSVal(..))
2626import Language.Javascript.JSaddle.Monad (JSM)
2727
2828-- | Anything that can be used to make a JavaScript value reference
29−class MakeValueRef a where
30− makeValueRef :: a -> JSM JSValueRef
29+class MakeVal a where
30+ makeVal :: a -> JSM JSVal
3131
3232-- | Anything that can be used to make a JavaScript string reference
33−class MakeStringRef a where
34− makeStringRef :: a -> JSStringRef
33+class MakeString a where
34+ makeString :: a -> JSString
3535
3636-- | Anything that can be used to make a list of JavaScript value
3737-- references for use as function arguments
38−class MakeArgRefs this where
39− makeArgRefs :: this -> JSM [JSValueRef]
38+class MakeArgs this where
39+ makeArgs :: this -> JSM [JSVal]
4040
4141-- | Anything that can be used to make a JavaScript object reference
4242class MakeObject this where
4343 makeObject :: this -> JSM Object
4444
45−instance MakeValueRef Object where
46− makeValueRef (Object r) = return r
47− {-# INLINE makeValueRef #-}
45+instance MakeVal Object where
46+ makeVal (Object r) = return r
47+ {-# INLINE makeVal #-}
src/Language/Javascript/JSaddle/Evaluate.hs+12−12
@@ -24,8 +24,8 @@ module Language.Javascript.JSaddle.Evaluate (
2424import Control.Monad.Trans.Reader (ask)
2525import Control.Monad.IO.Class (MonadIO(..))
2626import Language.Javascript.JSaddle.Types
27− (JSStringRef, JSValueRef, Object(..),
28− JSValueRefRef)
27+ (JSString, JSVal, Object(..),
28+ MutableJSArray)
2929#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
3030import GHCJS.Types (nullRef)
3131import GHCJS.Marshal.Pure (pFromJSVal)
@@ -38,7 +38,7 @@ import Language.Javascript.JSaddle.Exception (rethrow)
3838import Language.Javascript.JSaddle.Value ()
3939import Language.Javascript.JSaddle.Object ()
4040import Language.Javascript.JSaddle.Classes
41− (MakeObject(..), MakeStringRef(..))
41+ (MakeObject(..), MakeString(..))
4242import Language.Javascript.JSaddle.Monad (JSM)
4343
4444-- | Evaluates a script (like eval in java script). Unlike 'eval' this function lets you
@@ -46,22 +46,22 @@ import Language.Javascript.JSaddle.Monad (JSM)
4646--
4747-- >>> testJSaddle $ (evaluateScript "\n\n{" global "FileName" 53 >>= valToText) `catch` \(JSException e) -> array (e,e!"sourceURL", e!"line") >>= valToText
4848-- SyntaxError: Expected token '}',FileName,55
49−evaluateScript :: (MakeStringRef script, MakeObject this, MakeStringRef url)
49+evaluateScript :: (MakeString script, MakeObject this, MakeString url)
5050 => script -- ^ JavaScript to evaluate
5151 -> this
5252 -> url
5353 -> Int -- ^ The Line number of the first line of the script
54− -> JSM JSValueRef
54+ -> JSM JSVal
5555#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
56−evaluateScript script this url line = liftIO $ js_eval (makeStringRef script)
56+evaluateScript script this url line = liftIO $ js_eval (makeString script)
5757{-# INLINE evaluateScript #-}
5858foreign import javascript unsafe "$r = eval($1);"
59− js_eval :: JSStringRef -> IO JSValueRef
59+ js_eval :: JSString -> IO JSVal
6060#elif defined(USE_WEBKIT)
6161evaluateScript script this url line = do
6262 gctxt <- ask
6363 (Object thisr) <- makeObject this
64− rethrow $ liftIO . jsevaluatescript gctxt (makeStringRef script) thisr (makeStringRef url) line
64+ rethrow $ liftIO . jsevaluatescript gctxt (makeString script) thisr (makeString url) line
6565{-# INLINE evaluateScript #-}
6666#else
6767evaluateScript = undefined
@@ -71,13 +71,13 @@ evaluateScript = undefined
7171--
7272-- >>> testJSaddle $ eval "1+1"
7373-- 2
74−eval :: MakeStringRef script
74+eval :: MakeString script
7575 => script -- ^ JavaScript to evaluate
76− -> JSM JSValueRef
76+ -> JSM JSVal
7777#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
78−eval script = evaluateScript script (Object nullRef) (pFromJSVal nullRef::JSStringRef) 1
78+eval script = evaluateScript script (Object nullRef) (pFromJSVal nullRef::JSString) 1
7979{-# INLINE eval #-}
8080#else
81−eval script = evaluateScript script (Object nullPtr) (nullPtr::JSStringRef) 1
81+eval script = evaluateScript script (Object nullPtr) (nullPtr::JSString) 1
8282{-# INLINE eval #-}
8383#endif
src/Language/Javascript/JSaddle/Exception.hs+3−3
@@ -18,19 +18,19 @@ module Language.Javascript.JSaddle.Exception (
1818
1919import qualified Control.Exception as E (throwIO, Exception)
2020import Language.Javascript.JSaddle.Types
21− (JSValueRefRef, JSValueRef)
21+ (MutableJSArray, JSVal)
2222import Data.Typeable (Typeable)
2323import Language.Javascript.JSaddle.Monad (catchval, JSM)
2424import Control.Monad.IO.Class (MonadIO(..))
2525import Data.Text (Text)
2626
27−newtype JSException = JSException JSValueRef deriving (Typeable)
27+newtype JSException = JSException JSVal deriving (Typeable)
2828
2929instance Show JSException where show _ = "JSException"
3030instance E.Exception JSException
3131
3232-- | Catch JavaScript exceptions and rethrow Haskell ones
33−rethrow :: (JSValueRefRef -> JSM a) -> JSM a
33+rethrow :: (MutableJSArray -> JSM a) -> JSM a
3434rethrow f = f `catchval` \e ->
3535 liftIO . E.throwIO $ JSException e
3636
src/Language/Javascript/JSaddle/Monad.hs+3−3
@@ -28,7 +28,7 @@ module Language.Javascript.JSaddle.Monad (
2828import Prelude hiding (catch, read)
2929import Control.Monad.Trans.Reader (runReaderT, ask, ReaderT(..))
3030import Language.Javascript.JSaddle.Types
31− (JSValueRefRef(..), JSValueRef(..), JSContextRef)
31+ (JSVal(..), MutableJSArray(..), JSContextRef)
3232import Control.Monad.IO.Class (MonadIO(..))
3333#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
3434import GHCJS.Types (isUndefined, isNull)
@@ -67,9 +67,9 @@ t `catch` c = do
6767 liftIO (runReaderT t r `E.catch` \e -> runReaderT (c e) r)
6868{-# INLINE catch #-}
6969
70−-- | Handle JavaScriptCore functions that take a JSValueRefRef in order
70+-- | Handle JavaScriptCore functions that take a MutableJSArray in order
7171-- to throw exceptions.
72−catchval :: (JSValueRefRef -> JSM a) -> (JSValueRef -> JSM a) -> JSM a
72+catchval :: (MutableJSArray -> JSM a) -> (JSVal -> JSM a) -> JSM a
7373catchval f catcher = do
7474#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
7575 pexc <- liftIO Array.create
src/Language/Javascript/JSaddle/Object.hs+83−83
@@ -86,8 +86,8 @@ module Language.Javascript.JSaddle.Object (
8686
8787import Prelude hiding ((!!))
8888import Language.Javascript.JSaddle.Types
89− (JSPropertyNameArrayRef, JSStringRef, Object(..), JSValueRefRef,
90− JSValueRef, JSContextRef, Index)
89+ (JSPropertyNameArray, JSString, Object(..), MutableJSArray,
90+ JSVal, Index)
9191import Foreign.C.Types (CSize(..), CULong(..), CUInt(..), CULLong(..))
9292#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
9393import GHCJS.Types (nullRef, jsval)
@@ -119,7 +119,7 @@ import Language.Javascript.JSaddle.Exception (rethrow)
119119import Language.Javascript.JSaddle.Value
120120 (JSUndefined, valMakeUndefined, valToObject)
121121import Language.Javascript.JSaddle.Classes
122− (MakeValueRef(..), MakeStringRef(..), MakeArgRefs(..), MakeObject(..))
122+ (MakeVal(..), MakeString(..), MakeArgs(..), MakeObject(..))
123123import Language.Javascript.JSaddle.Monad
124124 (JSM)
125125import Control.Monad.Trans.Reader (runReaderT, ask)
@@ -149,15 +149,15 @@ instance MakeObject v => MakeObject (JSM v) where
149149-- >>> testJSaddle $ eval "'Hello World'.length"
150150-- >>> testJSaddle $ val "Hello World" ! "length"
151151-- 11
152−(!) :: (MakeObject this, MakeStringRef name)
152+(!) :: (MakeObject this, MakeString name)
153153 => this -- ^ Object to look on
154154 -> name -- ^ Name of the property to find
155− -> JSM JSValueRef -- ^ Property reference
155+ -> JSM JSVal -- ^ Property reference
156156this ! name = do
157157 rthis <- makeObject this
158158 rethrow $ objGetPropertyByName rthis rname
159159 where
160− rname = makeStringRef name
160+ rname = makeString name
161161{-# INLINE (!) #-}
162162
163163-- | Lookup a property based on its index.
@@ -168,7 +168,7 @@ this ! name = do
168168(!!) :: (MakeObject this)
169169 => this -- ^ Object to look on
170170 -> Index -- ^ Index of the property to lookup
171− -> JSM JSValueRef -- ^ Property reference
171+ -> JSM JSVal -- ^ Property reference
172172this !! index = do
173173 rthis <- makeObject this
174174 rethrow $ objGetPropertyAtIndex rthis index
@@ -181,9 +181,9 @@ this !! index = do
181181-- >>> testJSaddle $ eval "'Hello World'.length"
182182-- >>> testJSaddle $ val "Hello World" ^. js "length"
183183-- 11
184−js :: (MakeObject s, MakeStringRef name)
184+js :: (MakeObject s, MakeString name)
185185 => name -- ^ Name of the property to find
186− -> IndexPreservingGetter s (JSM JSValueRef)
186+ -> IndexPreservingGetter s (JSM JSVal)
187187js name = to (!name)
188188{-# INLINE js #-}
189189
@@ -194,7 +194,7 @@ js name = to (!name)
194194-- >>> testJSaddle $ eval "'Hello World'.length"
195195-- >>> testJSaddle $ val "Hello World" ^. js "length"
196196-- 11
197−jss :: (MakeStringRef name, MakeValueRef val)
197+jss :: (MakeString name, MakeVal val)
198198 => name -- ^ Name of the property to find
199199 -> val
200200 -> forall o . MakeObject o => IndexPreservingGetter o (JSM ())
@@ -207,12 +207,12 @@ jss name val = to (\o -> o <# name $ val)
207207--
208208-- >>> testJSaddle $ val "Hello World" ^. jsf "indexOf" ["World"]
209209-- 6
210−jsf :: (MakeStringRef name, MakeArgRefs args) => name -> args -> JSF
210+jsf :: (MakeString name, MakeArgs args) => name -> args -> JSF
211211jsf name args = to (\o -> o # name $ args)
212212{-# INLINE jsf #-}
213213
214214-- | Java script function applications have this type
215−type JSF = forall o . MakeObject o => IndexPreservingGetter o (JSM JSValueRef)
215+type JSF = forall o . MakeObject o => IndexPreservingGetter o (JSM JSVal)
216216
217217-- | Handy way to call a function that expects no arguments
218218--
@@ -220,7 +220,7 @@ type JSF = forall o . MakeObject o => IndexPreservingGetter o (JSM JSValueRef)
220220--
221221-- >>> testJSaddle $ val "Hello World" ^. js0 "toLowerCase"
222222-- hello world
223−js0 :: (MakeStringRef name) => name -> JSF
223+js0 :: (MakeString name) => name -> JSF
224224js0 name = jsf name ()
225225{-# INLINE js0 #-}
226226
@@ -230,31 +230,31 @@ js0 name = jsf name ()
230230--
231231-- >>> testJSaddle $ val "Hello World" ^. js1 "indexOf" "World"
232232-- 6
233−js1 :: (MakeStringRef name, MakeValueRef a0) => name -> a0 -> JSF
233+js1 :: (MakeString name, MakeVal a0) => name -> a0 -> JSF
234234js1 name a0 = jsf name [a0]
235235{-# INLINE js1 #-}
236236
237237-- | Handy way to call a function that expects two arguments
238−js2 :: (MakeStringRef name, MakeValueRef a0, MakeValueRef a1) => name -> a0 -> a1 -> JSF
238+js2 :: (MakeString name, MakeVal a0, MakeVal a1) => name -> a0 -> a1 -> JSF
239239js2 name a0 a1 = jsf name (a0, a1)
240240{-# INLINE js2 #-}
241241
242242-- | Handy way to call a function that expects three arguments
243−js3 :: (MakeStringRef name, MakeValueRef a0, MakeValueRef a1, MakeValueRef a2)
243+js3 :: (MakeString name, MakeVal a0, MakeVal a1, MakeVal a2)
244244 => name -> a0 -> a1 -> a2 -> JSF
245245js3 name a0 a1 a2 = jsf name (a0, a1, a2)
246246{-# INLINE js3 #-}
247247
248248-- | Handy way to call a function that expects four arguments
249−js4 :: (MakeStringRef name, MakeValueRef a0, MakeValueRef a1, MakeValueRef a2,
250− MakeValueRef a3)
249+js4 :: (MakeString name, MakeVal a0, MakeVal a1, MakeVal a2,
250+ MakeVal a3)
251251 => name -> a0 -> a1 -> a2 -> a3 -> JSF
252252js4 name a0 a1 a2 a3 = jsf name (a0, a1, a2, a3)
253253{-# INLINE js4 #-}
254254
255255-- | Handy way to call a function that expects five arguments
256−js5 :: (MakeStringRef name, MakeValueRef a0, MakeValueRef a1, MakeValueRef a2,
257− MakeValueRef a3, MakeValueRef a4)
256+js5 :: (MakeString name, MakeVal a0, MakeVal a1, MakeVal a2,
257+ MakeVal a3, MakeVal a4)
258258 => name -> a0 -> a1 -> a2 -> a3 -> a4 -> JSF
259259js5 name a0 a1 a2 a3 a4 = jsf name (a0, a1, a2, a3, a4)
260260{-# INLINE js5 #-}
@@ -265,7 +265,7 @@ js5 name a0 a1 a2 a3 a4 = jsf name (a0, a1, a2, a3, a4)
265265-- >>> testJSaddle $ eval "w = console; w.log('Hello World')"
266266-- >>> testJSaddle $ do w <- jsg "console"; w ^. js "log" # ["Hello World"]
267267-- 11
268−jsg :: MakeStringRef a => a -> JSM JSValueRef
268+jsg :: MakeString a => a -> JSM JSVal
269269jsg name = global ! name
270270{-# INLINE jsg #-}
271271
@@ -275,7 +275,7 @@ jsg name = global ! name
275275--
276276-- >>> testJSaddle $ jsf "globalFunc" ["World"]
277277-- 6
278−jsgf :: (MakeStringRef name, MakeArgRefs args) => name -> args -> JSM JSValueRef
278+jsgf :: (MakeString name, MakeArgs args) => name -> args -> JSM JSVal
279279jsgf name = global # name
280280{-# INLINE jsgf #-}
281281
@@ -285,7 +285,7 @@ jsgf name = global # name
285285--
286286-- >>> testJSaddle $ js0 "globalFunc"
287287-- hello world
288−jsg0 :: (MakeStringRef name) => name -> JSM JSValueRef
288+jsg0 :: (MakeString name) => name -> JSM JSVal
289289jsg0 name = jsgf name ()
290290{-# INLINE jsg0 #-}
291291
@@ -295,32 +295,32 @@ jsg0 name = jsgf name ()
295295--
296296-- >>> testJSaddle $ jsg1 "globalFunc" "World"
297297-- 6
298−jsg1 :: (MakeStringRef name, MakeValueRef a0) => name -> a0 -> JSM JSValueRef
298+jsg1 :: (MakeString name, MakeVal a0) => name -> a0 -> JSM JSVal
299299jsg1 name a0 = jsgf name [a0]
300300{-# INLINE jsg1 #-}
301301
302302-- | Handy way to call a function that expects two arguments
303−jsg2 :: (MakeStringRef name, MakeValueRef a0, MakeValueRef a1) => name -> a0 -> a1 -> JSM JSValueRef
303+jsg2 :: (MakeString name, MakeVal a0, MakeVal a1) => name -> a0 -> a1 -> JSM JSVal
304304jsg2 name a0 a1 = jsgf name (a0, a1)
305305{-# INLINE jsg2 #-}
306306
307307-- | Handy way to call a function that expects three arguments
308−jsg3 :: (MakeStringRef name, MakeValueRef a0, MakeValueRef a1, MakeValueRef a2)
309− => name -> a0 -> a1 -> a2 -> JSM JSValueRef
308+jsg3 :: (MakeString name, MakeVal a0, MakeVal a1, MakeVal a2)
309+ => name -> a0 -> a1 -> a2 -> JSM JSVal
310310jsg3 name a0 a1 a2 = jsgf name (a0, a1, a2)
311311{-# INLINE jsg3 #-}
312312
313313-- | Handy way to call a function that expects four arguments
314−jsg4 :: (MakeStringRef name, MakeValueRef a0, MakeValueRef a1, MakeValueRef a2,
315− MakeValueRef a3)
316− => name -> a0 -> a1 -> a2 -> a3 -> JSM JSValueRef
314+jsg4 :: (MakeString name, MakeVal a0, MakeVal a1, MakeVal a2,
315+ MakeVal a3)
316+ => name -> a0 -> a1 -> a2 -> a3 -> JSM JSVal
317317jsg4 name a0 a1 a2 a3 = jsgf name (a0, a1, a2, a3)
318318{-# INLINE jsg4 #-}
319319
320320-- | Handy way to call a function that expects five arguments
321−jsg5 :: (MakeStringRef name, MakeValueRef a0, MakeValueRef a1, MakeValueRef a2,
322− MakeValueRef a3, MakeValueRef a4)
323− => name -> a0 -> a1 -> a2 -> a3 -> a4 -> JSM JSValueRef
321+jsg5 :: (MakeString name, MakeVal a0, MakeVal a1, MakeVal a2,
322+ MakeVal a3, MakeVal a4)
323+ => name -> a0 -> a1 -> a2 -> a3 -> a4 -> JSM JSVal
324324jsg5 name a0 a1 a2 a3 a4 = jsgf name (a0, a1, a2, a3, a4)
325325{-# INLINE jsg5 #-}
326326
@@ -330,8 +330,8 @@ jsg5 name a0 a1 a2 a3 a4 = jsgf name (a0, a1, a2, a3, a4)
330330-- >>> testJSaddle $ val "Hello World" # "indexOf" $ ["World"]
331331-- 6
332332infixr 2 #
333−(#) :: (MakeObject this, MakeStringRef name, MakeArgRefs args)
334− => this -> name -> args -> JSM JSValueRef
333+(#) :: (MakeObject this, MakeString name, MakeArgs args)
334+ => this -> name -> args -> JSM JSVal
335335(#) this name args = do
336336 rthis <- makeObject this
337337 f <- rethrow $ objGetPropertyByName rthis name
@@ -344,8 +344,8 @@ infixr 2 #
344344-- >>> testJSaddle $ eval "something[6]('World')"
345345-- >>> testJSaddle $ val something ## 6 ["World"]
346346infixr 2 ##
347−(##) :: (MakeObject this, MakeArgRefs args)
348− => this -> Index -> args -> JSM JSValueRef
347+(##) :: (MakeObject this, MakeArgs args)
348+ => this -> Index -> args -> JSM JSVal
349349(##) this index args = do
350350 rthis <- makeObject this
351351 f <- rethrow $ objGetPropertyAtIndex rthis index
@@ -359,7 +359,7 @@ infixr 2 ##
359359-- >>> testJSaddle $ do {j <- eval "({})"; j <# "x" 1; j!"x"}
360360-- 1
361361infixr 1 <#
362−(<#) :: (MakeObject this, MakeStringRef name, MakeValueRef val)
362+(<#) :: (MakeObject this, MakeString name, MakeVal val)
363363 => this -- ^ Object to set the property on
364364 -> name -- ^ Name of the property to set
365365 -> val -- ^ Value to set it to
@@ -375,7 +375,7 @@ infixr 1 <#
375375-- >>> testJSaddle $ do {j <- eval "({})"; j <## 6 1; j!!6}
376376-- 1
377377infixr 1 <##
378−(<##) :: (MakeObject this, MakeValueRef val)
378+(<##) :: (MakeObject this, MakeVal val)
379379 => this -- ^ Object to set the property on
380380 -> Index -- ^ Index of the property to set
381381 -> val -- ^ Value to set it to
@@ -392,10 +392,10 @@ infixr 1 <##
392392--
393393-- >>> testJSaddle $ new "Date" (2013, 1, 1)
394394-- Fri Feb 01 2013 00:00:00 GMT+1300 (NZDT)
395−new :: (MakeObject constructor, MakeArgRefs args)
395+new :: (MakeObject constructor, MakeArgs args)
396396 => constructor
397397 -> args
398− -> JSM JSValueRef
398+ -> JSM JSVal
399399new constructor args = do
400400 f <- makeObject constructor
401401 rethrow $ objCallAsConstructor f args
@@ -406,8 +406,8 @@ new constructor args = do
406406-- >>> testJSaddle $ eval "(function(){return this;}).apply('Hello', [])"
407407-- >>> testJSaddle $ do { test <- eval "(function(){return this;})"; call test (val "Hello") () }
408408-- Hello
409−call :: (MakeObject function, MakeObject this, MakeArgRefs args)
410− => function -> this -> args -> JSM JSValueRef
409+call :: (MakeObject function, MakeObject this, MakeArgs args)
410+ => function -> this -> args -> JSM JSVal
411411call function this args = do
412412 rfunction <- makeObject function
413413 rthis <- makeObject this
@@ -430,9 +430,9 @@ obj = do
430430{-# INLINE obj #-}
431431
432432-- | Type used for Haskell functions called from JavaScript.
433−type JSCallAsFunction = JSValueRef -- ^ Function object
434− -> JSValueRef -- ^ this
435− -> [JSValueRef] -- ^ Function arguments
433+type JSCallAsFunction = JSVal -- ^ Function object
434+ -> JSVal -- ^ this
435+ -> [JSVal] -- ^ Function arguments
436436 -> JSM JSUndefined -- ^ Only 'JSUndefined' can be returned because
437437 -- the function may need to be executed in a
438438 -- different thread. If you need to get a
@@ -456,7 +456,7 @@ foreign import ccall "wrapper"
456456#endif
457457
458458-- ^ Make a JavaScript function object that wraps a Haskell function.
459−function :: MakeStringRef name
459+function :: MakeString name
460460 => name -- ^ Name of the function
461461 -> JSCallAsFunction -- ^ Haskell function to call
462462 -> JSM Object -- ^ Returns a JavaScript function object that will
@@ -466,21 +466,21 @@ function name f = liftIO $ do
466466 callback <- syncCallback2 ContinueAsync $ \this args -> do
467467 rargs <- Array.toListIO (coerce args)
468468 runReaderT (f this this rargs) () -- TODO pass function object through
469− makeFunctionWithCallback (makeStringRef name) callback
469+ makeFunctionWithCallback (makeString name) callback
470470foreign import javascript unsafe "$r = function () { $2(this, arguments); }"
471− makeFunctionWithCallback :: JSStringRef -> Callback (JSValueRef -> JSValueRef -> IO ()) -> IO Object
471+ makeFunctionWithCallback :: JSString -> Callback (JSVal -> JSVal -> IO ()) -> IO Object
472472#elif defined(USE_WEBKIT)
473473function name f = do
474474 gctxt <- ask
475475 callback <- liftIO $ mkJSObjectCallAsFunctionCallback wrap
476− liftIO $ Object <$> jsobjectmakefunctionwithcallback gctxt (makeStringRef name) callback
476+ liftIO $ Object <$> jsobjectmakefunctionwithcallback gctxt (makeString name) callback
477477 where
478478 wrap ctx fobj this argc argv exception = do
479479 args <- peekArray (fromIntegral argc) argv
480480 (`runReaderT` ctx) $
481− f fobj this args >>= makeValueRef
481+ f fobj this args >>= makeVal
482482 `E.catch` \(e :: SomeException) -> do
483− str <- runReaderT (makeValueRef . T.pack $ show e) ctx
483+ str <- runReaderT (makeVal . T.pack $ show e) ctx
484484 poke exception str
485485 jsvaluemakeundefined ctx
486486#else
@@ -490,33 +490,33 @@ function = undefined
490490-- | A callback to Haskell can be used as a JavaScript value. This will create
491491-- an anonymous JavaScript function object. Use 'function' to create one with
492492-- a name.
493−instance MakeValueRef JSCallAsFunction where
493+instance MakeVal JSCallAsFunction where
494494#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
495− makeValueRef f = jsval <$> function (pFromJSVal nullRef :: JSStringRef) f
495+ makeVal f = jsval <$> function (pFromJSVal nullRef :: JSString) f
496496#else
497− makeValueRef f = function (nullPtr :: JSStringRef) f >>= makeValueRef
497+ makeVal f = function (nullPtr :: JSString) f >>= makeVal
498498#endif
499− {-# INLINE makeValueRef #-}
499+ {-# INLINE makeVal #-}
500500
501−instance MakeArgRefs JSCallAsFunction where
502− makeArgRefs f = do
501+instance MakeArgs JSCallAsFunction where
502+ makeArgs f = do
503503#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
504− rarg <- jsval <$> function (pFromJSVal nullRef :: JSStringRef) f
504+ rarg <- jsval <$> function (pFromJSVal nullRef :: JSString) f
505505#else
506− rarg <- function (nullPtr:: JSStringRef) f >>= makeValueRef
506+ rarg <- function (nullPtr:: JSString) f >>= makeVal
507507#endif
508508 return [rarg]
509− {-# INLINE makeArgRefs #-}
509+ {-# INLINE makeArgs #-}
510510
511−makeArray :: MakeArgRefs args => args -> JSValueRefRef -> JSM Object
511+makeArray :: MakeArgs args => args -> MutableJSArray -> JSM Object
512512#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
513513makeArray args exceptions = do
514− rargs <- makeArgRefs args
514+ rargs <- makeArgs args
515515 liftIO $ Object . jsval <$> Array.fromListIO rargs
516516#else
517517makeArray args exceptions = do
518518 gctxt <- ask
519− rargs <- makeArgRefs args
519+ rargs <- makeArgs args
520520 liftIO $ withArrayLen rargs $ \ len ptr ->
521521 Object <$> jsobjectmakearray gctxt (fromIntegral len) ptr exceptions
522522#endif
@@ -530,7 +530,7 @@ makeArray args exceptions = do
530530-- >>> testJSaddle $ eval "['Hello', null, undefined, true, 1]"
531531-- >>> testJSaddle $ array ("Hello", JSNull, (), True, 1.0::Double)
532532-- Hello,,,true,1
533−array :: MakeArgRefs args => args -> JSM Object
533+array :: MakeArgs args => args -> JSM Object
534534array = rethrow . makeArray
535535
536536-- | JavaScript's global object
@@ -549,7 +549,7 @@ global = undefined
549549
550550-- | Get an array containing the property names present on a given object
551551#if (!defined(ghcjs_HOST_OS) || !defined(USE_JAVASCRIPTFFI)) && defined(USE_WEBKIT)
552−copyPropertyNames :: MakeObject this => this -> JSM JSPropertyNameArrayRef
552+copyPropertyNames :: MakeObject this => this -> JSM JSPropertyNameArray
553553copyPropertyNames this = do
554554 gctxt <- ask
555555 Object rthis <- makeObject this
@@ -557,17 +557,17 @@ copyPropertyNames this = do
557557{-# INLINE copyPropertyNames #-}
558558
559559-- | Get the number of names in a property name array
560−propertyNamesCount :: MonadIO m => JSPropertyNameArrayRef -> m CSize
560+propertyNamesCount :: MonadIO m => JSPropertyNameArray -> m CSize
561561propertyNamesCount names = liftIO $ jspropertynamearraygetcount names
562562{-# INLINE propertyNamesCount #-}
563563
564564-- | Get a name out of a property name array
565−propertyNamesAt :: MonadIO m => JSPropertyNameArrayRef -> CSize -> m JSStringRef
565+propertyNamesAt :: MonadIO m => JSPropertyNameArray -> CSize -> m JSString
566566propertyNamesAt names index = liftIO $ jspropertynamearraygetnameatindex names index
567567{-# INLINE propertyNamesAt #-}
568568
569569-- | Convert property array to a list
570−propertyNamesList :: MonadIO m => JSPropertyNameArrayRef -> m [JSStringRef]
570+propertyNamesList :: MonadIO m => JSPropertyNameArray -> m [JSString]
571571propertyNamesList names = do
572572 count <- propertyNamesCount names
573573 mapM (propertyNamesAt names) $ enumFromTo 0 (count - 1)
@@ -575,7 +575,7 @@ propertyNamesList names = do
575575#endif
576576
577577-- | Get a list containing the property names present on a given object
578−propertyNames :: MakeObject this => this -> JSM [JSStringRef]
578+propertyNames :: MakeObject this => this -> JSM [JSString]
579579#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
580580propertyNames this = makeObject this >>= liftIO . js_propertyNames >>= liftIO . (fmap (map pFromJSVal)) . Array.toListIO
581581{-# INLINE propertyNames #-}
@@ -589,27 +589,27 @@ propertyNames = undefined
589589#endif
590590
591591-- | Get a list containing references to all the properties present on a given object
592−properties :: MakeObject this => this -> JSM [JSValueRef]
592+properties :: MakeObject this => this -> JSM [JSVal]
593593properties this = propertyNames this >>= mapM (this !)
594594
595595-- | Call a JavaScript object as function. Consider using '#'.
596−objCallAsFunction :: MakeArgRefs args
596+objCallAsFunction :: MakeArgs args
597597 => Object
598598 -> Object
599599 -> args
600− -> JSValueRefRef
601− -> JSM JSValueRef
600+ -> MutableJSArray
601+ -> JSM JSVal
602602#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
603603objCallAsFunction function this args exceptions = do
604− rargs <- makeArgRefs args >>= liftIO . Array.fromListIO
604+ rargs <- makeArgs args >>= liftIO . Array.fromListIO
605605 liftIO $ js_apply function this rargs exceptions
606606{-# INLINE objCallAsFunction #-}
607607foreign import javascript unsafe "try { $r = $1.apply($2, $3) } catch(e) { $4[0] = e }"
608− js_apply :: Object -> Object -> JSValueRefRef -> JSValueRefRef -> IO JSValueRef
608+ js_apply :: Object -> Object -> MutableJSArray -> MutableJSArray -> IO JSVal
609609#elif defined(USE_WEBKIT)
610610objCallAsFunction (Object function) (Object this) args exceptions = do
611611 gctxt <- ask
612− rargs <- makeArgRefs args
612+ rargs <- makeArgs args
613613 liftIO $ withArrayLen rargs $ \ largs pargs ->
614614 jsobjectcallasfunction gctxt function this (fromIntegral largs) pargs exceptions
615615{-# INLINE objCallAsFunction #-}
@@ -621,14 +621,14 @@ objCallAsFunction = undefined
621621--
622622-- If you pass more than 7 arguments to a constructor for a built in
623623-- JavaScript type (like Date) then this function will fail.
624−objCallAsConstructor :: MakeArgRefs args
624+objCallAsConstructor :: MakeArgs args
625625 => Object
626626 -> args
627− -> JSValueRefRef
628− -> JSM JSValueRef
627+ -> MutableJSArray
628+ -> JSM JSVal
629629#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
630630objCallAsConstructor function args exceptions = do
631− rargs <- makeArgRefs args >>= liftIO . Array.fromListIO
631+ rargs <- makeArgs args >>= liftIO . Array.fromListIO
632632 liftIO $ js_new function rargs exceptions
633633foreign import javascript unsafe "\
634634 try {\
@@ -657,11 +657,11 @@ foreign import javascript unsafe "\
657657 catch(e) {\
658658 $3[0] = e;\
659659 }"
660− js_new :: Object -> JSValueRefRef -> JSValueRefRef -> IO JSValueRef
660+ js_new :: Object -> MutableJSArray -> MutableJSArray -> IO JSVal
661661#elif defined(USE_WEBKIT)
662662objCallAsConstructor (Object function) args exceptions = do
663663 gctxt <- ask
664− rargs <- makeArgRefs args
664+ rargs <- makeArgs args
665665 liftIO $ withArrayLen rargs $ \ largs pargs ->
666666 jsobjectcallasconstructor gctxt function (fromIntegral largs) pargs exceptions
667667#else
src/Language/Javascript/JSaddle/Properties.hs+26−26
@@ -31,12 +31,12 @@ module Language.Javascript.JSaddle.Properties (
3131
3232import Control.Applicative ((<$>))
3333import Language.Javascript.JSaddle.Classes
34− (MakeObject(..), MakeValueRef(..),
35− MakeArgRefs(..), MakeStringRef(..))
34+ (MakeObject(..), MakeVal(..),
35+ MakeArgs(..), MakeString(..))
3636import Language.Javascript.JSaddle.Monad (JSM)
3737import Language.Javascript.JSaddle.Types
38− (JSValueRefRef, Object(..), JSPropertyAttributes,
39− Index(..), JSStringRef)
38+ (MutableJSArray, Object(..), JSPropertyAttributes,
39+ Index(..), JSString)
4040#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
4141#else
4242import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSObjectRef
@@ -47,25 +47,25 @@ import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSObjectRef
4747import Control.Monad.Trans.Reader (ask)
4848import Control.Monad.IO.Class (MonadIO(..))
4949import Language.Javascript.JSaddle.Exception (rethrow)
50−import Language.Javascript.JSaddle.Value (JSValueRef)
50+import Language.Javascript.JSaddle.Value (JSVal)
5151import Language.Javascript.JSaddle.Arguments ()
5252import Language.Javascript.JSaddle.String ()
5353
5454-- | Get a property value given the object and the name of the property.
55−objGetPropertyByName :: MakeStringRef name
55+objGetPropertyByName :: MakeString name
5656 => Object -- ^ object to find the property on.
5757 -> name -- ^ name of the property.
58− -> JSValueRefRef -- ^ exception if one is raised.
59− -> JSM JSValueRef -- ^ returns the property value.
58+ -> MutableJSArray -- ^ exception if one is raised.
59+ -> JSM JSVal -- ^ returns the property value.
6060#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
61−objGetPropertyByName this name = liftIO . js_tryGetProp (makeStringRef name) this
61+objGetPropertyByName this name = liftIO . js_tryGetProp (makeString name) this
6262{-# INLINE objGetPropertyByName #-}
6363foreign import javascript unsafe "try { $r=$2[$1] } catch(e) { $3[0] = e }"
64− js_tryGetProp :: JSStringRef -> Object -> JSValueRefRef -> IO JSValueRef
64+ js_tryGetProp :: JSString -> Object -> MutableJSArray -> IO JSVal
6565#elif defined(USE_WEBKIT)
6666objGetPropertyByName (Object this) name exceptions = do
6767 gctxt <- ask
68− liftIO $ jsobjectgetproperty gctxt this (makeStringRef name) exceptions
68+ liftIO $ jsobjectgetproperty gctxt this (makeString name) exceptions
6969{-# INLINE objGetPropertyByName #-}
7070#else
7171objGetPropertyByName = undefined
@@ -74,13 +74,13 @@ objGetPropertyByName = undefined
7474-- | Get a property value given the object and the index of the property.
7575objGetPropertyAtIndex :: Object -- ^ object to find the property on.
7676 -> Index -- ^ index of the property.
77− -> JSValueRefRef -- ^ exception if one is raised.
78− -> JSM JSValueRef -- ^ returns the property value.
77+ -> MutableJSArray -- ^ exception if one is raised.
78+ -> JSM JSVal -- ^ returns the property value.
7979#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
8080objGetPropertyAtIndex this index = liftIO . js_tryIndex index this
8181{-# INLINE objGetPropertyAtIndex #-}
8282foreign import javascript unsafe "try { $r=$2[$1] } catch(e) { $3[0] = e }"
83− js_tryIndex :: Index -> Object -> JSValueRefRef -> IO JSValueRef
83+ js_tryIndex :: Index -> Object -> MutableJSArray -> IO JSVal
8484#elif defined(USE_WEBKIT)
8585objGetPropertyAtIndex (Object this) index exceptions = do
8686 gctxt <- ask
@@ -91,48 +91,48 @@ objGetPropertyAtIndex = undefined
9191#endif
9292
9393-- | Set a property value given the object and the name of the property.
94−objSetPropertyByName :: (MakeStringRef name, MakeValueRef val)
94+objSetPropertyByName :: (MakeString name, MakeVal val)
9595 => Object -- ^ object to set the property on.
9696 -> name -- ^ name of the property.
9797 -> val -- ^ new value to set the property to.
9898 -> JSPropertyAttributes -- ^ property attributes to give the property.
99− -> JSValueRefRef -- ^ exception if one is raised.
99+ -> MutableJSArray -- ^ exception if one is raised.
100100 -> JSM ()
101101#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
102102objSetPropertyByName this name val attributes exceptions = do
103− vref <- makeValueRef val
104− liftIO $ js_trySetProp (makeStringRef name) this vref exceptions
103+ vref <- makeVal val
104+ liftIO $ js_trySetProp (makeString name) this vref exceptions
105105{-# INLINE objSetPropertyByName #-}
106106foreign import javascript unsafe "try { $2[$1]=$3 } catch(e) { $4[0] = e }"
107− js_trySetProp :: JSStringRef -> Object -> JSValueRef -> JSValueRefRef -> IO ()
107+ js_trySetProp :: JSString -> Object -> JSVal -> MutableJSArray -> IO ()
108108#elif defined(USE_WEBKIT)
109109objSetPropertyByName (Object this) name val attributes exceptions = do
110110 gctxt <- ask
111− vref <- makeValueRef val
112− liftIO $ jsobjectsetproperty gctxt this (makeStringRef name) vref attributes exceptions
111+ vref <- makeVal val
112+ liftIO $ jsobjectsetproperty gctxt this (makeString name) vref attributes exceptions
113113{-# INLINE objSetPropertyByName #-}
114114#else
115115objSetPropertyByName = undefined
116116#endif
117117
118118-- | Set a property value given the object and the index of the property.
119−objSetPropertyAtIndex :: (MakeValueRef val)
119+objSetPropertyAtIndex :: (MakeVal val)
120120 => Object -- ^ object to find property on.
121121 -> Index -- ^ index of the property.
122122 -> val -- ^ new value to set the property to.
123− -> JSValueRefRef -- ^ exception if one is raised.
123+ -> MutableJSArray -- ^ exception if one is raised.
124124 -> JSM ()
125125#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
126126objSetPropertyAtIndex this index val exceptions = do
127− vref <- makeValueRef val
127+ vref <- makeVal val
128128 liftIO $ js_trySetAtIndex index this vref exceptions
129129{-# INLINE objSetPropertyAtIndex #-}
130130foreign import javascript unsafe "try { $2[$1]=$3 } catch(e) { $4[0] = e }"
131− js_trySetAtIndex :: Index -> Object -> JSValueRef -> JSValueRefRef -> IO ()
131+ js_trySetAtIndex :: Index -> Object -> JSVal -> MutableJSArray -> IO ()
132132#elif defined(USE_WEBKIT)
133133objSetPropertyAtIndex (Object this) index val exceptions = do
134134 gctxt <- ask
135− vref <- makeValueRef val
135+ vref <- makeVal val
136136 liftIO $ jsobjectsetpropertyatindex gctxt this index vref exceptions
137137{-# INLINE objSetPropertyAtIndex #-}
138138#else
src/Language/Javascript/JSaddle/String.hs+15−15
@@ -14,8 +14,8 @@
1414-----------------------------------------------------------------------------
1515
1616module Language.Javascript.JSaddle.String (
17− JSStringRef
18− , MakeStringRef(..)
17+ JSString
18+ , MakeString(..)
1919
2020 -- * Data.Text helpers
2121 , strToText
@@ -25,7 +25,7 @@ module Language.Javascript.JSaddle.String (
2525import Data.Text (Text)
2626import qualified Data.Text as T (unpack, pack)
2727import Control.Monad.IO.Class (MonadIO(..))
28−import Language.Javascript.JSaddle.Types (JSStringRef)
28+import Language.Javascript.JSaddle.Types (JSString)
2929#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
3030import Data.JSString.Text (textFromJSString, textToJSString)
3131#else
@@ -36,24 +36,24 @@ import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSStringRef
3636import qualified Data.Text.Foreign as T (fromPtr)
3737import Foreign (castPtr)
3838import Data.Text.Foreign (useAsPtr)
39−import Language.Javascript.JSaddle.Classes (MakeStringRef(..))
39+import Language.Javascript.JSaddle.Classes (MakeString(..))
4040import System.IO.Unsafe (unsafePerformIO)
4141
4242-- | If we already have a JSStringRef we are fine
43−instance MakeStringRef JSStringRef where
44− makeStringRef = id
45− {-# INLINE makeStringRef #-}
43+instance MakeString JSString where
44+ makeString = id
45+ {-# INLINE makeString #-}
4646
47−instance MakeStringRef Text where
48− makeStringRef = textToStr
49− {-# INLINE makeStringRef #-}
47+instance MakeString Text where
48+ makeString = textToStr
49+ {-# INLINE makeString #-}
5050
51−instance MakeStringRef String where
52− makeStringRef = textToStr . T.pack
53− {-# INLINE makeStringRef #-}
51+instance MakeString String where
52+ makeString = textToStr . T.pack
53+ {-# INLINE makeString #-}
5454
5555-- | Convert a JavaScript string to a Haskell 'Text'
56−strToText :: MonadIO m => JSStringRef -> m Text
56+strToText :: MonadIO m => JSString -> m Text
5757#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
5858strToText = return . textFromJSString
5959#else
@@ -65,7 +65,7 @@ strToText jsstring = liftIO $ do
6565{-# INLINE strToText #-}
6666
6767-- | Convert a Haskell 'Text' to a JavaScript string
68−textToStr :: Text -> JSStringRef
68+textToStr :: Text -> JSString
6969#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
7070textToStr = textToJSString
7171#else
src/Language/Javascript/JSaddle/Types.hs+9−8
@@ -13,13 +13,13 @@
1313-----------------------------------------------------------------------------
1414
1515module Language.Javascript.JSaddle.Types (
16− JSValueRef(..)
17− , JSValueRefRef(..)
16+ JSVal(..)
17+ , MutableJSArray(..)
1818 , Object(..)
19− , JSPropertyNameArrayRef(..)
19+ , JSPropertyNameArray(..)
2020 , JSPropertyAttributes(..)
2121 , JSContextRef(..)
22− , JSStringRef(..)
22+ , JSString(..)
2323 , Index(..)
2424) where
2525
@@ -37,14 +37,15 @@ import Foreign.C (CUInt(..))
3737#endif
3838
3939#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
40−type JSValueRef = JSVal
41−type JSValueRefRef = MutableJSArray
42−newtype JSPropertyNameArrayRef = JSPropertyNameArrayRef { unJSPropertyNameArrayRef :: JSVal }
40+newtype JSPropertyNameArray = JSPropertyNameArray { unJSPropertyNameArrayRef :: JSVal }
4341type JSPropertyAttributes = Word
4442type JSContextRef = ()
45−type JSStringRef = JSString
4643type Index = Int
4744#else
45+type JSVal = JSValueRef
46+type MutableJSArray = JSValueRefRef
47+type JSPropertyNameArray = JSPropertyNameArrayRef
4848type Index = CUInt
4949newtype Object = Object JSObjectRef
50+type JSString = JSStringRef
5051#endif
src/Language/Javascript/JSaddle/Value.hs+147−108
@@ -2,6 +2,7 @@
22{-# LANGUAGE ScopedTypeVariables #-}
33{-# LANGUAGE FlexibleInstances #-}
44{-# LANGUAGE TypeSynonymInstances #-}
5+{-# LANGUAGE LambdaCase #-}
56#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
67{-# LANGUAGE ForeignFunctionInterface, JavaScriptFFI #-}
78#endif
@@ -31,14 +32,12 @@
3132
3233module Language.Javascript.JSaddle.Value (
3334 -- * JavaScript value references
34− JSValueRef
35− , MakeValueRef(..)
35+ JSVal
36+ , MakeVal(..)
3637
3738 -- * Haskell types for JavaScript values
3839 , JSNull(..)
3940 , JSUndefined(..)
40− , JSBool(..)
41− , JSNumber(..)
4241 , JSString(..)
4342 , JSValue(..)
4443
@@ -53,7 +52,10 @@ module Language.Javascript.JSaddle.Value (
5352 -- * Make JavaScript values from Haskell ones
5453 , val
5554 , valMakeNull
55+ , valIsNull
5656 , valMakeUndefined
57+ , valIsUndefined
58+ , maybeNullOrUndefined
5759 , valMakeBool
5860 , valMakeNumber
5961 , valMakeString
@@ -65,9 +67,9 @@ module Language.Javascript.JSaddle.Value (
6567
6668import Prelude hiding (catch)
6769import Language.Javascript.JSaddle.Types
68− (JSValueRefRef, Object(..), JSStringRef, JSValueRef(..))
70+ (MutableJSArray, Object(..), JSString, JSVal(..))
6971#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
70−import GHCJS.Types (JSVal(..))
72+import GHCJS.Types (JSVal(..), isNull, isUndefined)
7173import GHCJS.Foreign (toJSBool, isTruthy, jsNull, jsUndefined)
7274import GHCJS.Marshal (toJSVal)
7375import GHCJS.Marshal.Pure (pToJSVal)
@@ -77,9 +79,11 @@ import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSValueRef
7779 (jsvaluecreatejsonstring, JSType(..), jsvaluegettype,
7880 jsvaluemakestring, jsvaluemakenumber, jsvaluemakeboolean,
7981 jsvaluemakeundefined, jsvaluemakenull, jsvaluetoobject,
80− jsvaluetostringcopy, jsvaluetonumber, jsvaluetoboolean)
81−import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSStringRef
82+ jsvaluetostringcopy, jsvaluetonumber, jsvaluetoboolean,
83+ jsvalueisnull, jsvalueisundefined)
84+import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSString
8285 (jsstringgetcharactersptr, jsstringgetlength)
86+import System.IO.Unsafe (unsafePerformIO)
8387#endif
8488import Language.Javascript.JSaddle.Monad (JSM, catchval)
8589import Language.Javascript.JSaddle.Exception (rethrow)
@@ -92,8 +96,8 @@ import Control.Applicative ((<$>))
9296import Data.Text (Text)
9397import qualified Data.Text as T (pack)
9498import Language.Javascript.JSaddle.Classes
95− (MakeObject(..), MakeStringRef(..), MakeValueRef(..),
96− MakeArgRefs(..))
99+ (MakeObject(..), MakeString(..), MakeVal(..),
100+ MakeArgs(..))
97101import Language.Javascript.JSaddle.String (strToText, textToStr)
98102import Language.Javascript.JSaddle.Arguments ()
99103import Data.Word (Word)
@@ -103,17 +107,17 @@ data JSNull = JSNull -- ^ Type that represents a value that can only be nul
103107type JSUndefined = () -- ^ A type that can only be undefined in JavaScript. Using ()
104108 -- because functions in JavaScript that have no return, impicitly
105109 -- return undefined.
106−type JSBool = Bool -- ^ JavaScript boolean values map the 'Bool' haskell type.
107−type JSNumber = Double -- ^ A number in JavaScript maps nicely to 'Double'.
108−type JSString = Text -- ^ JavaScript strings can be represented with the Haskell 'Text' type.
110+-- type JSBool = Bool -- ^ JavaScript boolean values map the 'Bool' haskell type.
111+-- type JSNumber = Double -- ^ A number in JavaScript maps nicely to 'Double'.
112+-- type JSString = Text -- ^ JavaScript strings can be represented with the Haskell 'Text' type.
109113
110114-- | An algebraic data type that can represent a JavaScript value. Any JavaScriptCore
111−-- 'JSValueRef' can be converted into this type.
115+-- 'JSVal' can be converted into this type.
112116data JSValue = ValNull -- ^ null
113117 | ValUndefined -- ^ undefined
114− | ValBool JSBool -- ^ true or false
115− | ValNumber JSNumber -- ^ a number
116− | ValString JSString -- ^ a string
118+ | ValBool Bool -- ^ true or false
119+ | ValNumber Double -- ^ a number
120+ | ValString Text -- ^ a string
117121 | ValObject Object -- ^ an object
118122-- deriving(Show, Eq)
119123
@@ -136,13 +140,13 @@ data JSValue = ValNull -- ^ null
136140-- false
137141-- >>> testJSaddle $ valToBool "1"
138142-- true
139−valToBool :: MakeValueRef val => val -> JSM JSBool
143+valToBool :: MakeVal val => val -> JSM Bool
140144#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
141−valToBool val = isTruthy <$> makeValueRef val
145+valToBool val = isTruthy <$> makeVal val
142146#else
143147valToBool val = do
144148 gctxt <- ask
145− rval <- makeValueRef val
149+ rval <- makeVal val
146150 liftIO $ jsvaluetoboolean gctxt rval
147151#endif
148152{-# INLINE valToBool #-}
@@ -166,15 +170,15 @@ valToBool val = do
166170-- 0.0
167171-- >>> testJSaddle $ show <$> valToNumber "1"
168172-- 1.0
169−valToNumber :: MakeValueRef val => val -> JSM JSNumber
173+valToNumber :: MakeVal val => val -> JSM Double
170174#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
171−valToNumber val = jsrefToNumber <$> makeValueRef val
175+valToNumber val = jsrefToNumber <$> makeVal val
172176{-# INLINE valToNumber #-}
173177foreign import javascript unsafe "$r = Number($1);" jsrefToNumber :: JSVal -> Double
174178#elif defined(USE_WEBKIT)
175179valToNumber val = do
176180 gctxt <- ask
177− rval <- makeValueRef val
181+ rval <- makeVal val
178182 rethrow $ liftIO . jsvaluetonumber gctxt rval
179183{-# INLINE valToNumber #-}
180184#else
@@ -200,15 +204,15 @@ valToNumber = undefined
200204--
201205-- >>> testJSaddle $ valToStr "1" >>= strToText
202206-- 1
203−valToStr :: MakeValueRef val => val -> JSM JSStringRef
207+valToStr :: MakeVal val => val -> JSM JSString
204208#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
205−valToStr val = jsrefToString <$> makeValueRef val
209+valToStr val = jsrefToString <$> makeVal val
206210{-# INLINE valToStr #-}
207−foreign import javascript unsafe "$r = $1.toString();" jsrefToString :: JSVal -> JSStringRef
211+foreign import javascript unsafe "$r = $1.toString();" jsrefToString :: JSVal -> JSString
208212#elif defined(USE_WEBKIT)
209213valToStr val = do
210214 gctxt <- ask
211− rval <- makeValueRef val
215+ rval <- makeVal val
212216 rethrow $ liftIO . jsvaluetostringcopy gctxt rval
213217{-# INLINE valToStr #-}
214218#else
@@ -234,7 +238,7 @@ valToStr = undefined
234238-- ""
235239-- >>> testJSaddle $ show <$> valToText "1"
236240-- "1"
237−valToText :: MakeValueRef val => val -> JSM Text
241+valToText :: MakeVal val => val -> JSM Text
238242valToText jsvar = valToStr jsvar >>= strToText
239243{-# INLINE valToText #-}
240244
@@ -259,15 +263,15 @@ valToText jsvar = valToStr jsvar >>= strToText
259263-- "1"
260264-- >>> testJSaddle $ obj >>= valToJSON 0 >>= strToText
261265-- {}
262−valToJSON :: MakeValueRef val => Word -> val -> JSM JSStringRef
266+valToJSON :: MakeVal val => Word -> val -> JSM JSString
263267#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
264−valToJSON indent val = jsrefToJSON <$> makeValueRef val
268+valToJSON indent val = jsrefToJSON <$> makeVal val
265269{-# INLINE valToJSON #-}
266−foreign import javascript unsafe "$r = JSON.stringify($1);" jsrefToJSON :: JSVal -> JSStringRef
270+foreign import javascript unsafe "$r = JSON.stringify($1);" jsrefToJSON :: JSVal -> JSString
267271#elif defined(USE_WEBKIT)
268272valToJSON indent val = do
269273 gctxt <- ask
270− rval <- makeValueRef val
274+ rval <- makeVal val
271275 rethrow $ liftIO . jsvaluecreatejsonstring gctxt rval (fromIntegral indent)
272276{-# INLINE valToJSON #-}
273277#else
@@ -293,47 +297,47 @@ valToJSON = undefined
293297--
294298-- >>> testJSaddle $ valToObject "1"
295299-- 1
296−valToObject :: MakeValueRef val => val -> JSM Object
300+valToObject :: MakeVal val => val -> JSM Object
297301valToObject val = Object <$>
298302#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
299− makeValueRef val
303+ makeVal val
300304#else
301305 do gctxt <- ask
302− rval <- makeValueRef val
306+ rval <- makeVal val
303307 rethrow $ liftIO . jsvaluetoobject gctxt rval
304308#endif
305309{-# INLINE valToObject #-}
306310
307−instance MakeObject JSValueRef where
311+instance MakeObject JSVal where
308312 makeObject = valToObject
309313 {-# INLINE makeObject #-}
310314
311−-- | Convert to a JavaScript value (just an alias for 'makeValueRef')
312−val :: MakeValueRef value
315+-- | Convert to a JavaScript value (just an alias for 'makeVal')
316+val :: MakeVal value
313317 => value -- ^ value to convert to a JavaScript value
314− -> JSM JSValueRef
315−val = makeValueRef
318+ -> JSM JSVal
319+val = makeVal
316320{-# INLINE val #-}
317321
318−-- | If we already have a JSValueRef we are fine
319−instance MakeValueRef JSValueRef where
320− makeValueRef = return
321− {-# INLINE makeValueRef #-}
322+-- | If we already have a JSVal we are fine
323+instance MakeVal JSVal where
324+ makeVal = return
325+ {-# INLINE makeVal #-}
322326
323−-- | A single JSValueRef can be used as the argument list
324−instance MakeArgRefs JSValueRef where
325− makeArgRefs arg = return [arg]
326− {-# INLINE makeArgRefs #-}
327+-- | A single JSVal can be used as the argument list
328+instance MakeArgs JSVal where
329+ makeArgs arg = return [arg]
330+ {-# INLINE makeArgs #-}
327331
328−-- | JSValueRef can be made by evaluating a function in 'JSM' as long
329−-- as it returns something we can make into a JSValueRef.
330−instance MakeValueRef v => MakeValueRef (JSM v) where
331− makeValueRef v = v >>= makeValueRef
332− {-# INLINE makeValueRef #-}
332+-- | JSVal can be made by evaluating a function in 'JSM' as long
333+-- as it returns something we can make into a JSVal.
334+instance MakeVal v => MakeVal (JSM v) where
335+ makeVal v = v >>= makeVal
336+ {-# INLINE makeVal #-}
333337
334338----------- null ---------------
335339-- | Make a @null@ JavaScript value
336−valMakeNull :: JSM JSValueRef
340+valMakeNull :: JSM JSVal
337341#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
338342valMakeNull = return jsNull
339343#else
@@ -342,18 +346,30 @@ valMakeNull = ask >>= (liftIO . jsvaluemakenull)
342346{-# INLINE valMakeNull #-}
343347
344348-- | Makes a @null@ JavaScript value
345−instance MakeValueRef JSNull where
346− makeValueRef = const valMakeNull
347− {-# INLINE makeValueRef #-}
349+instance MakeVal JSNull where
350+ makeVal = const valMakeNull
351+ {-# INLINE makeVal #-}
348352
349353-- | Makes an argument list with just a single @null@ JavaScript value
350−instance MakeArgRefs JSNull where
351− makeArgRefs _ = valMakeNull >>= (\ref -> return [ref])
352− {-# INLINE makeArgRefs #-}
354+instance MakeArgs JSNull where
355+ makeArgs _ = valMakeNull >>= (\ref -> return [ref])
356+ {-# INLINE makeArgs #-}
357+
358+-- | Test a JavaScript value to see if it is @null@
359+valIsNull :: MakeVal val => val -> JSM Bool
360+#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
361+valIsNull val = isNull <$> makeVal val
362+#else
363+valIsNull val = do
364+ gctxt <- ask
365+ rval <- makeVal val
366+ liftIO $ jsvalueisnull gctxt rval
367+#endif
368+{-# INLINE valIsNull #-}
353369
354370----------- undefined ---------------
355371-- | Make an @undefined@ JavaScript value
356−valMakeUndefined :: JSM JSValueRef
372+valMakeUndefined :: JSM JSVal
357373#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
358374valMakeUndefined = return jsUndefined
359375#else
@@ -362,23 +378,47 @@ valMakeUndefined = ask >>= (liftIO . jsvaluemakeundefined)
362378{-# INLINE valMakeUndefined #-}
363379
364380-- | Makes an @undefined@ JavaScript value
365−instance MakeValueRef JSUndefined where
366− makeValueRef = const valMakeUndefined
367− {-# INLINE makeValueRef #-}
381+instance MakeVal JSUndefined where
382+ makeVal = const valMakeUndefined
383+ {-# INLINE makeVal #-}
368384
369385--We can't allow this if JSUndefined is () as () is no args not "(null)".
370386--Use [()] instead.
371−--instance MakeArgRefs JSUndefined where
372−-- makeArgRefs _ = valMakeUndefined >>= (\ref -> return [ref])
387+--instance MakeArgs JSUndefined where
388+-- makeArgs _ = valMakeUndefined >>= (\ref -> return [ref])
373389
374−-- | This allows us to pass no arguments easily (altenative would be to use @[]::[JSValueRef]@).
375−instance MakeArgRefs () where
376− makeArgRefs _ = return []
377− {-# INLINE makeArgRefs #-}
390+-- | This allows us to pass no arguments easily (altenative would be to use @[]::[JSVal]@).
391+instance MakeArgs () where
392+ makeArgs _ = return []
393+ {-# INLINE makeArgs #-}
394+
395+-- | Test a JavaScript value to see if it is @undefined@
396+valIsUndefined :: MakeVal val => val -> JSM Bool
397+#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
398+valIsUndefined val = isUndefined <$> makeVal val
399+#else
400+valIsUndefined val = do
401+ gctxt <- ask
402+ rval <- makeVal val
403+ liftIO $ jsvalueisundefined gctxt rval
404+#endif
405+{-# INLINE valIsUndefined #-}
406+
407+-- | Convert a JSVal to a Maybe JSVal (converting null and undefined to Nothing)
408+maybeNullOrUndefined :: MakeVal val => val -> JSM (Maybe JSVal)
409+maybeNullOrUndefined val = do
410+ rval <- makeVal val
411+ valIsNull rval >>= \case
412+ True -> return Nothing
413+ _ ->
414+ valIsUndefined rval >>= \case
415+ True -> return Nothing
416+ _ -> return (Just rval)
417+{-# INLINE maybeNullOrUndefined #-}
378418
379419----------- booleans ---------------
380420-- | Make a JavaScript boolean value
381−valMakeBool :: JSBool -> JSM JSValueRef
421+valMakeBool :: Bool -> JSM JSVal
382422#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
383423valMakeBool b = return $ toJSBool b
384424#else
@@ -389,18 +429,18 @@ valMakeBool b = do
389429{-# INLINE valMakeBool #-}
390430
391431-- | Make a JavaScript boolean value
392−instance MakeValueRef Bool where
393− makeValueRef = valMakeBool
394− {-# INLINE makeValueRef #-}
432+instance MakeVal Bool where
433+ makeVal = valMakeBool
434+ {-# INLINE makeVal #-}
395435
396436-- | Makes an argument list with just a single JavaScript boolean value
397−instance MakeArgRefs Bool where
398− makeArgRefs b = valMakeBool b >>= (\ref -> return [ref])
399− {-# INLINE makeArgRefs #-}
437+instance MakeArgs Bool where
438+ makeArgs b = valMakeBool b >>= (\ref -> return [ref])
439+ {-# INLINE makeArgs #-}
400440
401441----------- numbers ---------------
402442-- | Make a JavaScript number
403−valMakeNumber :: JSNumber -> JSM JSValueRef
443+valMakeNumber :: Double -> JSM JSVal
404444#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
405445valMakeNumber n = liftIO $ toJSVal n
406446#else
@@ -411,18 +451,18 @@ valMakeNumber n = do
411451{-# INLINE valMakeNumber #-}
412452
413453-- | Makes a JavaScript number
414−instance MakeValueRef Double where
415− makeValueRef = valMakeNumber
416− {-# INLINE makeValueRef #-}
454+instance MakeVal Double where
455+ makeVal = valMakeNumber
456+ {-# INLINE makeVal #-}
417457
418458-- | Makes an argument list with just a single JavaScript number
419−instance MakeArgRefs Double where
420− makeArgRefs n = valMakeNumber n >>= (\ref -> return [ref])
421− {-# INLINE makeArgRefs #-}
459+instance MakeArgs Double where
460+ makeArgs n = valMakeNumber n >>= (\ref -> return [ref])
461+ {-# INLINE makeArgs #-}
422462
423463----------- numbers ---------------
424464-- | Make a JavaScript string
425−valMakeString :: Text -> JSM JSValueRef
465+valMakeString :: Text -> JSM JSVal
426466#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
427467valMakeString = return . pToJSVal . textToJSString
428468#else
@@ -433,19 +473,19 @@ valMakeString text = do
433473{-# INLINE valMakeString #-}
434474
435475-- | Makes a JavaScript string
436−instance MakeValueRef Text where
437− makeValueRef = valMakeString
438− {-# INLINE makeValueRef #-}
476+instance MakeVal Text where
477+ makeVal = valMakeString
478+ {-# INLINE makeVal #-}
439479
440480-- | Makes an argument list with just a single JavaScript string
441−instance MakeArgRefs Text where
442− makeArgRefs t = valMakeString t >>= (\ref -> return [ref])
443− {-# INLINE makeArgRefs #-}
481+instance MakeArgs Text where
482+ makeArgs t = valMakeString t >>= (\ref -> return [ref])
483+ {-# INLINE makeArgs #-}
444484
445485-- | Makes a JavaScript string
446−instance MakeValueRef String where
447− makeValueRef = valMakeString . T.pack
448− {-# INLINE makeValueRef #-}
486+instance MakeVal String where
487+ makeVal = valMakeString . T.pack
488+ {-# INLINE makeVal #-}
449489
450490-- | Derefernce a value reference.
451491--
@@ -467,35 +507,34 @@ instance MakeValueRef String where
467507-- ValString "1"
468508-- >>> testJSaddle $ show <$> valToObject True >>= deRefVal
469509-- ValObject 0x...
470−deRefVal :: MakeValueRef val => val -> JSM JSValue
510+deRefVal :: MakeVal val => val -> JSM JSValue
471511#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
472512deRefVal val = do
473− gctxt <- ask
474− valref <- makeValueRef val
513+ valref <- makeVal val
475514 case (jsrefGetType valref :: Int) of
476515 0 -> return ValUndefined
477516 1 -> return ValNull
478517 2 -> ValBool <$> valToBool valref
479518 3 -> ValNumber <$> valToNumber valref
480− 4 -> ValString <$> (valToStr valref >>= strToText)
519+ 4 -> ValString <$> valToText valref
481520 5 -> ValObject <$> valToObject valref
482521foreign import javascript unsafe "$r = ($1 === undefined)?0:\
483522 ($1===null)?1:\
484523 (typeof $1===\"boolean\")?2:\
485524 (typeof $1===\"number\")?3:\
486525 (typeof $1===\"string\")?4:\
487− (typeof $1===\"object\")?5:-1;" jsrefGetType :: JSValueRef -> Int
526+ (typeof $1===\"object\")?5:-1;" jsrefGetType :: JSVal -> Int
488527#elif defined(USE_WEBKIT)
489528deRefVal val = do
490529 gctxt <- ask
491− valref <- makeValueRef val
530+ valref <- makeVal val
492531 t <- liftIO $ jsvaluegettype gctxt valref
493532 case t of
494533 Kjstypenull -> return ValNull
495534 Kjstypeundefined -> return ValUndefined
496535 Kjstypeboolean -> ValBool <$> valToBool valref
497536 Kjstypenumber -> ValNumber <$> valToNumber valref
498− Kjstypestring -> ValString <$> (valToStr valref >>= strToText)
537+ Kjstypestring -> ValString <$> valToText valref
499538 Kjstypeobject -> ValObject <$> valToObject valref
500539#else
501540deRefVal = undefined
@@ -513,7 +552,7 @@ deRefVal = undefined
513552-- "1"
514553-- >>> testJSaddle $ valMakeRef (ValString $ pack "Hello")
515554-- "Hello"
516−valMakeRef :: JSValue -> JSM JSValueRef
555+valMakeRef :: JSValue -> JSM JSVal
517556valMakeRef val =
518557 case val of
519558 ValNull -> valMakeNull
@@ -524,14 +563,14 @@ valMakeRef val =
524563 ValObject (Object o) -> return o
525564
526565-- | Makes a JavaScript value from a 'JSValue' ADT.
527−instance MakeValueRef JSValue where
528− makeValueRef = valMakeRef
529− {-# INLINE makeValueRef #-}
566+instance MakeVal JSValue where
567+ makeVal = valMakeRef
568+ {-# INLINE makeVal #-}
530569
531570-- | Makes an argument list with just a single JavaScript value from a 'JSValue' ADT.
532−instance MakeArgRefs JSValue where
533− makeArgRefs v = valMakeRef v >>= (\ref -> return [ref])
534− {-# INLINE makeArgRefs #-}
571+instance MakeArgs JSValue where
572+ makeArgs v = valMakeRef v >>= (\ref -> return [ref])
573+ {-# INLINE makeArgs #-}
535574
536575--instance MakeObjectRef JSNull where
537576-- makeObjectRef _ = Object <$> valMakeNull
tests/TestJSaddle.hs+3−3
@@ -49,16 +49,16 @@ state = unsafePerformIO $ newMVar Nothing
4949done = unsafePerformIO $ newEmptyMVar
5050
5151-- >>> testJSaddle $ ((global ^. js "console" . js "log") # ["Hello"])
52−testJSaddle :: MakeValueRef val => JSM val -> IO ()
52+testJSaddle :: MakeVal val => JSM val -> IO ()
5353testJSaddle = testJSaddle' False
5454
5555-- >>> showJSaddle $ eval "document.body.innerHTML = 'Test'"
56−showJSaddle :: MakeValueRef val => JSM val -> IO ()
56+showJSaddle :: MakeVal val => JSM val -> IO ()
5757showJSaddle = testJSaddle' True
5858
5959debugLog = debugM "jsaddle"
6060
61−testJSaddle' :: MakeValueRef val => Bool -> JSM val -> IO ()
61+testJSaddle' :: MakeVal val => Bool -> JSM val -> IO ()
6262testJSaddle' showWindow f = do
6363 debugLog "taking done"
6464 tryTakeMVar done