Commit Graph

342 Commits

Author SHA1 Message Date
Max Cahill
0d88061e3b moved unique_mapping to ferris 2022-12-05 18:10:21 +11:00
Max Cahill
844c9e8c8f ...needed to forward-declare for the previous fix 2022-11-08 09:23:45 +11:00
Max Cahill
c6e6ec858c fixed accidentally global callback in subscribe_once 2022-11-08 09:20:37 +11:00
Max Cahill
94d9901728 better error reporting for pubsub defer-related errors 2022-11-07 17:13:25 +11:00
Max Cahill
66e9848bef added pubsub:subscribe_once and fixed a bug if you subscribe or unsubscribe from inside a callback 2022-11-03 16:19:18 +11:00
Max Cahill
9a8493b880 added stringx.split_and_trim to save me inlining something with the same effect all over the place 2022-10-24 16:08:39 +11:00
Max Cahill
84d4e39622 clarified position/halfsize for aabbs and provided conversion functions from xywh to pos/hs representation
closes #60
2022-10-24 15:18:28 +11:00
Max Cahill
49df9d9743 added tablex.next_element 2022-10-18 12:25:37 +11:00
Max Cahill
7285531870 fixed dedent() with trimmed blank lines (some editors do this automatically) 2022-09-20 15:00:44 +10:00
Max Cahill
662101ddae Merge branch 'feature/nobit-colour' 2022-09-13 11:15:18 +10:00
Max Cahill
4f86dc0a5e keep both bitop and float-only pack/unpack functions in colour 2022-09-13 11:15:08 +10:00
Max Cahill
44c6ae1b0a added tablex.compact to compact sequential tables of a known range containing nils 2022-07-19 15:58:15 +10:00
Max Cahill
24fde1c157 made stringx.deindent remove all trailing empties rather than just one 2022-07-11 16:44:51 +10:00
Max Cahill
9f5dfcb923 removed needless branch in tablex.shallow_copy 2022-06-23 16:36:54 +10:00
Max Cahill
81512550bb fixed possible stack overflow in deep_copy 2022-06-09 16:36:02 +10:00
Max Cahill
a5c26038df fixed reset timer still counting as expired 2022-06-07 16:43:20 +10:00
Max Cahill
bff54f0dbd disambiguated variable names in map_call 2022-06-07 16:30:01 +10:00
Max Cahill
b68081be53 added map_call for mapping a sequence with a method call (useful for object-y collections) 2022-06-07 16:16:01 +10:00
Max Cahill
7366473f32 added functional.map_field for quick extraction of some field of a sequence of objects 2022-06-07 15:38:16 +10:00
Max Cahill
dbce7e6083 managed expired state inside the timer rather than just checking if the time has expired; makes sure the callback fires even for zero length timers 2022-06-07 14:09:35 +10:00
Max Cahill
795f2587d2 fixed pretty.lua using tablex instead of table alias 2022-05-23 14:54:05 +10:00
Max Cahill
1e75fad409 changed pretty printing to use sorted keys 2022-05-23 14:51:18 +10:00
Max Cahill
433e4ebb08 removed whitespace to make the linter happy; todo discover how to turn this particular inanity (whitespace only lines) off :) 2022-05-23 14:51:02 +10:00
Max Cahill
8a57ae458f added changes to accept spairs; merged #58 2022-05-23 14:48:52 +10:00
jalhund
199b8ded1d tablex: Add spairs (alternative of pairs that returns sorted table) 2022-05-18 05:17:55 +00:00
Miku AuahDark
fabbd3f702
colour: Don't depend on bit library. 2022-05-09 10:16:43 +08:00
Max Cahill
be48dd9115 clarified blue vs chroma b in oklab functions 2022-04-22 10:08:55 +10:00
Max Cahill
6e65f82474 clarified rng variable name, but also removed warning for _ prefixed variables as they are used to signal internal/private variables rather than unused variables. 2022-04-22 10:05:44 +10:00
Max Cahill
cb3083bc79 added oklab support to colour.lua (needs testing) 2022-04-05 14:51:49 +10:00
Max Cahill
05f86e2cc1 fixed wrong degenerate direction checked in intersect.line_line_collide 2022-03-29 17:56:02 +11:00
Max Cahill
813ee20052 moving tests to .test to get them out of root folder for now 2022-03-07 12:10:20 +11:00
Max Cahill
6969a044a3 updated tests to reflect that tablex shallow and deep copy don't copy non-table values 2022-03-07 12:04:19 +11:00
Max Cahill
213ba5df0f added tablex.copy is an alias for tablex.shallow_copy, same for overlay, bunch of whitespace changes, some additional asserts 2022-03-07 12:00:05 +11:00
Max Cahill
de5c803389 fixed set not specifying deep or shallow copy 2022-03-07 11:59:23 +11:00
Max Cahill
b6ca4c7740
Merge pull request #53 from idbrii/fix-async-lovejs
async: Skip wrapping with xpcall under lovejs
2022-03-07 10:50:36 +11:00
Max Cahill
840f4ba703
Merge pull request #54 from idbrii/capture-w-func
async: Use function to capture ...
2022-03-07 10:49:01 +11:00
Max Cahill
461c3a8131
Merge pull request #52 from idbrii/table-deep-test
tablex: Add deep & shallow for copy, overlay; remove redundant recursion; add tests
2022-03-07 10:27:35 +11:00
Max Cahill
4b0e0c7ec7
Merge pull request #51 from idbrii/lint
Add luacheck and fix bugs it found
2022-03-07 10:14:08 +11:00
David Briscoe
a030a20985 async: Assert that args is a table; add type_or_nil
If args is valid, assert it's a table.

