1.5 KiB
1.5 KiB
ObservableList module
ObservableList lives in explicit module lyng.observable.
Import it first:
import lyng.observable
>>> void
Create from a regular mutable list:
import lyng.observable
val xs = [1,2,3].observable()
assert(xs is ObservableList<Int>)
assertEquals([1,2,3], xs)
>>> void
Hook flow
Event order is:
beforeChange(change)listeners- mutation commit
onChange(change)listenerschanges()flow emission
Rejection is done by throwing in beforeChange.
import lyng.observable
val xs = [1,2].observable()
xs.beforeChange {
throw ChangeRejectionException("no mutation")
}
assertThrows(ChangeRejectionException) { xs += 3 }
assertEquals([1,2], xs)
>>> void
Subscriptions
beforeChange and onChange return Subscription.
Call cancel() to unsubscribe.
import lyng.observable
val xs = [1].observable()
var hits = 0
val sub = xs.onChange { hits++ }
xs += 2
sub.cancel()
xs += 3
assertEquals(1, hits)
>>> void
Change events
changes() returns Flow<ListChange<T>> with concrete event classes:
-
ListInsert -
ListSet -
ListRemove -
ListClear -
ListReorderimport lyng.observable val xs = [10,20].observable() val it = xs.changes().iterator() xs[1] = 200 val ev = it.next() assert(ev is ListSet) assertEquals(20, (ev as ListSet).oldValue) assertEquals(200, ev.newValue) it.cancelIteration()
void