# Reactivity: Core
## Scopes
Vide code can run in one of two scopes: STABLE or REACTIVE.
- Reactive scopes rerun if a source read within updates.
- Stable scopes never rerun.
- Reactive scopes cannot be created directly within another reactive scope.
- When a scope is destroyed, all scopes created within are also destroyed.
Different functions in Vide's API will run code in different scopes.
:::warning
Yielding is not allowed in any stable or reactive scope. Strict mode will check
for this.
:::
## root() STABLE
Runs a function in a new stable scope.
- **Type**
```luau
function root(fn: (Destructor) -> T...): (Destructor, T...)
type Destructor = () -> ()
```
- **Details**
Returns a destructor and any values returned by the callback.
## source()
Creates a new source.
- **Type**
```luau
function source(value: T): Source
type Source =
() -> T -- get
& (T) -> () -- set
```
- **Details**
Call the returned source with no argument to read its value.
Call the returned source with an argument to set its value.
- **Example**
```luau
local count = source(0)
print(count())-- 0
count(count() + 1)
print(count()) -- 1
```
## effect() REACTIVE
Runs a function in a new reactive scope.
- **Type**
```luau
function effect(fn: () -> ())
```
- **Details**
The function is ran once immediately.
- **Example**
```luau
local count = source(1)
effect(function()
print(count())
end)
-- prints 1
count(2)
-- prints 2
```
## derive() REACTIVE
Runs a function in a new reactive scope to compute a value for new source.
- **Type**
```luau
function derive(fn: () -> T): () -> T
```
- **Details**
Anytime the reactive scope reruns, the output source value is set to what is
returned.
The function is ran once immediately.
- **Example**
```luau
local count = source(0)
local text = derive(function() return `count: {count()}` end)
print(text()) -- "count: 0"
count(1)
print(text()) -- "count: 1"
```
A `derive()` should be used instead of a pure function when you expect it to
be read multiple times between updates, because `derive()` will cache the
result to prevent recomputing it on every read.
::: code-group
```luau [Pure Function]
local count = source(0)
local text = function()
print "ran"
return `count: {count()}`
end
count(1)
print(text()) -- prints "ran" followed by "count: 1"
print(text()) -- prints "ran" followed by "count: 1"
```
```luau [Derived Source]
local count = source(0)
local text = derive(function() -- [!code highlight]
print "ran"
return `count: {count()}`
end) -- [!code highlight]
count(1) -- prints "ran"
print(text()) -- prints "count: 1"
print(text()) -- prints "count: 1"
```
:::