Provides a clear and immediate error message when you convert
add_timeout() to call().

Also add type_or_nil. Very useful for optional parameters like this one.
Seems clearer than checking the arg first:
    if args then assert:type() end
2022-03-06 00:25:24 -08:00
David Briscoe
98f3630c07 async: Skip wrapping with xpcall under lovejs
See Davidobot/love.js#54.

lovejs crashes love with "attempt to yield across metamethod/C-call
boundary" when you try to yield in a coroutine, so we skip wrapping.

We lose the coroutine-local callstack, but at least it works.

Here's my repro:

    local color = {
        purple = {0.25, 0.09, 0.28, 1},
        white = {0.89, 0.91, 0.90, 1},
    }
    local ball = {
        x = 100,
        y = 100,
        r = 20,
    }
    local S = {}
    local input = {
        vanilla = 'v',
        async = 'c',
        quit = 'escape',
    }

    function love.load()
        S.coro = async()
    end

    local function coro_fn()
        S.async_running = true
        for i=1,100 do
            color.purple[4] = i / 100
            coroutine.yield()
        end
        color.purple[4] = 1
        S.async_running = false
        return true
    end

    function love.update(dt)
        S.coro:update(dt)

        if S.vanilla then
            local success, result = coroutine.resume(S.vanilla)
            if result then
                print("coroutine cleared")
                S.vanilla = nil
            end
        end

        if not S.async_running then
            if love.keyboard.isDown(input.vanilla) then
                S.vanilla = coroutine.create(coro_fn)
                print("raw coroutine started")

            elseif love.keyboard.isDown(input.async) then
                print("Starting async call coroutine from update")
                S.coro:call(coro_fn)

            elseif love.keyboard.isDown(input.quit) then
                love.event.quit()
            end
        end
    end

    function love.draw()
        love.graphics.setColor(color.purple)
        love.graphics.circle("fill", ball.x, ball.y, ball.r)

        love.graphics.setColor(color.white)
        local str = "To start a coroutine:"
        for key,val in pairs(input) do
            str = ("%s\n%s: %s"):format(str, key, val)
        end
        love.graphics.printf(str, 5,5, 200, "left")
    end
2022-03-05 23:44:08 -08:00
David Briscoe
d48d4b0e81 table: Rewrite *_copy to copy any kind of type
Allowing shallow_copy/deep_copy to accept any type makes it easier to
write generic code where you just want to copy some input without
knowing anything about it. Like an event system, save system, etc.

Add corresponding test.

Tests pass
2022-03-03 22:03:12 -08:00
David Briscoe
0c193d7901 lint: Don't assign values that will never be used
No bugs here, but giving an initial value can hide cases where we fail
to set a value. Use an assert instead so we can see errors if we change
and break this code.

