    {-|
    Module      : HsLua.Core
    Copyright   : © 2007–2012 Gracjan Polak;
                  © 2012–2016 Ömer Sinan Ağacan;
                  © 2017-2024 Albert Krewinkel
    License     : MIT
    Maintainer  : Albert Krewinkel <tarleb@hslua.org>
    Stability   : beta
    Portability : non-portable (depends on GHC)

    Core Lua API. This module provides thin wrappers around the respective
    functions of the Lua C API. C functions which can throw an error are
    wrapped such that the error is converted into an @'Exception'@. However,
    memory allocation errors are not caught and will cause the host program
    to terminate.
    -}
    module HsLua.Core
      ( -- * Run Lua computations
        run
      , runWith
      , runEither
      , GCManagedState
      , newGCManagedState
      , closeGCManagedState
      , withGCManagedState
      -- * Lua Computations
      , LuaE (..)
      , Lua
      , unsafeRunWith
      , liftIO
      , state
      , LuaEnvironment (..)
      -- * Lua API types
      , CFunction
      , PreCFunction
      , Lua.Integer (..)
      , Lua.Number (..)
      -- ** Stack index
      , StackIndex (..)
      , nthTop
      , nthBottom
      , nth
      , top
      -- ** Number of arguments and return values
      , NumArgs (..)
      , NumResults (..)
      -- ** Table fields
      , Name (..)
      -- * Lua API
      -- ** Constants and pseudo-indices
      , multret
      , registryindex
      , upvalueindex
      -- ** State manipulation
      , Lua.State (..)
      , newstate
      , close
      -- ** Basic stack manipulation
      , absindex
      , gettop
      , settop
      , pushvalue
      , copy
      , insert
      , rotate
      , pop
      , remove
      , replace
      , checkstack
      -- ** types and type checks
      , Type (..)
      , ltype
      , typename
      , isboolean
      , iscfunction
      , isfunction
      , isinteger
      , islightuserdata
      , isnil
      , isnone
      , isnoneornil
      , isnumber
      , isstring
      , istable
      , isthread
      , isuserdata
      -- ** access functions (stack → Haskell)
      , toboolean
      , tocfunction
      , tointeger
      , tonumber
      , topointer
      , tostring
      , tothread
      , touserdata
      , rawlen
      -- ** Comparison and arithmetic functions
      , RelationalOperator (..)
      , compare
      , equal
      , lessthan
      , rawequal
      -- ** push functions (Haskell → stack)
      , pushboolean
      , pushcfunction
      , pushcclosure
      , pushinteger
      , pushlightuserdata
      , pushnil
      , pushnumber
      , pushstring
      , pushthread
      -- ** get functions (Lua → stack)
      , getglobal
      , gettable
      , getfield
      , rawget
      , rawgeti
      , createtable
      , newtable
      , newuserdatauv
      , getmetatable
      , getiuservalue
      -- ** set functions (stack → Lua)
      , setglobal
      , settable
      , setfield
      , rawset
      , rawseti
      , setmetatable
      , setiuservalue
      -- ** load and call functions (load and run Lua code)
      , call
      , pcall
      , load
      , loadbuffer
      , loadfile
      , loadstring
      -- ** Coroutine functions
      , Status (..)
      , status
      -- ** garbage-collection function and options
      , GCControl (..)
      , gc
      -- ** miscellaneous and helper functions
      , next
      , error
      , concat
      , pushglobaltable
      , register
      , setwarnf
      -- * loading libraries
      , openbase
      , opendebug
      , openio
      , openlibs
      , openmath
      , openpackage
      , openos
      , openstring
      , opentable
      -- * Auxiliary library
      , checkstack'
      , dostring
      , dofile
      , getmetafield
      , getmetatable'
      , getsubtable
      , newmetatable
      , requiref
      , tostring'
      , traceback
      , where'
      -- ** References
      , Reference (..)
      , ref
      , getref
      , unref
      , fromReference
      , toReference
      , noref
      , refnil
      -- ** Registry fields
      , loaded
      , preload
      -- ** Running with tracebacks
      , pcallTrace
      , callTrace
      , dofileTrace
      , dostringTrace
      -- ** Warnings
      , setwarnf'

      -- * Debug interface
      , getupvalue
      , setupvalue

      -- * Haskell userdata values
      --
      -- | Push arbitrary Haskell values to the Lua stack.
      , newhsuserdatauv
      , newudmetatable
      , fromuserdata
      , putuserdata
      -- ** Haskell functions and closures
      , HaskellFunction
      , pushHaskellFunction
      , pushPreCFunction
      -- * Error handling
      , LuaError (..)
      , Exception (..)
      , try
      , failLua
      , throwErrorAsException
      , throwTypeMismatchError
      , changeErrorType
        -- ** Helpers
      , popErrorMessage
      , pushTypeMismatchError
        -- * Package
      , requirehs
      , preloadhs
      ) where

    import Prelude hiding (EQ, LT, compare, concat, error)

    import HsLua.Core.Auxiliary
    import HsLua.Core.Closures
    import HsLua.Core.Debug
    import HsLua.Core.Error
    import HsLua.Core.Package
    import HsLua.Core.Primary
    import HsLua.Core.Run
    import HsLua.Core.Trace
    import HsLua.Core.Types as Lua
    import HsLua.Core.Userdata
    import HsLua.Core.Warn