on master help sign in
Add some more handy wrappers for function application and creating objects with the default constructor
commitc6828b624863b44c22af59ca25285b6b2b4a0688 authorHamish Mackenzie <Hamish.K.Mackenzie@googlemail.com> dateWed 13 Mar 2013, 18:13 (14 years ago) parentc46dcab
2 files changed+82−8
jsc.cabal+2−2 src/Language/Javascript/JSC/Object.hs+80−6
jsc.cabal+2−2
@@ -1,5 +1,5 @@
11name: jsc
2−version: 0.1.0.0
2+version: 0.1.1.0
33cabal-version: >=1.10
44license: MIT
55license-file: LICENSE
@@ -31,7 +31,7 @@ test-suite test-tool
3131 build-depends: template-haskell -any, base -any, lens >=3.8.5 && <3.9,
3232 text >=0.11.2.3 && <0.12, transformers >=0.3.0.0 && <0.4,
3333 webkit-javascriptcore >=0.0.0.999 && <0.1, jmacro >=0.6.3 && <0.7,
34− hslogger -any, glib -any, gtk -any, jsc ==0.1.0.0,
34+ hslogger -any, glib -any, gtk -any, jsc ==0.1.1.0,
3535 webkit -any
3636 type: exitcode-stdio-1.0
3737 main-is: TestJSC.hs
src/Language/Javascript/JSC/Object.hs+80−6
@@ -23,6 +23,14 @@ module Language.Javascript.JSC.Object (
2323 , (!)
2424 , (!!)
2525 , js
26+ , JSF(..)
27+ , jsf
28+ , js0
29+ , js1
30+ , js2
31+ , js3
32+ , js4
33+ , js5
2634 , jsg
2735
2836 -- * Setting the value of a property
@@ -32,6 +40,7 @@ module Language.Javascript.JSC.Object (
3240 , (#)
3341 , new
3442 , call
43+ , obj
3544
3645 -- * Calling Haskell From JavaScript
3746 , function
@@ -68,12 +77,13 @@ import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSBase
6877 JSValueRef, JSContextRef)
6978import Foreign.C (CSize(..), CUInt(..), CULong(..))
7079import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSObjectRef
71− (jspropertynamearraygetnameatindex, jspropertynamearraygetcount,
72− jsobjectcopypropertynames, jsobjectsetpropertyatindex,
73− jsobjectgetpropertyatindex, jsobjectcallasconstructor,
74− jsobjectmakearray, jsobjectcallasfunction, jsobjectgetproperty,
75− jsobjectsetproperty, JSPropertyAttributes,
76− JSObjectCallAsFunctionCallback, jsobjectmakefunctionwithcallback)
80+ (jsobjectmake, jspropertynamearraygetnameatindex,
81+ jspropertynamearraygetcount, jsobjectcopypropertynames,
82+ jsobjectsetpropertyatindex, jsobjectgetpropertyatindex,
83+ jsobjectcallasconstructor, jsobjectmakearray,
84+ jsobjectcallasfunction, jsobjectgetproperty, jsobjectsetproperty,
85+ JSPropertyAttributes, JSObjectCallAsFunctionCallback,
86+ jsobjectmakefunctionwithcallback)
7787import Language.Javascript.JSC.Exception (rethrow)
7888import Language.Javascript.JSC.Value
7989 (JSUndefined, valMakeUndefined, valToObject)
@@ -152,6 +162,60 @@ js :: (MakeObjectRef s, MakeStringRef name)
152162 -> IndexPreservingGetter s (JSC JSPropRef)
153163js name = to (!name)
154164
165+-- | Java script function applications have this type
166+type JSF = MakeObjectRef o => IndexPreservingGetter o (JSC JSValueRef)
167+
168+-- | Handy way to call a function
169+--
170+-- > jsf name = js name . to (# args)
171+--
172+-- >>> testJSC $ val "Hello World" ^. jsf "indexOf" ["World"]
173+-- 6
174+jsf :: (MakeStringRef name, MakeArgRefs args) => name -> args -> JSF
175+jsf name args = function . to (# args)
176+ where
177+ function = js name
178+
179+-- | Handy way to call a function that expects no arguments
180+--
181+-- > js0 name = jsf name ()
182+--
183+-- >>> testJSC $ val "Hello World" ^. js0 "toLowerCase"
184+-- hello world
185+js0 :: (MakeStringRef name) => name -> JSF
186+js0 name = jsf name ()
187+
188+-- | Handy way to call a function that expects one argument
189+--
190+-- > js1 name a0 = jsf name [a0]
191+--
192+-- >>> testJSC $ val "Hello World" ^. js1 "indexOf" "World"
193+-- 6
194+js1 :: (MakeStringRef name, MakeValueRef a0) => name -> a0 -> JSF
195+js1 name a0 = jsf name [a0]
196+
197+-- | Handy way to call a function that expects two arguments
198+js2 :: (MakeStringRef name, MakeValueRef a0, MakeValueRef a1) => name -> a0 -> a1 -> JSF
199+js2 name a0 a1 = jsf name (a0, a1)
200+
201+-- | Handy way to call a function that expects three arguments
202+js3 :: (MakeStringRef name, MakeValueRef a0, MakeValueRef a1, MakeValueRef a2)
203+ => name -> a0 -> a1 -> a2 -> JSF
204+js3 name a0 a1 a2 = jsf name (a0, a1, a2)
205+
206+-- | Handy way to call a function that expects four arguments
207+js4 :: (MakeStringRef name, MakeValueRef a0, MakeValueRef a1, MakeValueRef a2,
208+ MakeValueRef a3)
209+ => name -> a0 -> a1 -> a2 -> a3 -> JSF
210+js4 name a0 a1 a2 a3 = jsf name (a0, a1, a2, a3)
211+
212+-- | Handy way to call a function that expects five arguments
213+js5 :: (MakeStringRef name, MakeValueRef a0, MakeValueRef a1, MakeValueRef a2,
214+ MakeValueRef a3, MakeValueRef a4)
215+ => name -> a0 -> a1 -> a2 -> a3 -> a4 -> JSF
216+js5 name a0 a1 a2 a3 a4 = jsf name (a0, a1, a2, a3, a4)
217+
218+
155219-- | Handy way to get and hold onto a reference top level javascript
156220--
157221-- >>> testJSC $ eval "w = console; w.log('Hello World')"
@@ -212,6 +276,16 @@ call function this args = do
212276 rthis <- makeObjectRef this
213277 rethrow $ objCallAsFunction rfunction rthis args
214278
279+-- | Make an empty object using the default constuctor
280+--
281+-- >>> testJSC $ eval "var a = {}; a.x = 'Hello'; a.x"
282+-- >>> testJSC $ do { a <- obj; a ^. js "x" <# "Hello"; a ^. js "x" }
283+-- Hello
284+obj :: JSC JSObjectRef
285+obj = do
286+ gctxt <- ask
287+ liftIO $ jsobjectmake gctxt nullPtr nullPtr
288+
215289type JSObjectCallAsFunctionCallback' =
216290 JSContextRef
217291 -> JSValueRef