Except break_next which goes out of scope after it's assigned (I guess
it used to be outside the loop).
2022-03-03 10:17:35 -08:00
David Briscoe
5118cc42bb lint: Fix mismatched arguments in circle_aabb
Fix bug where circle_aabb_overlap wouldn't have the same results as
aabb_circle_overlap.

b_hs was unused, but the function we call expects a_hs as the first
argument. Looks like this circle_aabb_overlap is just flipping
the arguments to aabb_circle_overlap (and for circle_aabb_collide), so
it should match arguments.

Not sure what hs means. Box size?
2022-03-03 10:17:35 -08:00
David Briscoe
d6af9f74c5 lint: Don't set unused locals
Not a bug, but pointless to store this variable since it's not used.
2022-03-03 10:17:35 -08:00
David Briscoe
9083ee74ca lint: Fix accessing undefined append_inplace
Fix crash when using append_inplace without batteries:export().

If you don't export batteries into the global namespace to stomp table,
then append_inplace would access a nil function because it's using table
instead of tablex.

We still use table inside init, but that's after we export to global
namespace.
2022-03-03 10:17:35 -08:00
David Briscoe
a5ebc1e501 lint: Fix shadow issues
Fix shadowing by using variables with a different name or _.

I don't think any of these warnings were actual bugs and fixed them to
maintain the same behaviour.
2022-03-03 10:17:34 -08:00
David Briscoe
8d41c6d3d1 lint: Fix whitespace issues
Remove excess whitespace and remove related ignores.
2022-03-03 10:17:34 -08:00
David Briscoe
66cb419db8 build: Add action for running luacheck
Run luacheck on CI to catch subtle errors.

Add a luacheckrc that ensures current code issues no warnings. We should
eventually try to remove many of these ignores.
2022-03-03 10:17:34 -08:00
David Briscoe
66a6c5a50e Add comments for things that surprised me
As a new user, there were things I was skeptical about and after digging
in, these were my conclusions.

Compared to the simple and obvious lua wiki solutions, batteries' string
functions are slightly faster. GC is the same.

Test
    local str = "hello world"
    local fn = function()
        local x = 0
        if stringx.ends_with(str, "h") then
            x = x + 1
        end
        if stringx.ends_with(str, "helll") then
            x = x + 1
        end
        if stringx.ends_with(str, "helicopter") then
            x = x + 1
        end
    end
    local pretty = require "inspect"
    print("stringx =", pretty({
                time_taken = {measure.time_taken(fn, 10000)},
                memory_taken = {measure.memory_taken(fn, 10000)}
        }))
    local function starts_with(str, prefix)
        return str:find(prefix, 1, true) == 1
    end
    local function ends_with(str, ending)
        return ending == "" or str:sub(-#ending) == ending
    end
    local fn = function()
        local x = 0
        if ends_with(str, "h") then
            x = x + 1
        end
        if ends_with(str, "helll") then
            x = x + 1
        end
        if ends_with(str, "helicopter") then
            x = x + 1
        end
    end
    print("find =", pretty({
                time_taken = {measure.time_taken(fn, 10000)},
                memory_taken = {measure.memory_taken(fn, 10000)}
        }))

starts_with
===========

stringx =       {
  memory_taken = { 0, 0, 0 },
  time_taken = { 1.5098012518138e-007, 9.988434612751e-008, 2.1699932403862e-005 }
}
find =  {
  memory_taken = { 0, 0, 0 },
  time_taken = { 2.7349997544661e-007, 1.9988510757685e-007, 9.1999536380172e-006 }
}

ends_with
=========

stringx =       {
  memory_taken = { 0, 0, 0 },
  time_taken = { 9.0479978825897e-008, 0, 2.5199959054589e-005 }
}
find =  {
  memory_taken = { 0, 0, 0 },
  time_taken = { 2.1833006758243e-007, 1.9988510757685e-007, 6.1000464484096e-006 }
}
2022-03-03 10:17:34 -08:00
David Briscoe
c038546ae1 build: Add github action for running tests
Run tests on CI so they're useful for catching errors in PRs.
2022-03-03 10:04:28 -08:00