-- | The embedded Ruby interpreter must run on its own thread. The functions
-- in this module should enforce this property. For lower level access,
-- please look at "Foreign.Ruby.Bindings" and "Foreign.Ruby.Helpers".
--
-- > withRubyInterpreter $ \i -> do
-- >   dsqsddqs
module Foreign.Ruby
( -- * Initialization / cleanup
    RubyInterpreter
  , startRubyInterpreter
  , closeRubyInterpreter
  , withRubyInterpreter
  -- * Running Ruby actions
  , loadFile
  , Foreign.Ruby.Safe.embedHaskellValue
  , Foreign.Ruby.Safe.safeMethodCall
  , Foreign.Ruby.Safe.safeFunCall
  , makeSafe
  , RubyError(..)
  -- * Converting to and from Ruby values
  , RValue
  , RID
  , Foreign.Ruby.Safe.fromRuby
  , Foreign.Ruby.Safe.toRuby
  , Foreign.Ruby.Safe.freezeGC
  , getSymbol
  -- * Callbacks
  -- | These functions could be used to call Haskell functions from the Ruby
  -- world. While fancier stuff could be achieved by tapping into
  -- "Foreign.Ruby.Bindings", those methods should be easy to use and should
  -- cover most use cases.
  --
  -- The `embedHaskellValue`, `extractHaskellValue` and
  -- `freeHaskellValue` functions are very unsafe, and should be used only in very
  -- controlled environments.
  , freeHaskellValue
  , extractHaskellValue
  , RubyFunction1
  , RubyFunction2
  , RubyFunction3
  , RubyFunction4
  , RubyFunction5
  , registerGlobalFunction1
  , registerGlobalFunction2
  , registerGlobalFunction3
  , registerGlobalFunction4
  , registerGlobalFunction5
  )
where

import Foreign.Ruby.Safe
import Foreign.Ruby.Helpers
import Foreign.Ruby.Bindings

-- | Gets the `RValue` correponding to the given named symbol.
getSymbol :: String -> IO RValue
getSymbol = fmap id2sym . rb_intern