Skip to content

Observers

These helper functions are offshoots of Teisu.effect and can be useful in certain situations.

Listening to state changes

If you would like to strictly detect changes without running the callback immediately, you can use Teisu.subscribe:

luau
local Teisu = require(game.ReplicatedStorage.Teisu)

local flec = Teisu.flec
local subscribe = Teisu.subscribe

local count = flec(0)

-- `subscribe` will not run the callback immediately upon initialization
-- it will run when `count` changes
subscribe(count, function(new: number, old: number)
    print(`new count: {new}, old count: {old}`)
end)

count(1)
count(1) --> will not print anything
count(2)
luau
new count: 1, old count: 0
new count: 2, old count: 1

subscribe() returns a function that will disconnect the connection.

luau
local disconnect = subscribe(count, function(new: number, old: number)
    print(`new count: {new}, old count: {old}`)
end)

-- disconnects the above handler after 5 seconds
task.wait(5)
disconnect()

Track additions and removals

Let's say you're in a situation where you have a flec that stores a dictionary/array...

luau
local test_scores = flec({
    ["Alice"] = 75,
    ["Bob"] = 95,
    ["Joe"] = 62,
    ["Susan"] = 99,
})

And you would like to listen for additions or removals in your table. You can use Teisu.observe to accomplish this:

luau
local Teisu = require(game.ReplicatedStorage.Teisu)

local flec = Teisu.flec
local observe = Teisu.observe

local test_scores = flec({
    ["Alice"] = 75,
    ["Bob"] = 95,
    ["Joe"] = 62,
    ["Susan"] = 99,
})

local disconnect = observe(test_scores, function(score: number, person: string)
    print(`added {person}'s score of {score} to the gradebook`)

    return function()
        print(`removed {person}'s score from the gradebook`)
    end
end)

test_scores(function(old)
    local new = table.clone(old)
    new["Ezekiel"] = 85
    return new
end)

task.wait(2)

test_scores(function(old)
    local new = table.clone(old)
    new["Alice"] = nil
    return new
end)

task.wait(2)
disconnect()
luau
added Ezekiel's core of 85 to the gradebook
removed Alice's score from the gradebook

Released under the MIT License.