------------------------------------------------------------------ -- | -- Module : Data.JSRef -- Copyright : (c) Dmitry Golubovsky, 2009 -- License : BSD-style -- -- Maintainer : golubovsky@gmail.com -- Stability : experimental -- Portability : portable -- -- -- -- Mutable Javascript reference objects ------------------------------------------------------------------ module Data.JSRef ( JSRef ,newJSRef ,readJSRef ,writeJSRef ,extRef ) where import Language.JSMW.Monad import Language.JSMW.Type import BrownPLT.JavaScript -- | An opaque data type parameterized by the type of the stored value. data JSRef a = JSRef a -- | Create a mutable Javascript reference object and initialize it. newJSRef :: Expression a -> JSMW e s (Expression (JSRef a)) newJSRef x = do let et = JSRef (exprType x) obj = ObjectLit et [(PropId et (Id et "_val"), x /\ et)] return obj >>= once -- | Store a value in a mutable Javascript reference object. writeJSRef :: Expression (JSRef a) -> Expression a -> JSMW e s (Expression (JSRef a)) writeJSRef r v = once =<< setjsProperty "_val" v r -- | Retrieve a value from a mutable Javascript reference object. readJSRef :: Expression (JSRef a) -> JSMW e a (Expression a) readJSRef r = do let et = undefined :: a v = DotRef et (r /\ et) (Id et "_val") return v -- | External reference to a global variable by name. Name should be a literal. extRef :: String -> JSMW e s (Expression (JSRef a)) extRef s = do let u = undefined once =<< return (ObjectLit u [(PropId u (Id u "_val"), (VarRef u (Id u s)))])