CabinGame/Luxe/math/observable.wren

68 lines
1.3 KiB
Text
Raw Normal View History

2020-10-04 16:35:12 +00:00
import "math/event" for Event, MultiListenerToken
import "math/util" for Util
2020-08-29 06:14:01 +00:00
class Observable{
value{_value}
value=(v){
2020-09-18 16:48:07 +00:00
_event.emit([v]) //do extra list wrapping here to allow list values
2020-08-29 06:14:01 +00:00
_value = v
}
value_no_update=(v){_value = v}
2020-09-13 15:58:22 +00:00
event{_event}
2020-08-29 06:14:01 +00:00
static new(value){
var variable = new()
variable.value_no_update = value
return variable
}
construct new(){
2020-09-13 15:58:22 +00:00
_event = Event.new()
2020-08-29 06:14:01 +00:00
}
2020-09-18 16:48:07 +00:00
//manually emit an update
emit(){
_event.emit([_value])
}
2020-08-29 06:14:01 +00:00
on_change(fn){
2020-09-13 15:58:22 +00:00
return _event.listen(fn)
2020-08-29 06:14:01 +00:00
}
on_change(initial, fn){
if(initial){
fn.call(value)
}
2020-09-13 15:58:22 +00:00
return on_change(fn)
2020-08-29 06:14:01 +00:00
}
not_on_change(fn){
2020-09-13 15:58:22 +00:00
_event.unlisten(fn)
2020-08-29 06:14:01 +00:00
}
on_not_null(fn){
if(value){
fn.call(value)
} else {
2020-09-13 15:58:22 +00:00
_event.once(fn)
2020-08-29 06:14:01 +00:00
}
}
2020-10-04 16:35:12 +00:00
static any_change(observables, fn){
var change_method = Fn.new{|whatever|
Util.call_arg_list(fn, observables.map{|observable| observable.value.toList})
}
var tokens = observables.map{|observable|
return observable.on_change(change_method)
}
return MultiListenerToken.new(tokens)
}
static any_change(observables, initial, fn){
if(initial){
Util.call_arg_list(fn, observables.map{|observable|observable.value}.toList)
}
any_change(observables, fn)
}
2020-08-29 06:14:01 +00:00
}