Currently we can implement things like "reactive variables" and
"reactive computations". Contrived example:

```js
import {rv, computation} from './reactive-variable'

const count = rv(0)

// read the value
console.log(count()) // 0

// set the value
count(1)
console.log(count()) // 1

// increment it every second
setInterval(() => count(count() + 1), 1000)

// logs the value initially (1), and any time it is updated by the
interval after that.
computation(() => {
  console.log(count())
})
```

And we can do neat things like compile JSX to using reactive computations:

```jsx
const div = <div>The count is: {count}</div>
document.body.append(div)
```

and now the div's `textContent` updates every second with the new value.

It'd be neat if we had variable accessors as well as variable decorators.

The above example could become:

```jsx
import {rv, computation} from './reactive-variable'

// The rv variable decorator may implement this using a variable accessor
// We can already do this with class properties/fields when
transpiling class-based decorators
@rv const count = 0

// read the value
console.log(count) // 0

// set the value
count = 1
console.log(count) // 1

// increment it every second
setInterval(() => count++, 1000)

// logs the value initially (1), and any time it is updated by the
interval after that.
computation(() => {
  console.log(count)
})

const div = <div>The count is: {count}</div>
document.body.append(div)
```

variable accessors may look something like

```js
// it is exportable just like regular variables
export let s {
  set(v) {
    console.log('set s:', v * 2)
    // maybe `this` is an engine-builtin object for this specific
variable, that we can use to store stuff on.
    this.s = v * 2
  },
  get() {
    console.log('get s:', this.s)
    return this.s
  },
} = 0
```

A variable decorator would have some way to be able to define a getter/setter.
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to