vide/docs/tut/crash-course/4-source.md
2023-09-27 16:44:39 +01:00

46 lines
1.3 KiB
Markdown

# Sources
*Sources* in Vide are special objects that store a single value. They are the
core of reactivity in Vide. Each source represents a source of data, and they
can be composed and derived to create new sources of data.
A source in Vide can be created using `source()`.
```lua
local source = vide.source
local count = source(0)
```
The value passed to `source()` is the initial value of the source.
The value of a source can be set by calling it with an argument, and can be read
by calling it with no arguments.
```lua
count(count() + 1) -- increment count by 1
```
Sources can be *derived* by wrapping them in functions. A wrapped source
effectively becomes a new source.
Derived sources should be pure functions. This is where the same output is
always produced for the same input no matter how many times it is reran.
```lua
local count = source(0)
local text = function()
return "count: " .. tostring(count())
end
print(text()) -- "count: 0"
count(1)
print(text()) -- "count: 1"
```
Sources on their own aren't very special, the above can be achieved with plain
variables. The real use for sources become apparent when used in combination
with Vide's *reactive scopes*. When a source is read from within a reactive
scope, it can automatically rerun the scope that reads it when the source is
updated in the future.