@@ -155,7 +155,6 @@ import Data.Text (Text)
155-- as it returns something we can make into a Object.
155-- as it returns something we can make into a Object.
156instance MakeObject v => MakeObject (JSM v) where
156instance MakeObject v => MakeObject (JSM v) where
157 makeObject v = v >>= makeObject
157 makeObject v = v >>= makeObject
158− {-# INLINE makeObject #-}
160-- | Lookup a property based on its name.
159-- | Lookup a property based on its name.
@@ -172,7 +171,6 @@ this ! name = do
172 rethrow $ objGetPropertyByName rthis rname
171 rethrow $ objGetPropertyByName rthis rname
174 rname = toJSString name
173 rname = toJSString name
177-- | Lookup a property based on its index.
175-- | Lookup a property based on its index.
@@ -187,7 +185,6 @@ this ! name = do
187this !! index = do
185this !! index = do
188 rthis <- makeObject this
186 rthis <- makeObject this
189 rethrow $ objGetPropertyAtIndex rthis index
187 rethrow $ objGetPropertyAtIndex rthis index
192-- | Makes a getter for a particular property name.
189-- | Makes a getter for a particular property name.
@@ -201,7 +198,6 @@ js :: (MakeObject s, ToJSString name)
201 => name -- ^ Name of the property to find
198 => name -- ^ Name of the property to find
202 -> IndexPreservingGetter s (JSM JSVal)
199 -> IndexPreservingGetter s (JSM JSVal)
203js name = to (!name)
200js name = to (!name)
206-- | Makes a setter for a particular property name.
202-- | Makes a setter for a particular property name.
@@ -216,7 +212,6 @@ jss :: (ToJSString name, ToJSVal val)
217 -> forall o . MakeObject o => IndexPreservingGetter o (JSM ())
213 -> forall o . MakeObject o => IndexPreservingGetter o (JSM ())
218jss name val = to (\o -> o <# name $ val)
214jss name val = to (\o -> o <# name $ val)
221-- | Handy way to call a function
216-- | Handy way to call a function
@@ -226,7 +221,6 @@ jss name val = to (\o -> o <# name $ val)
227jsf :: (ToJSString name, MakeArgs args) => name -> args -> JSF
222jsf :: (ToJSString name, MakeArgs args) => name -> args -> JSF
228jsf name args = to (\o -> o # name $ args)
223jsf name args = to (\o -> o # name $ args)
231-- | Java script function applications have this type
225-- | Java script function applications have this type
232type JSF = forall o . MakeObject o => IndexPreservingGetter o (JSM JSVal)
226type JSF = forall o . MakeObject o => IndexPreservingGetter o (JSM JSVal)
@@ -239,7 +233,6 @@ type JSF = forall o . MakeObject o => IndexPreservingGetter o (JSM JSVal)
239-- hello world
233-- hello world
240js0 :: (ToJSString name) => name -> JSF
234js0 :: (ToJSString name) => name -> JSF
241js0 name = jsf name ()
235js0 name = jsf name ()
244-- | Handy way to call a function that expects one argument
237-- | Handy way to call a function that expects one argument
@@ -249,32 +242,27 @@ js0 name = jsf name ()
250js1 :: (ToJSString name, ToJSVal a0) => name -> a0 -> JSF
243js1 :: (ToJSString name, ToJSVal a0) => name -> a0 -> JSF
251js1 name a0 = jsf name [a0]
244js1 name a0 = jsf name [a0]
254-- | Handy way to call a function that expects two arguments
246-- | Handy way to call a function that expects two arguments
255js2 :: (ToJSString name, ToJSVal a0, ToJSVal a1) => name -> a0 -> a1 -> JSF
247js2 :: (ToJSString name, ToJSVal a0, ToJSVal a1) => name -> a0 -> a1 -> JSF
256js2 name a0 a1 = jsf name (a0, a1)
248js2 name a0 a1 = jsf name (a0, a1)
259-- | Handy way to call a function that expects three arguments
250-- | Handy way to call a function that expects three arguments
260js3 :: (ToJSString name, ToJSVal a0, ToJSVal a1, ToJSVal a2)
251js3 :: (ToJSString name, ToJSVal a0, ToJSVal a1, ToJSVal a2)
261 => name -> a0 -> a1 -> a2 -> JSF
252 => name -> a0 -> a1 -> a2 -> JSF
262js3 name a0 a1 a2 = jsf name (a0, a1, a2)
253js3 name a0 a1 a2 = jsf name (a0, a1, a2)
265-- | Handy way to call a function that expects four arguments
255-- | Handy way to call a function that expects four arguments
266js4 :: (ToJSString name, ToJSVal a0, ToJSVal a1, ToJSVal a2,
256js4 :: (ToJSString name, ToJSVal a0, ToJSVal a1, ToJSVal a2,
267 ToJSVal a3)
257 ToJSVal a3)
268 => name -> a0 -> a1 -> a2 -> a3 -> JSF
258 => name -> a0 -> a1 -> a2 -> a3 -> JSF
269js4 name a0 a1 a2 a3 = jsf name (a0, a1, a2, a3)
259js4 name a0 a1 a2 a3 = jsf name (a0, a1, a2, a3)
272-- | Handy way to call a function that expects five arguments
261-- | Handy way to call a function that expects five arguments
273js5 :: (ToJSString name, ToJSVal a0, ToJSVal a1, ToJSVal a2,
262js5 :: (ToJSString name, ToJSVal a0, ToJSVal a1, ToJSVal a2,
274 ToJSVal a3, ToJSVal a4)
263 ToJSVal a3, ToJSVal a4)
275 => name -> a0 -> a1 -> a2 -> a3 -> a4 -> JSF
264 => name -> a0 -> a1 -> a2 -> a3 -> a4 -> JSF
276js5 name a0 a1 a2 a3 a4 = jsf name (a0, a1, a2, a3, a4)
265js5 name a0 a1 a2 a3 a4 = jsf name (a0, a1, a2, a3, a4)
280-- | Handy way to get and hold onto a reference top level javascript
268-- | Handy way to get and hold onto a reference top level javascript
@@ -289,7 +277,6 @@ js5 name a0 a1 a2 a3 a4 = jsf name (a0, a1, a2, a3, a4)
289-- undefined
277-- undefined
290jsg :: ToJSString a => a -> JSM JSVal
278jsg :: ToJSString a => a -> JSM JSVal
291jsg name = global ! name
279jsg name = global ! name
294-- | Handy way to call a function
281-- | Handy way to call a function
@@ -301,7 +288,6 @@ jsg name = global ! name
302jsgf :: (ToJSString name, MakeArgs args) => name -> args -> JSM JSVal
289jsgf :: (ToJSString name, MakeArgs args) => name -> args -> JSM JSVal
303jsgf name = global # name
290jsgf name = global # name
306-- | Handy way to call a function that expects no arguments
292-- | Handy way to call a function that expects no arguments
@@ -311,7 +297,6 @@ jsgf name = global # name
311-- TypeError:...undefined...is not an objec...
297-- TypeError:...undefined...is not an objec...
312jsg0 :: (ToJSString name) => name -> JSM JSVal
298jsg0 :: (ToJSString name) => name -> JSM JSVal
313jsg0 name = jsgf name ()
299jsg0 name = jsgf name ()
316-- | Handy way to call a function that expects one argument
301-- | Handy way to call a function that expects one argument
@@ -321,32 +306,27 @@ jsg0 name = jsgf name ()
322jsg1 :: (ToJSString name, ToJSVal a0) => name -> a0 -> JSM JSVal
307jsg1 :: (ToJSString name, ToJSVal a0) => name -> a0 -> JSM JSVal
323jsg1 name a0 = jsgf name [a0]
308jsg1 name a0 = jsgf name [a0]
326-- | Handy way to call a function that expects two arguments
310-- | Handy way to call a function that expects two arguments
327jsg2 :: (ToJSString name, ToJSVal a0, ToJSVal a1) => name -> a0 -> a1 -> JSM JSVal
311jsg2 :: (ToJSString name, ToJSVal a0, ToJSVal a1) => name -> a0 -> a1 -> JSM JSVal
328jsg2 name a0 a1 = jsgf name (a0, a1)
312jsg2 name a0 a1 = jsgf name (a0, a1)
331-- | Handy way to call a function that expects three arguments
314-- | Handy way to call a function that expects three arguments
332jsg3 :: (ToJSString name, ToJSVal a0, ToJSVal a1, ToJSVal a2)
315jsg3 :: (ToJSString name, ToJSVal a0, ToJSVal a1, ToJSVal a2)
333 => name -> a0 -> a1 -> a2 -> JSM JSVal
316 => name -> a0 -> a1 -> a2 -> JSM JSVal
334jsg3 name a0 a1 a2 = jsgf name (a0, a1, a2)
317jsg3 name a0 a1 a2 = jsgf name (a0, a1, a2)
337-- | Handy way to call a function that expects four arguments
319-- | Handy way to call a function that expects four arguments
338jsg4 :: (ToJSString name, ToJSVal a0, ToJSVal a1, ToJSVal a2,
320jsg4 :: (ToJSString name, ToJSVal a0, ToJSVal a1, ToJSVal a2,
339 ToJSVal a3)
321 ToJSVal a3)
340 => name -> a0 -> a1 -> a2 -> a3 -> JSM JSVal
322 => name -> a0 -> a1 -> a2 -> a3 -> JSM JSVal
341jsg4 name a0 a1 a2 a3 = jsgf name (a0, a1, a2, a3)
323jsg4 name a0 a1 a2 a3 = jsgf name (a0, a1, a2, a3)
344-- | Handy way to call a function that expects five arguments
325-- | Handy way to call a function that expects five arguments
345jsg5 :: (ToJSString name, ToJSVal a0, ToJSVal a1, ToJSVal a2,
326jsg5 :: (ToJSString name, ToJSVal a0, ToJSVal a1, ToJSVal a2,
346 ToJSVal a3, ToJSVal a4)
327 ToJSVal a3, ToJSVal a4)
347 => name -> a0 -> a1 -> a2 -> a3 -> a4 -> JSM JSVal
328 => name -> a0 -> a1 -> a2 -> a3 -> a4 -> JSM JSVal
348jsg5 name a0 a1 a2 a3 a4 = jsgf name (a0, a1, a2, a3, a4)
329jsg5 name a0 a1 a2 a3 a4 = jsgf name (a0, a1, a2, a3, a4)
351-- | Call a JavaScript function
331-- | Call a JavaScript function
@@ -362,7 +342,6 @@ infixr 2 #
362 f <- rethrow $ objGetPropertyByName rthis name
342 f <- rethrow $ objGetPropertyByName rthis name
363 f' <- valToObject f
343 f' <- valToObject f
364 rethrow $ objCallAsFunction f' rthis args
344 rethrow $ objCallAsFunction f' rthis args
367-- | Call a JavaScript function
346-- | Call a JavaScript function
@@ -378,7 +357,6 @@ infixr 2 ##
378 f <- rethrow $ objGetPropertyAtIndex rthis index
357 f <- rethrow $ objGetPropertyAtIndex rthis index
379 f' <- valToObject f
358 f' <- valToObject f
380 rethrow $ objCallAsFunction f' rthis args
359 rethrow $ objCallAsFunction f' rthis args
383-- | Set a JavaScript property
361-- | Set a JavaScript property
@@ -395,7 +373,6 @@ infixr 1 <#
395(<#) this name val = do
373(<#) this name val = do
396 rthis <- makeObject this
374 rthis <- makeObject this
397 rethrow $ objSetPropertyByName rthis name val 0
375 rethrow $ objSetPropertyByName rthis name val 0
400-- | Set a JavaScript property
377-- | Set a JavaScript property
@@ -412,7 +389,6 @@ infixr 1 <##
412(<##) this index val = do
389(<##) this index val = do
413 rthis <- makeObject this
390 rthis <- makeObject this
414 rethrow $ objSetPropertyAtIndex rthis index val
391 rethrow $ objSetPropertyAtIndex rthis index val
417-- | Use this to create a new JavaScript object
393-- | Use this to create a new JavaScript object
@@ -428,7 +404,6 @@ new :: (MakeObject constructor, MakeArgs args)
428new constructor args = do
404new constructor args = do
429 f <- makeObject constructor
405 f <- makeObject constructor
430 rethrow $ objCallAsConstructor f args
406 rethrow $ objCallAsConstructor f args
433-- | Call function with a given @this@. In most cases you should use '#'.
408-- | Call function with a given @this@. In most cases you should use '#'.
@@ -442,7 +417,6 @@ call f this args = do
442 rfunction <- makeObject f
417 rfunction <- makeObject f
443 rthis <- makeObject this
418 rthis <- makeObject this
444 rethrow $ objCallAsFunction rfunction rthis args
419 rethrow $ objCallAsFunction rfunction rthis args
447-- | Make an empty object using the default constuctor
421-- | Make an empty object using the default constuctor
@@ -458,7 +432,6 @@ obj = do
458 gctxt <- ask
432 gctxt <- ask
459 Object <$> (liftIO (jsobjectmake gctxt nullPtr nullPtr) >>= makeNewJSVal)
433 Object <$> (liftIO (jsobjectmake gctxt nullPtr nullPtr) >>= makeNewJSVal)
463-- | Type used for Haskell functions called from JavaScript.
436-- | Type used for Haskell functions called from JavaScript.
464type JSCallAsFunction = JSVal -- ^ Function object
437type JSCallAsFunction = JSVal -- ^ Function object
@@ -482,7 +455,6 @@ type JSCallAsFunction = JSVal -- ^ Function object
482-- undefined
455-- undefined
483fun :: JSCallAsFunction -> JSCallAsFunction
456fun :: JSCallAsFunction -> JSCallAsFunction
487#ifdef ghcjs_HOST_OS
459#ifdef ghcjs_HOST_OS
488type HaskellCallback = Callback (JSVal -> JSVal -> IO ())
460type HaskellCallback = Callback (JSVal -> JSVal -> IO ())
@@ -538,20 +510,17 @@ freeFunction (Function callback _) = liftIO $
539instance ToJSVal Function where
511instance ToJSVal Function where
540 toJSVal (Function _ f) = toJSVal f
512 toJSVal (Function _ f) = toJSVal f
541− {-# INLINE toJSVal #-}
543-- | A callback to Haskell can be used as a JavaScript value. This will create
514-- | A callback to Haskell can be used as a JavaScript value. This will create
544-- an anonymous JavaScript function object. Use 'function' to create one with
515-- an anonymous JavaScript function object. Use 'function' to create one with
545-- a name.
516-- a name.
546instance ToJSVal JSCallAsFunction where
517instance ToJSVal JSCallAsFunction where
547 toJSVal f = functionObject <$> function nullJSString f >>= toJSVal
518 toJSVal f = functionObject <$> function nullJSString f >>= toJSVal
548− {-# INLINE toJSVal #-}
550instance MakeArgs JSCallAsFunction where
520instance MakeArgs JSCallAsFunction where
551 makeArgs f = do
521 makeArgs f = do
552 rarg <- functionObject <$> function nullJSString f >>= toJSVal
522 rarg <- functionObject <$> function nullJSString f >>= toJSVal
553 return [rarg]
523 return [rarg]
554− {-# INLINE makeArgs #-}
556makeArray :: MakeArgs args => args -> MutableJSArray -> JSM Object
525makeArray :: MakeArgs args => args -> MutableJSArray -> JSM Object
557#ifdef ghcjs_HOST_OS
526#ifdef ghcjs_HOST_OS
@@ -568,7 +537,6 @@ makeArray args exceptions = do
568 jsobjectmakearray gctxt (fromIntegral len) ptr exceptions
537 jsobjectmakearray gctxt (fromIntegral len) ptr exceptions
569 Object <$> makeNewJSVal result
538 Object <$> makeNewJSVal result
571−{-# INLINE makeArray #-}
573-- | Make an JavaScript array from a list of values
541-- | Make an JavaScript array from a list of values
@@ -586,45 +554,35 @@ array = rethrow . makeArray
586-- Make an array out of various lists
554-- Make an array out of various lists
587instance ToJSVal [JSVal] where
555instance ToJSVal [JSVal] where
588 toJSVal = toJSVal . array
556 toJSVal = toJSVal . array
589− {-# INLINE toJSVal #-}
591instance ToJSVal [JSM JSVal] where
558instance ToJSVal [JSM JSVal] where
592 toJSVal = toJSVal . array
559 toJSVal = toJSVal . array
593− {-# INLINE toJSVal #-}
595instance ToJSVal [Double] where
561instance ToJSVal [Double] where
596 toJSVal = toJSVal . array
562 toJSVal = toJSVal . array
597− {-# INLINE toJSVal #-}
599instance ToJSVal [Float] where
564instance ToJSVal [Float] where
600 toJSVal = toJSVal . array
565 toJSVal = toJSVal . array
601− {-# INLINE toJSVal #-}
603instance ToJSVal [Int] where
567instance ToJSVal [Int] where
604 toJSVal = toJSVal . array
568 toJSVal = toJSVal . array
605− {-# INLINE toJSVal #-}
607instance ToJSVal [JSString] where
570instance ToJSVal [JSString] where
608 toJSVal = toJSVal . array
571 toJSVal = toJSVal . array
609− {-# INLINE toJSVal #-}
611instance ToJSVal [String] where
573instance ToJSVal [String] where
612 toJSVal = toJSVal . array
574 toJSVal = toJSVal . array
613− {-# INLINE toJSVal #-}
615instance ToJSVal [Text] where
576instance ToJSVal [Text] where
616 toJSVal = toJSVal . array
577 toJSVal = toJSVal . array
617− {-# INLINE toJSVal #-}
619instance ToJSVal [Bool] where
579instance ToJSVal [Bool] where
620 toJSVal = toJSVal . array
580 toJSVal = toJSVal . array
621− {-# INLINE toJSVal #-}
623-- | JavaScript's global object
582-- | JavaScript's global object
624global :: JSM Object
583global :: JSM Object
625#ifdef ghcjs_HOST_OS
584#ifdef ghcjs_HOST_OS
626global = liftIO js_window
585global = liftIO js_window
627−{-# INLINE global #-}
628foreign import javascript unsafe "$r = window"
586foreign import javascript unsafe "$r = window"
629 js_window :: IO Object
587 js_window :: IO Object
@@ -632,7 +590,6 @@ global = do
632 gctxt <- ask
590 gctxt <- ask
633 result <- liftIO $ jscontextgetglobalobject gctxt
591 result <- liftIO $ jscontextgetglobalobject gctxt
634 Object <$> makeNewJSVal result
592 Object <$> makeNewJSVal result
635−{-# INLINE global #-}
638-- | Get an array containing the property names present on a given object
595-- | Get an array containing the property names present on a given object
@@ -643,36 +600,30 @@ copyPropertyNames this = do
643 this' <- makeObject this
600 this' <- makeObject this
644 withObject this' $ \rthis ->
601 withObject this' $ \rthis ->
645 liftIO $ jsobjectcopypropertynames gctxt rthis
602 liftIO $ jsobjectcopypropertynames gctxt rthis
646−{-# INLINE copyPropertyNames #-}
648-- | Get the number of names in a property name array
604-- | Get the number of names in a property name array
649propertyNamesCount :: MonadIO m => JSPropertyNameArray -> m CSize
605propertyNamesCount :: MonadIO m => JSPropertyNameArray -> m CSize
650propertyNamesCount names = liftIO $ jspropertynamearraygetcount names
606propertyNamesCount names = liftIO $ jspropertynamearraygetcount names
651−{-# INLINE propertyNamesCount #-}
653-- | Get a name out of a property name array
608-- | Get a name out of a property name array
654propertyNamesAt :: MonadIO m => JSPropertyNameArray -> CSize -> m JSString
609propertyNamesAt :: MonadIO m => JSPropertyNameArray -> CSize -> m JSString
655propertyNamesAt names index = liftIO $ jspropertynamearraygetnameatindex names index >>= makeNewJSString
610propertyNamesAt names index = liftIO $ jspropertynamearraygetnameatindex names index >>= makeNewJSString
656−{-# INLINE propertyNamesAt #-}
658-- | Convert property array to a list
612-- | Convert property array to a list
659propertyNamesList :: MonadIO m => JSPropertyNameArray -> m [JSString]
613propertyNamesList :: MonadIO m => JSPropertyNameArray -> m [JSString]
660propertyNamesList names = do
614propertyNamesList names = do
661 count <- propertyNamesCount names
615 count <- propertyNamesCount names
662 mapM (propertyNamesAt names) $ enumFromTo 0 (count - 1)
616 mapM (propertyNamesAt names) $ enumFromTo 0 (count - 1)
663−{-# INLINE propertyNamesList #-}
666-- | Get a list containing the property names present on a given object
619-- | Get a list containing the property names present on a given object
667propertyNames :: MakeObject this => this -> JSM [JSString]
620propertyNames :: MakeObject this => this -> JSM [JSString]
668#ifdef ghcjs_HOST_OS
621#ifdef ghcjs_HOST_OS
669propertyNames this = makeObject this >>= liftIO . js_propertyNames >>= liftIO . (fmap (map pFromJSVal)) . Array.toListIO
622propertyNames this = makeObject this >>= liftIO . js_propertyNames >>= liftIO . (fmap (map pFromJSVal)) . Array.toListIO
670−{-# INLINE propertyNames #-}
671foreign import javascript unsafe "$r = []; h$forIn($1, function(n){$r.push(n);})"
623foreign import javascript unsafe "$r = []; h$forIn($1, function(n){$r.push(n);})"
672 js_propertyNames :: Object -> IO JSArray
624 js_propertyNames :: Object -> IO JSArray
674propertyNames this = copyPropertyNames this >>= propertyNamesList
626propertyNames this = copyPropertyNames this >>= propertyNamesList
675−{-# INLINE propertyNames #-}
678-- | Get a list containing references to all the properties present on a given object
629-- | Get a list containing references to all the properties present on a given object
@@ -690,7 +641,6 @@ objCallAsFunction :: MakeArgs args
690objCallAsFunction f this args exceptions = do
641objCallAsFunction f this args exceptions = do
691 rargs <- makeArgs args >>= liftIO . Array.fromListIO
642 rargs <- makeArgs args >>= liftIO . Array.fromListIO
692 liftIO $ js_apply f this rargs exceptions
643 liftIO $ js_apply f this rargs exceptions
693−{-# INLINE objCallAsFunction #-}
694foreign import javascript unsafe "try { $r = $1.apply($2, $3) } catch(e) { $4[0] = e }"
644foreign import javascript unsafe "try { $r = $1.apply($2, $3) } catch(e) { $4[0] = e }"
695 js_apply :: Object -> Object -> MutableJSArray -> MutableJSArray -> IO JSVal
645 js_apply :: Object -> Object -> MutableJSArray -> MutableJSArray -> IO JSVal
@@ -704,7 +654,6 @@ objCallAsFunction f this args exceptions = do
704 liftIO $ withArrayLen rargs' $ \ largs pargs ->
654 liftIO $ withArrayLen rargs' $ \ largs pargs ->
705 jsobjectcallasfunction gctxt rfunction rthis (fromIntegral largs) pargs exceptions
655 jsobjectcallasfunction gctxt rfunction rthis (fromIntegral largs) pargs exceptions
706 makeNewJSVal result
656 makeNewJSVal result
707−{-# INLINE objCallAsFunction #-}
710-- | Call a JavaScript object as a constructor. Consider using 'new'.
659-- | Call a JavaScript object as a constructor. Consider using 'new'.