Skip to main content

Computed Values

A computed value is a value that is created from other values.

Key Point

Computed values are useful when one value should come from another value.

For example, instead of manually storing whether a player can buy an item, you can let Reheaven calculate it from their coins.

local coins, setCoins = Reheaven.signal(100)

local canBuyItem = Reheaven.computed(function()
return coins() >= 50
end)

Reading a Computed

Read a computed value by calling it like a function:

print(canBuyItem()) -- true

If the coins change, the computed value can change too:

setCoins(25)

print(canBuyItem()) -- false

Why Use Computed?

Without computed, you might write code like this:

local coins = 100
local canBuyItem = coins >= 50

coins = 25
canBuyItem = coins >= 50

That works, but you have to remember to update canBuyItem every time coins changes.

With Reheaven, you describe how the value is calculated once:

local canBuyItem = Reheaven.computed(function()
return coins() >= 50
end)

Now Reheaven handles the rest.

Computeds Do Not Run Until Needed

A computed value waits until you read it.

local count, setCount = Reheaven.signal(10)
local calls = 0

local double = Reheaven.computed(function()
calls += 1
return count() * 2
end)

print(calls) -- 0

print(double()) -- 20
print(calls) -- 1

Computeds Remember Their Value

After a computed runs, Reheaven remembers the result.

If nothing important changed, reading it again does not run the function again.

print(double()) -- 20
print(double()) -- 20
print(calls) -- 1

Updating a Signal

When the signal changes, the computed value updates the next time you read it.

setCount(20)

print(double()) -- 40
print(calls) -- 2

Computed From Computed

A computed value can use another computed value.

local count, setCount = Reheaven.signal(2)

local double = Reheaven.computed(function()
return count() * 2
end)

local quadruple = Reheaven.computed(function()
return double() * 2
end)

print(quadruple()) -- 8

When to Use Computed

Use computed only when the value is derived from other state.

Good examples:

  • health percentage from health and maxHealth
  • whether a player can buy an item from coins
  • total inventory weight from inventory items
  • character power level from stats
  • round status text from round state
  • formatted coins from a number
Do Not Use Computed for Everything

A computed value should not be used just because you want to run code later.

Do NOT use computed for:

  • saving data
  • spawning objects
  • firing remotes
  • playing sounds
  • changing UI directly
  • running side effects
  • replacing normal functions

Computed values should calculate and return a value.

Good use:

local healthPercent = Reheaven.computed(function()
return health() / maxHealth()
end)

Bad use:

local playSound = Reheaven.computed(function()
sound:Play()
end)

Questionable use💀:

local someNumber = Reheaven.computed(function()
return 50
end)
Computed Rule

If the function does something instead of returning a value, it probably should not be a computed.

If it also does not read any signal or computed value, then it is not really deriving reactive state...

Next Steps

Next, learn how effect can automatically run code when the values it reads change.