minilight-lua: A binding library of minilight for Lua langauge.

[ graphics, library, mit, program ] [ Propose Tags ]

This library provides a way to write minilight component in Lua language.

[Skip to Readme]
Versions [faq],,
Change log
Dependencies base (>= && <4.14), bytestring (>=0.10), containers, exceptions (>=0.10), hslua (>=1.1), lens, linear (>=1.20), minilight (>=0.5.0), minilight-lua, mtl (>=2.2), sdl2 (==2.4.*), sdl2-ttf, text (>=1.2), unix-time (>=0.4) [details]
License MIT
Author myuon
Category Graphics
Source repo head: git clone
Uploaded by myuon at 2020-05-16T06:00:13Z
Distributions NixOS:
Executables example
Downloads 135 total (20 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Hackage Matrix CI
Docs uploaded by user
Build status unknown [no reports yet]


[Index] [Quick Jump]


Maintainer's Corner

For package maintainers and hackage trustees

Readme for minilight-lua-

[back to package description]


Hackage MIT license

A binding library of minilight for Lua language.

NB: This package is in the very early stage.

What's this?

  • minilight is a SDL2-based graphics library, equipped with component system.
  • Lua is a lightweight interpreted language.

With this library, you can write a minilight component in Lua language.

Getting Started

See example directory. Main.hs is an entrypoint for minilight engine.

mainFile = "example/main.lua"

main :: IO ()
main = runLightT $ runMiniloop
  (defConfig { hotConfigReplacement = Just "example", appConfigFile = Just "" })
  (const mainloop)
  initial = do
    comp <- registerComponent mainFile newLuaComponent
    reload mainFile

    return ()

  mainloop :: MiniLoop ()
  mainloop = do
    ref <- view _events
    evs <- liftIO $ tryReadMVar ref

    let notifys = case evs of
          Just evs -> mapMaybe asNotifyEvent evs
          _        -> []
    unless (null notifys) $ reload mainFile

Some notes here:

  • When you pass hotConfigReplacement field, minilight will watch the given directory and emits file changed/created/delete events during the mainloop.
  • For registerComponent you need to pass the filename like example/main.lua. The path is relative where you run cabal run.
  • In mainloop, watches any events and reload the component. The reload function will load the lua file again and swap the component dynamically (code swapping).
local minilight = require("minilight")

function onDraw()
    print("[LUA OUTPUT] hello")

    return {
        minilight.translate(50, 50, minilight.picture("example/example.png")),
        minilight.translate(100, 100, minilight.text("こんにちは世界",
                                                     {0, 0, 0, 0})),
        minilight.translate(30, 50,
                            minilight.text("Hello, World!", {255, 0, 0, 0}))

_G.onDraw = onDraw

For lua part:

  • Require minilight library. This will be implicitly loaded by minilight-lua.
  • You need to export onDraw : () -> Array<minilight.Figure> function globally. This function will be called from Haskell and the returned array will be rendered in the component.