minilight-lua 0.2.0.0 → 0.2.1.0
raw patch · 4 files changed
+83/−1 lines, 4 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
+ MiniLight.Lua: LuaBoolean :: Bool -> LuaValue
+ MiniLight.Lua: LuaNil :: LuaValue
+ MiniLight.Lua: LuaNumber :: Double -> LuaValue
+ MiniLight.Lua: LuaString :: Text -> LuaValue
+ MiniLight.Lua: LuaTable :: Table -> LuaValue
+ MiniLight.Lua: Table :: [(LuaValue, LuaValue)] -> Table
+ MiniLight.Lua: [tableStates] :: LuaComponentState -> IORef (Map String (Ptr CString))
+ MiniLight.Lua: data LuaValue
+ MiniLight.Lua: instance Foreign.Lua.Types.Peekable.Peekable MiniLight.Lua.LuaValue
+ MiniLight.Lua: instance Foreign.Lua.Types.Peekable.Peekable MiniLight.Lua.Table
+ MiniLight.Lua: instance Foreign.Lua.Types.Pushable.Pushable MiniLight.Lua.LuaValue
+ MiniLight.Lua: instance Foreign.Lua.Types.Pushable.Pushable MiniLight.Lua.Table
+ MiniLight.Lua: instance GHC.Read.Read MiniLight.Lua.LuaValue
+ MiniLight.Lua: instance GHC.Read.Read MiniLight.Lua.Table
+ MiniLight.Lua: instance GHC.Show.Show MiniLight.Lua.LuaValue
+ MiniLight.Lua: instance GHC.Show.Show MiniLight.Lua.Table
+ MiniLight.Lua: newtype Table
- MiniLight.Lua: LuaComponentState :: IORef (V2 Int) -> IORef Bool -> IORef Bool -> CacheRegistry Figure -> CacheRegistry Font -> State -> IORef (Map String (Ptr Double)) -> IORef (Map String (Ptr Bool)) -> IORef (Map String (Ptr CString)) -> IORef UnixTime -> LuaComponentState
+ MiniLight.Lua: LuaComponentState :: IORef (V2 Int) -> IORef Bool -> IORef Bool -> CacheRegistry Figure -> CacheRegistry Font -> State -> IORef (Map String (Ptr Double)) -> IORef (Map String (Ptr Bool)) -> IORef (Map String (Ptr CString)) -> IORef (Map String (Ptr CString)) -> IORef UnixTime -> LuaComponentState
Files
- CHANGELOG.md +4/−0
- minilight-lua.cabal +1/−1
- src/MiniLight/Lua.hs +69/−0
- src/lib.lua +9/−0
CHANGELOG.md view
@@ -1,5 +1,9 @@ # Revision history for minilight-lua +## 0.2.1.0 -- 2020-05-16++* Support table type for useState+ ## 0.2.0.0 -- 2020-05-13 * Some hooks supported:
minilight-lua.cabal view
@@ -4,7 +4,7 @@ -- http://haskell.org/cabal/users-guide/ name: minilight-lua-version: 0.2.0.0+version: 0.2.1.0 synopsis: A binding library of minilight for Lua langauge. description: This library provides a way to write minilight component in Lua language.
src/MiniLight/Lua.hs view
@@ -14,6 +14,7 @@ import qualified Data.Text.Encoding as TLE import Data.UnixTime import qualified Foreign.Lua as Lua+import qualified Foreign.Lua.Types.Peekable as Lua import Foreign.Ptr import Foreign.C.String import Foreign.Marshal.Alloc@@ -26,6 +27,43 @@ import SDL.Font (Font) import Paths_minilight_lua +data LuaValue+ = LuaNil+ | LuaBoolean Bool+ | LuaString T.Text+ | LuaNumber Double+ | LuaTable Table+ deriving (Read, Show)++newtype Table = Table [(LuaValue, LuaValue)]+ deriving (Read, Show)++instance Lua.Peekable LuaValue where+ peek i = do+ ltype <- Lua.ltype i+ case ltype of+ Lua.TypeNil -> return LuaNil+ Lua.TypeBoolean -> fmap LuaBoolean $ Lua.toboolean i+ Lua.TypeNumber -> fmap (\(Just (Lua.Number v)) -> LuaNumber v) $ Lua.tonumber i+ Lua.TypeString -> fmap (\(Just v) -> LuaString $ TLE.decodeUtf8 v) $ Lua.tostring i+ Lua.TypeTable -> fmap LuaTable $ Lua.peek i++instance Lua.Pushable LuaValue where+ push val = case val of+ LuaNil -> Lua.pushnil+ LuaBoolean b -> Lua.pushboolean b+ LuaString t -> Lua.pushstring $ TLE.encodeUtf8 t+ LuaNumber d -> Lua.pushnumber $ Lua.Number d+ LuaTable t -> Lua.push t++instance Lua.Peekable Table where+ peek i = fmap Table $ Lua.peekKeyValuePairs i++instance Lua.Pushable Table where+ push (Table kv) = do+ Lua.newtable+ mapM_ (\(k,v) -> Lua.push k *> Lua.push v *> Lua.rawset (-3)) kv+ data LuaComponentState = LuaComponentState { mousePosition :: IORef (V2 Int), mousePressed :: IORef Bool,@@ -36,6 +74,7 @@ numberStates :: IORef (M.Map String (Ptr Double)), boolStates :: IORef (M.Map String (Ptr Bool)), stringStates :: IORef (M.Map String (Ptr CString)),+ tableStates :: IORef (M.Map String (Ptr CString)), -- Luaでの更新判定用 updatedAtRef :: IORef UnixTime@@ -99,6 +138,7 @@ ns <- newIORef M.empty bs <- newIORef M.empty ss <- newIORef M.empty+ ts <- newIORef M.empty u <- newIORef $ UnixTime 0 0 let state = LuaComponentState@@ -111,6 +151,7 @@ , numberStates = ns , boolStates = bs , stringStates = ss+ , tableStates = ts , updatedAtRef = u } @@ -173,6 +214,9 @@ Lua.addfunction "newState_number" minilight_newStateNumber Lua.addfunction "readState_number" minilight_readStateNumber Lua.addfunction "writeState_number" minilight_writeStateNumber+ Lua.addfunction "newState_table" minilight_newStateTable+ Lua.addfunction "readState_table" minilight_readStateTable+ Lua.addfunction "writeState_table" minilight_writeStateTable Lua.requirehs "minilight" $ do lib <- liftIO $ getDataFileName "src/lib.lua"@@ -267,3 +311,28 @@ minilight_writeStateNumber :: Ptr Double -> Lua.Number -> Lua.Lua () minilight_writeStateNumber p (Lua.Number v) = liftIO $ poke p v++ minilight_newStateTable :: Int -> Table -> Lua.Lua (Ptr CString)+ minilight_newStateTable index def = liftIO $ do+ m <- readIORef $ tableStates state+ uat <- readIORef $ updatedAtRef state+ let key = show uat ++ "-" ++ show index+ case m M.!? key of+ Just k -> return k+ Nothing -> do+ p <- malloc+ cs <- newCString $ show def+ poke p cs+ writeIORef (tableStates state) $ M.insert key p m+ return p++ minilight_readStateTable :: Ptr CString -> Lua.Lua Table+ minilight_readStateTable p = liftIO $ do+ cs <- peek p+ fmap read $ peekCString cs++ minilight_writeStateTable :: Ptr CString -> Table -> Lua.Lua ()+ minilight_writeStateTable p val = liftIO $ do+ peek p >>= free+ cs <- newCString $ show val+ poke p cs
src/lib.lua view
@@ -34,6 +34,15 @@ return minilight_raw.writeState_bool(ref, v) end }+ elseif (type(def) == "table") then+ local ref = minilight_raw.newState_table(index, def)++ return {+ value = minilight_raw.readState_table(ref),+ write = function(v)+ return minilight_raw.writeState_table(ref, v)+ end+ } else error("Type(" .. type(def) .. ") is not supported!") end