content: {-# LANGUAGE FlexibleInstances #-}
  {-# LANGUAGE TypeSynonymInstances #-}
  -----------------------------------------------------------------------------
  --
  -- Module      :  Language.Javascript.JSaddle.Classes.Internal
  -- Copyright   :  (c) Hamish Mackenzie
  -- License     :  MIT
  --
  -- Maintainer  :  Hamish Mackenzie <Hamish.K.Mackenzie@googlemail.com>
  --
  -- | These classes are used to make various JavaScript types
  --   out of whatever we have.  Functions in jsaddle take these as inputs.
  --   This alows implicit casting and eager evaluation.
  --
  -----------------------------------------------------------------------------
  
  module Language.Javascript.JSaddle.Classes.Internal (
    -- * Type classes to convert Haskell data to JavaScript
      MakeObject(..)
    , MakeArgs(..)
  ) where
  
  import Language.Javascript.JSaddle.Types
         (JSM, Object(..), JSVal)
  
  -- | Anything that can be used to make a JavaScript object reference
  class MakeObject this where
      makeObject :: this -> JSM Object
  
  -- | If we already have a Object we are fine
  instance MakeObject Object where
      makeObject = return
  
  -- | Anything that can be used to make a list of JavaScript value
  --   references for use as function arguments
  class MakeArgs this where
      makeArgs :: this -> JSM [JSVal]
  
  instance MakeArgs arg => MakeArgs (JSM arg) where
      makeArgs arg = arg >>= makeArgs
  
  