-- | Sunroof provides a way to express Javascript computations in -- Haskell. The computations can be expressed using the 'JS' monad. -- -- There are ready to use API bindings for frequently used -- Javascript: -- -- * 'Language.Sunroof.JS.Browser' - Bindings of the standard browser APIs. -- -- * 'Language.Sunroof.JS.Canvas' - Bindings of the HTML5 canvas element API. -- -- * 'Language.Sunroof.JS.JQuery' - Bindings of some JQuery methods. -- -- * 'Language.Sunroof.JS.Date' - Bindings of the standard data API. -- -- It also provides an abstraction over Javascripts (not existing) threading -- model. Cooperative multithreading can be emulated using the Sunroof -- abstractions ('forkJS', 'yield', 'loop'). Equivalents of well-known -- Haskell concurrency abstractions like 'Control.Concurrent.MVar' -- or 'Control.Concurrent.Chan' are also provided on Javascript level -- through 'JSMVar' and 'JSChan'. -- -- Due to the threading abstraction there are two kinds of computations. -- They are indicated by the first type parameter of 'JS' (a 'T' value). -- Normal Javascript computations that can be assumed to terminate and -- that may deliver a result value are written in the 'JSA' monad. While -- possibly blocking computations (those that involve threading operations) -- are written in the 'JSB' monad. -- -- As the computations are expressed in Haskell, they have a functional -- nature. It is possible to change the attribute values of objects using -- ':=' and 'Language.Sunroof.Types.#': -- -- > o # att := val -- -- If a top-level mutable variable is needed, use the 'JSRef' abstraction. -- It is comparable to 'Data.IORef.IORef'. module Language.Sunroof ( -- * Notes -- | It is advised to use Sunroof with the following language extensions: -- -- * @OverloadedStrings@ - Enables using literal strings for attribute -- names and Javascript strings. -- -- * @DataKinds@ - Enables using @JS A@ or @JS B@ instead of @JSA@ and @JSB@. -- This extension is not essential. -- -- * Sunroof Compiler sunroofCompileJSA , sunroofCompileJSB , CompilerOpts(..) -- * Classes , Sunroof(..), SunroofValue(..), SunroofArgument(..) , JSTuple(..) , SunroofKey(..) -- * Types , Type(..) , T(..), ThreadProxy(..) , SunroofThread(..) , JS(..), JSA, JSB , JSFunction , JSContinuation , JSSelector -- * DSL Primitives and Utilties , done, liftJS , function, continuation , apply, ($$), goto , cast , (#) , attr , fun, invoke, new , evaluate, value , switch , nullJS , label, index , (!) , callcc , comment , delete -- * Concurrency Primitives , forkJS , threadDelay , yield -- * Basic JS types -- ** JavaScript Object , JSObject, this, object -- ** Boolean , JSBool -- ** Numbers , JSNumber, int -- ** Strings , JSString, string -- ** Array , JSArray , array, newArray , length' , lookup' , insert' , shift, unshift , pop, push , forEach , empty -- ** References , JSRef , newJSRef , readJSRef , writeJSRef , modifyJSRef -- ** Channnels , JSChan , newChan , writeChan, readChan -- ** Thread-safe Mutable Variables , JSMVar , newMVar , newEmptyMVar , takeMVar, putMVar -- * DSL Utilties , loop , fixJS ) where import Language.Sunroof.JavaScript ( Type(..) ) import Language.Sunroof.Classes ( Sunroof(..), SunroofValue(..), SunroofArgument(..) ) import Language.Sunroof.Types ( T(..), ThreadProxy(..) , SunroofThread(..) , JS(..), JSA, JSB , done, liftJS , JSFunction , JSContinuation , function, continuation , callcc , apply, ($$), goto , cast , (#) , attr , fun, invoke, new , evaluate, value , switch , nullJS , delete , JSTuple(..) , SunroofKey(..) ) import Language.Sunroof.Compiler ( sunroofCompileJSA , sunroofCompileJSB , CompilerOpts(..) ) import Language.Sunroof.Selector ( JSSelector , label, index , (!) ) import Language.Sunroof.Concurrent ( loop , forkJS , threadDelay , yield ) import Language.Sunroof.JS.Ref ( JSRef , newJSRef , readJSRef , writeJSRef , modifyJSRef ) import Language.Sunroof.JS.Bool ( JSBool ) import Language.Sunroof.JS.Object ( JSObject, object, this ) import Language.Sunroof.JS.Number ( JSNumber, int ) import Language.Sunroof.JS.String ( JSString, string ) import Language.Sunroof.JS.Array ( JSArray , array, newArray , length' , lookup' , insert' , forEach , shift, unshift , pop, push , empty ) import Language.Sunroof.JS.Chan ( JSChan , newChan , writeChan, readChan ) import Language.Sunroof.JS.MVar ( JSMVar , newMVar, newEmptyMVar , takeMVar, putMVar ) import Language.Sunroof.Utils ( comment, fixJS )