@@ -4,14 +4,21 @@ module GHCJS.Foreign.Callback
44 ( Callback
55 , OnBlocked (.. )
66 , releaseCallback
7+ -- * asynchronous callbacks
78 , asyncCallback
89 , asyncCallback1
910 , asyncCallback2
1011 , asyncCallback3
12+ -- * synchronous callbacks
1113 , syncCallback
1214 , syncCallback1
1315 , syncCallback2
1416 , syncCallback3
17+ -- * synchronous callbacks that return a value
18+ , syncCallback'
19+ , syncCallback1'
20+ , syncCallback2'
21+ , syncCallback3'
1522 ) where
1623
1724import GHCJS.Concurrent
@@ -88,7 +95,27 @@ syncCallback3 :: OnBlocked -- ^ what to do when th
8895 -> IO (Callback (JSVal -> JSVal -> JSVal -> IO () )) -- ^ the callback
8996syncCallback3 onBlocked x = js_syncCallbackApply (onBlocked == ContinueAsync ) 3 (unsafeCoerce x)
9097
98+ {- | Make a callback (JavaScript function) that runs the supplied IO action in a synchronous
99+ thread when called.
100+
101+ Call 'releaseCallback' when done with the callback, freeing memory referenced
102+ by the IO action.
103+ -}
104+ syncCallback' :: IO JSVal
105+ -> IO (Callback (IO JSVal ))
106+ syncCallback' x = js_syncCallbackReturn (unsafeCoerce x)
107+
108+ syncCallback1' :: (JSVal -> IO JSVal )
109+ -> IO (Callback (JSVal -> IO JSVal ))
110+ syncCallback1' x = js_syncCallbackApplyReturn 1 (unsafeCoerce x)
111+
112+ syncCallback2' :: (JSVal -> JSVal -> IO JSVal )
113+ -> IO (Callback (JSVal -> JSVal -> IO JSVal ))
114+ syncCallback2' x = js_syncCallbackApplyReturn 2 (unsafeCoerce x)
91115
116+ syncCallback3' :: (JSVal -> JSVal -> JSVal -> IO JSVal )
117+ -> IO (Callback (JSVal -> JSVal -> JSVal -> IO JSVal ))
118+ syncCallback3' x = js_syncCallbackApplyReturn 3 (unsafeCoerce x)
92119
93120{- | Make a callback (JavaScript function) that runs the supplied IO action in an asynchronous
94121 thread when called.
@@ -118,11 +145,16 @@ foreign import javascript unsafe "h$makeCallback(h$runSync, [$1], $2)"
118145 js_syncCallback :: Bool -> Exts. Any -> IO (Callback (IO b ))
119146foreign import javascript unsafe " h$makeCallback(h$run, [], $1)"
120147 js_asyncCallback :: Exts. Any -> IO (Callback (IO b ))
148+ foreign import javascript unsafe " h$makeCallback(h$runSyncReturn, [false], $1)"
149+ js_syncCallbackReturn :: Exts. Any -> IO (Callback (IO JSVal ))
121150
122151foreign import javascript unsafe " h$makeCallbackApply($2, h$runSync, [$1], $3)"
123152 js_syncCallbackApply :: Bool -> Int -> Exts. Any -> IO (Callback b )
124153foreign import javascript unsafe " h$makeCallbackApply($1, h$run, [], $2)"
125154 js_asyncCallbackApply :: Int -> Exts. Any -> IO (Callback b )
155+ foreign import javascript unsafe
156+ " h$makeCallbackApply($1, h$runSyncReturn, [false], $2)"
157+ js_syncCallbackApplyReturn :: Int -> Exts. Any -> IO (Callback b )
126158
127159foreign import javascript unsafe " h$release"
128160 js_release :: Callback a -> IO ()
0 commit comments