@@ -0,0 +1,195 @@
1+{-# LANGUAGE ForeignFunctionInterface
2+ , TypeSynonymInstances
4+ , DeriveDataTypeable #-}
5+-----------------------------------------------------------------------------
7+-- Module : Graphics.UI.Gtk.WebKit.JavaScriptCore.JSC.Value
8+-- Copyright : (c) Hamish Mackenzie
11+-- Maintainer : Hamish Mackenzie <Hamish.K.Mackenzie@googlemail.com>
15+-----------------------------------------------------------------------------
17+module Graphics.UI.Gtk.WebKit.JavaScriptCore.JSC.Value (
50+import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSBase
51+ (JSObjectRef, JSStringRef, JSValueRef)
52+import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSC.Monad (rethrow, JSC)
53+import Control.Monad.Trans.Reader (ask)
54+import Control.Monad.IO.Class (MonadIO, MonadIO(..))
55+import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSValueRef
56+ (JSType(..), jsvaluegettype, jsvaluemakestring, jsvaluemakenumber,
57+ jsvaluemakeboolean, jsvaluemakeundefined, jsvaluemakenull,
58+ jsvaluetoobject, jsvaluetostringcopy, jsvaluetonumber,
60+import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSStringRef
61+ (jsstringcreatewithcharacters, jsstringgetcharactersptr,
63+import qualified Data.Text.Foreign as T (fromPtr)
64+import Foreign (castPtr)
65+import Data.Text.Foreign (useAsPtr)
66+import Control.Applicative ((<$>))
67+import Data.Text (Text)
68+import qualified Data.Text as T (pack)
73+type JSNumber = Double
76+data JSValue = ValNull
81+ | ValObject JSObjectRef deriving(Show)
83+valToBool :: JSValueRef -> JSC JSBool
86+ liftIO $ jsvaluetoboolean gctxt jsvar
88+valToNumber :: JSValueRef -> JSC JSNumber
89+valToNumber jsvar = do
91+ rethrow $ liftIO . jsvaluetonumber gctxt jsvar
93+valToStr :: JSValueRef -> JSC JSStringRef
96+ rethrow $ liftIO . jsvaluetostringcopy gctxt jsvar
98+valToObject :: JSValueRef -> JSC JSObjectRef
99+valToObject jsvar = do
101+ rethrow $ liftIO . jsvaluetoobject gctxt jsvar
103+strToText :: MonadIO m => JSStringRef -> m Text
104+strToText jsstring = liftIO $ do
105+ l <- jsstringgetlength jsstring
106+ p <- jsstringgetcharactersptr jsstring
107+ T.fromPtr (castPtr p) (fromIntegral l)
109+textToStr :: MonadIO m => Text -> m JSStringRef
111+ liftIO $ useAsPtr text $ \p l -> do
112+ jsstringcreatewithcharacters (castPtr p) (fromIntegral l)
114+class MakeValueRef a where
115+ makeValueRef :: a -> JSC JSValueRef
117+instance MakeValueRef JSValueRef where
118+ makeValueRef = return
120+class MakeStringRef a where
121+ makeStringRef :: MonadIO m => a -> m JSStringRef
123+instance MakeStringRef JSStringRef where
124+ makeStringRef = return
126+instance MakeStringRef Text where
127+ makeStringRef = textToStr
129+instance MakeStringRef String where
130+ makeStringRef = textToStr . T.pack
132+valMakeNull :: JSC JSValueRef
133+valMakeNull = ask >>= (liftIO . jsvaluemakenull)
135+instance MakeValueRef JSNull where
136+ makeValueRef = const valMakeNull
138+valMakeUndefined :: JSC JSValueRef
139+valMakeUndefined = ask >>= (liftIO . jsvaluemakeundefined)
141+instance MakeValueRef JSUndefined where
142+ makeValueRef = const valMakeUndefined
144+valMakeBool :: JSBool -> JSC JSValueRef
147+ liftIO $ jsvaluemakeboolean gctxt b
149+instance MakeValueRef Bool where
150+ makeValueRef = valMakeBool
152+valMakeNumber :: JSNumber -> JSC JSValueRef
155+ liftIO $ jsvaluemakenumber gctxt n
157+instance MakeValueRef Double where
158+ makeValueRef = valMakeNumber
160+valMakeString :: Text -> JSC JSValueRef
161+valMakeString text = do
164+ liftIO $ jsvaluemakestring gctxt s
166+instance MakeValueRef Text where
167+ makeValueRef = valMakeString
169+instance MakeValueRef String where
170+ makeValueRef = valMakeString . T.pack
172+deRefVal :: JSValueRef -> JSC JSValue
175+ t <- liftIO $ jsvaluegettype gctxt valref
177+ Kjstypenull -> return ValNull
178+ Kjstypeundefined -> return ValUndefined
179+ Kjstypeboolean -> ValBool <$> valToBool valref
180+ Kjstypenumber -> ValNumber <$> valToNumber valref
181+ Kjstypestring -> ValString <$> (valToStr valref >>= strToText)
182+ Kjstypeobject -> ValObject <$> valToObject valref
184+valMakeRef :: JSValue -> JSC JSValueRef
187+ ValNull -> valMakeNull
188+ ValUndefined -> valMakeUndefined
189+ ValBool b -> valMakeBool b
190+ ValNumber n -> valMakeNumber n
191+ ValString s -> valMakeString s
192+ ValObject o -> return o
194+instance MakeValueRef JSValue where
195+ makeValueRef = valMakeRef