{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE RankNTypes #-}
module Foreign.Lua.Core.Types
( Lua (..)
, LuaEnvironment (..)
, ErrorConversion (..)
, errorConversion
, State (..)
, Reader
, liftLua
, liftLua1
, state
, runWithConverter
, unsafeRunWith
, unsafeErrorConversion
, GCCONTROL (..)
, Type (..)
, TypeCode (..)
, fromType
, toType
, liftIO
, CFunction
, LuaBool (..)
, false
, true
, fromLuaBool
, toLuaBool
, Integer (..)
, Number (..)
, StackIndex (..)
, nth
, nthFromBottom
, nthFromTop
, stackTop
, stackBottom
, top
, NumArgs (..)
, NumResults (..)
, RelationalOperator (..)
, fromRelationalOperator
, Status (..)
, StatusCode (..)
, toStatus
, Reference (..)
, fromReference
, toReference
) where
import Prelude hiding (Integer)
import Control.Monad.Catch (MonadCatch, MonadMask, MonadThrow)
import Control.Monad.Reader (ReaderT (..), MonadReader, MonadIO, asks, liftIO)
import Foreign.C (CInt)
import Foreign.Lua.Raw.Types
import Foreign.Lua.Raw.Auxiliary
( Reference (..)
, fromReference
, toReference
)
data ErrorConversion = ErrorConversion
{ errorToException :: forall a . State -> IO a
, addContextToException :: forall a . String -> Lua a -> Lua a
, alternative :: forall a . Lua a -> Lua a -> Lua a
, exceptionToError :: Lua NumResults -> Lua NumResults
}
data LuaEnvironment = LuaEnvironment
{ luaEnvErrorConversion :: ErrorConversion
, luaEnvState :: State
}
newtype Lua a = Lua { unLua :: ReaderT LuaEnvironment IO a }
deriving
( Applicative
, Functor
, Monad
, MonadCatch
, MonadIO
, MonadMask
, MonadReader LuaEnvironment
, MonadThrow
)
liftLua :: (State -> IO a) -> Lua a
liftLua f = state >>= liftIO . f
liftLua1 :: (State -> a -> IO b) -> a -> Lua b
liftLua1 f x = liftLua $ \l -> f l x
state :: Lua State
state = asks luaEnvState
errorConversion :: Lua ErrorConversion
errorConversion = asks luaEnvErrorConversion
runWithConverter :: ErrorConversion -> State -> Lua a -> IO a
runWithConverter e2e l s =
runReaderT (unLua s) (LuaEnvironment e2e l)
unsafeRunWith :: State -> Lua a -> IO a
unsafeRunWith = runWithConverter unsafeErrorConversion
unsafeErrorConversion :: ErrorConversion
unsafeErrorConversion = ErrorConversion
{ errorToException = const (error "An unrecoverable Lua error occured.")
, addContextToException = const id
, alternative = const
, exceptionToError = id
}
nthFromTop :: CInt -> StackIndex
nthFromTop n = StackIndex (-n)
{-# INLINABLE nthFromTop #-}
nth :: CInt -> StackIndex
nth = nthFromTop
{-# INLINABLE nth #-}
nthFromBottom :: CInt -> StackIndex
nthFromBottom = StackIndex
{-# INLINABLE nthFromBottom #-}
top :: StackIndex
top = -1
{-# INLINABLE top #-}
stackTop :: StackIndex
stackTop = top
{-# INLINABLE stackTop #-}
stackBottom :: StackIndex
stackBottom = 1
{-# INLINABLE stackBottom #-}