CabinGame/Luxe/math/observable.wren

47 lines
785 B
Text
Raw Normal View History

2020-08-29 06:14:01 +00:00
import "luxe: events" for Events
class Observable{
static on_change{"on_change"}
value{_value}
value=(v){
_event.emit(Observable.on_change, v)
_value = v
}
value_no_update=(v){_value = v}
events{_event}
static new(value){
var variable = new()
variable.value_no_update = value
return variable
}
construct new(){
_event = Events.new()
}
on_change(fn){
_event.listen(Observable.on_change, fn)
}
on_change(initial, fn){
if(initial){
fn.call(value)
}
on_change(fn)
}
not_on_change(fn){
_event.unlisten(Observable.on_change, fn)
}
on_not_null(fn){
if(value){
fn.call(value)
} else {
_event.once(Observable.on_change, fn)
}
}
}