content: 
  -- | 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(..)
    , SunroofFunctor(..)
    -- * 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
    , 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
    -- * String Utilities
    , substr, substr2
    ) 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(..)
    , SunroofFunctor(..)
    )
  
  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'
    , 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, substr, substr2 )
  